zoukankan      html  css  js  c++  java
  • ado.net 参数化传值

     我的思路是这样的,这是一句select语句, string sql = "SELECT TOP 5 EmployeeID, FirstName, LastName,aa FROM Employees where EmployeeID=@EmployID and FirstName like '%'+@FirstName+'%'";

    我要检索出来@EmployID,和@FirstName,开始我用的是字符串提取//string ziduan = sql.Substring(sql.IndexOf("@"), sql.IndexOf(" ") + 1).ToString();

    刚才是没有考虑like语句。后来这样实现不了,我想到了正则表达式,处理字符串很厉害的

    Regex theReg = new Regex(@"([@][a-z|A-Z|u4e00-u9fa5]+)");//这句正则检索写的不怎么好,
    MatchCollection theMatches = theReg.Matches(sql);

    因为这里的参数和参数值是匹配的

    调用语句

     DataTable dt = rwd.ReadSqlDataAdapter(sql,1,"nanc");

    因为这里的参数个数不是固定的,所以我使用的是params,参数的类型也不是固定的,这里我用了object

    #region 检索数据
        /// <summary>
        /// 检索数据
        /// </summary>
        /// <param name="sql">带参数的Sql语句</param>
        /// <param name="values">参数的值</param>
        /// <returns>返回一个表</returns>
        public DataTable ReadSqlDataAdapter(string sql, params object[] values)
        {
            SqlDataAdapter da = new SqlDataAdapter(sql, con);
            Regex theReg = new Regex(@"([@][a-z|A-Z|u4e00-u9fa5]+)");
            MatchCollection theMatches = theReg.Matches(sql);
            for (int i = 0; i < theMatches.Count; i++)
            {
               // da.SelectCommand.Parameters.Add(theMatches[i].ToString(), arr[i], sizeLen[i]).Value = values[i].ToString();
                da.SelectCommand.Parameters.AddWithValue(theMatches[i].ToString(), values[i].ToString());
            }
            DataSet ds = new DataSet();
            da.Fill(ds, "Products");
            return ds.Tables["Products"];

        }
        #endregion

    这里有个问题,我没有去判断传入的类型,大小。AddWithValue这个方法,能按需转化,只要这个字段的值没有强制让数据库适应一个更短的字段或者一个完全不同的数据类型

    后来,我又把参数的大小和类型设进去,可是在调用的时候很繁琐,要制定类型,和参数,多希望能自动生成的

     private SqlDbType[] arr;
     private int[] sizeLen;

    #region 设置参数的类型,和大小
        /// <summary>
        /// 设置参数的类型
        /// </summary>
        /// <param name="sarr">参数的类型</param>
        public void SqlType(params SqlDbType[] sarr)
        {
            arr = new SqlDbType[sarr.Length];
            for (int i = 0; i < sarr.Length; i++)
            {
                arr[i] = sarr[i];
            }
        }
        /// <summary>
        /// 设置参数的大小
        /// </summary>
        /// <param name="sizeLength">参数的值</param>
        public void Size(params int[] sizeLength)
        {
            sizeLen = new Int32[sizeLength.Length];
            for(int i=0;i<sizeLength.Length;i++)
            {
                sizeLen[i] = sizeLength[i];
            }
        }
        #endregion

    还需要把上面的函数改为

    da.SelectCommand.Parameters.Add(theMatches[i].ToString(), arr[i], sizeLen[i]).Value = values[i].ToString();

    调用函数

    rwd.SqlType(SqlDbType.Int, SqlDbType.VarChar);
    rwd.Size(4,10);
    DataTable dt = rwd.ReadSqlDataAdapter(sql,1,"nanc");

    真的感觉这样做很累,还是直接传参好 

  • 相关阅读:
    附近有什么?8款可以查周边的App
    实体店里充话费要怎么弄
    怎样买手机号?
    手机号是SIM卡的号呢,还是买手机时就带的
    网站SSL证书在线检测
    未来什么行业最赚钱
    陈安之-如何选择最赚钱的行业
    斗鱼宣布获C轮15亿融资 直播行业进入资本时代
    2016年Godaddy最新域名转出教程
    GoDaddy账户间域名转移PUSH以及ACCEPT接受域名过户方法
  • 原文地址:https://www.cnblogs.com/gull/p/1874582.html
Copyright © 2011-2022 走看看