现在的位置: 首页 > 综合 > 正文

彻底研究SQLHelper(非存储过程)

2012年05月23日 ⁄ 综合 ⁄ 共 3190字 ⁄ 字号 评论关闭

081229

参数名可以用[j.id]以区别

  1. DBHelper.GetParameter("@id",SqlDbType.Int,4,"[j.id]",id)//多个逗号也没错, 

1.SqlParameter的用法

两种构造函数:

SqlParameter param = new SqlParameter(paramName, paramType, paramSize, ColName);

SqlParameter param = new SqlParameter(paramName, paramType);
param.Value = paramValue;

上面一种是对应数据表中的列的。暂时总结几种用法:

public static SqlParameter GetParameter(String paramName, SqlDbType paramType, Int32 paramSize, String ColName, Object paramValue)
        {
            SqlParameter param = new SqlParameter(paramName, paramType, paramSize, ColName);
            param.Value = paramValue;
            return param;
        }

 

DBHelper.GetParameter("@gid", SqlDbType.Int, 4, "[gid]", gid)

当多表查询时,参数有相同时,可以直接在构造函数里区分。

public DataTable getlist(int ocheck,string uid)
    {
        StringBuilder sb = new StringBuilder();
        sb.Append("select oid,a.gid gid,b.gname gname,a.onum onum,a.summary summary,b.gspec gspec from t_TakeOut_Temp a,t_Goods b where a.gid=b.gid and ocheck=@ocheck and a.uid=@uid");

        SqlParameter[] param =
                                    {
                                        DBHelper.GetParameter("@ocheck",SqlDbType.Int,4,"[ocheck]",ocheck),
                                        DBHelper.GetParameter("@uid",SqlDbType.VarChar,50,"a.[uid]",uid)//这里用a.[uid]
                                    };
        return DBHelper.ExecuteDt(sb.ToString(), param);
    }

现在并不十分明白原理,只是会用。

2.与单值的技巧。

  1. /// <summary>
  2.     /// 根据人员编号取得人员名称
  3.     /// </summary>
  4.     /// <param name="rydm"></param>
  5.     /// <returns></returns>
  6.     public string getrymc(string rydm)
  7.     {
  8.         DataTable dt = getUser(rydm);
  9.         return dt.Rows[0]["rymc"].ToString();
  10.     }
  11.     /// <summary>
  12.     /// 根据人员编号查询
  13.     /// </summary>
  14.     /// <param name="rydm"></param>
  15.     /// <returns></returns>
  16.     public DataTable getUser(string rydm)
  17.     {
  18.         StringBuilder sb = new StringBuilder();
  19.         sb.Append("select * ");
  20.         sb.Append("from p_rydm where [rydm]=@rydm");
  21.         SqlParameter[] param = { DBHelper.GetParameter("@rydm", SqlDbType.VarChar, 50, "[rydm]", rydm) };
  22.         return DBHelper.ExecuteDt(sb.ToString(), param);
  23.     }

首先,写一个取DataTable的方法,以后取哪个单值,就直接调用dt.Rows[0]["字段名"].ToString()

  1. DataTable table = DBHelper.ExecuteDt(sb.ToString());
  2.         if (table.Rows.Count > 0)
  3.         {
  4.             if (table.Rows[0]["sid"].ToString() != "")
  5.                 return table.Rows[0]["sid"].ToString();
  6.             else
  7.                 return "1001";
  8.         }
  9.         else
  10.         {
  11.             return "0";
  12.         }

这里Rows.Count判断是必要的,另外有可能返回空字符,所以也有必要判断是否是""

3.DBHelper.ExecuteDt()有两种重载:

执行带参数或不带参数的sql语句。

4.最常用的语句,不用有半点模糊。

查select [gname],[gspec] from goods where [gid]=@[gid] and [oid]=@oid

改update goods set [gname]=@gname,[gspec]=@gspec where [gid]=@gid

删delete from goods where [gid]=@gid

增insert into goods ([gname],[gspec]) values (@gname,@gspec)

5.用到的方法积累

sb.Append("update t_Goods set [storage]=[storage]-@num where [gid]=@gid");

DBHelper.GetParameter("@num",SqlDbType.Int,4,"[num]",num)

这里[num]并不是数据表中对应字段,即@num并不需要对应列名,

可是没有不带对应列名的构造函数,我只好加了个对应列。

奇怪的是,SqlParameter不对应列的构造函数,居然连长度也没有了。

似乎不写长度也行,有默认值,有时间试一试。

5.2

select distinct sid from storein where sdate between @start and @end

6.DBHelper.ExecuteSql(sb.ToString(), param);

这个方法没有不带参数的重载,有时间自己写一下。

现在解决方法是随便加一个参数,但不使用这个参数。

7.除了查找用ExecuteDt()增删改均用ExecuteSql()

另外,自己写的ExecuteDs()及批量执行Sql的方法ExecuteSqls(),以后研究,暂时不用。

那两个方法已经够用。

end

【上篇】
【下篇】

抱歉!评论已关闭.