首页 新闻 会员 周边

关于SQL参数化的问题

0
悬赏园豆:15 [已解决问题] 解决于 2013-03-16 17:28


 

 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就出错,我使用了如上的代码解决了,不知道还有没有其它好的办法?

C#
happydaily的主页 happydaily | 菜鸟二级 | 园豆:301
提问于:2013-03-03 17:20
< >
分享
最佳答案
0

你把参数做成可空就好了。SQLHELPER中用public static DataTable ExecuteDataTable(string sql,
            params SqlParameter[] parameters)这样应该就没问题了。加params

收获园豆:15
DZCMS | 初学一级 |园豆:5 | 2013-03-03 21:59
其他回答(4)
0

你这代码也太繁杂了吧,

伏草惟存 | 园豆:1420 (小虾三级) | 2013-03-03 22:16

正是繁杂才想要改变它

支持(0) 反对(0) happydaily | 园豆:301 (菜鸟二级) | 2013-03-04 08:58
0

这样的写法可读性不高

jerry-Tom | 园豆:4077 (老鸟四级) | 2013-03-04 10:23

我也知道不高,我要解决办法呢?

支持(0) 反对(0) happydaily | 园豆:301 (菜鸟二级) | 2013-03-04 15:41
0

创建一个实体类,存放所有要传入的参数,以你的例子来说就是

//实体类
    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)
                  //...
                }
        }

调用方法的时候传入这个实体类的实例,所有值都赋值给实体类的对应属性。没有赋值的属性,会在类实例化的时候自动赋值默认值的。

林J | 园豆:202 (菜鸟二级) | 2013-03-05 13:16

这可行吗?除非构造函数里把值初始化吧?

支持(0) 反对(0) happydaily | 园豆:301 (菜鸟二级) | 2013-03-07 15:54

@happydaily: 关构造函数什么事情,你自己写的是个方法,你这方法的写法本身就有问题,这个方法是public的,但是它内部用的那么多变量全是private的,像ProjectId、ChargeDate这些都是你方法所在类的内部变量吧。你要做的就是把这些变量提取出来,在方法外面赋值给上面的那个实体类,然后把实体类的实例当变量传入方法。

支持(0) 反对(0) 林J | 园豆:202 (菜鸟二级) | 2013-03-07 16:07
0

程序的 DBNull.Value 对应到 数据库 NULL

geass.. | 园豆:1821 (小虾三级) | 2013-03-11 11:58
清除回答草稿
   您需要登录以后才能回答,未注册用户请先注册