public DataTable GetList() { SqlParameter[] para = new SqlParameter[] { new SqlParameter("@ProjectID",SqlDbType.Int,4), new SqlParameter("@ChargeDate",SqlDbType.SmallDateTime,4), new SqlParameter("@AmountCharge",SqlDbType.Decimal,9), new SqlParameter("@FirstPartyOperator",SqlDbType.NVarChar,50), new SqlParameter("@SecondPartyOperator",SqlDbType.NVarChar,50), new SqlParameter("@SignUser",SqlDbType.Int,4), new SqlParameter("@SignDate",SqlDbType.SmallDateTime,4), new SqlParameter("@ChargeRemarks",SqlDbType.NVarChar,500), new SqlParameter("@DelRemarks",SqlDbType.NVarChar,500), new SqlParameter("@IsDel",SqlDbType.Int,4) }; int i = 0; para[i++].Value = ProjectID; para[i++].Value = ChargeDate == DateTime.MinValue ? System.Data.SqlTypes.SqlDateTime.Null : ChargeDate; para[i++].Value = AmountCharge; para[i++].Value = FirstPartyOperator == null ? string.Empty : FirstPartyOperator; para[i++].Value = SecondPartyOperator == null ? string.Empty : SecondPartyOperator; para[i++].Value = SignUser; para[i++].Value = SignDate == DateTime.MinValue ? System.Data.SqlTypes.SqlDateTime.Null : SignDate; para[i++].Value = ChargeRemarks == null ? string.Empty : ChargeRemarks; para[i++].Value = DelRemarks == null ? string.Empty : DelRemarks; para[i++].Value = IsDel; return SqlHelper.ExecuteDataTable(sql, para); }
像上面的代码,有时SQL语句只用到其中几个参数,也就只有部分参数有值,没有赋值的datetime,string就出错,我使用了如上的代码解决了,不知道还有没有其它好的办法?
你把参数做成可空就好了。SQLHELPER中用public static DataTable ExecuteDataTable(string sql,
params SqlParameter[] parameters)这样应该就没问题了。加params
你这代码也太繁杂了吧,
正是繁杂才想要改变它
这样的写法可读性不高
我也知道不高,我要解决办法呢?
创建一个实体类,存放所有要传入的参数,以你的例子来说就是
//实体类 public class Class1 { public int ProjectId { get; set; } public DateTime ChargeDate { get; set; } //... } //方法 public DataTable GetList(Class1 class1) { SqlParameter[] para = new SqlParameter[] { new SqlParameter("@ProjectID", class1.ProjectId), new SqlParameter("@ChargeDate", class1.ChargeDate) //... } }
调用方法的时候传入这个实体类的实例,所有值都赋值给实体类的对应属性。没有赋值的属性,会在类实例化的时候自动赋值默认值的。
这可行吗?除非构造函数里把值初始化吧?
@happydaily: 关构造函数什么事情,你自己写的是个方法,你这方法的写法本身就有问题,这个方法是public的,但是它内部用的那么多变量全是private的,像ProjectId、ChargeDate这些都是你方法所在类的内部变量吧。你要做的就是把这些变量提取出来,在方法外面赋值给上面的那个实体类,然后把实体类的实例当变量传入方法。
程序的 DBNull.Value 对应到 数据库 NULL