• 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");

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

  • 相关阅读:
    git各种操作:基本操作 and 多人协作 and 冲突解决
    mini-ndn0.5.0 安装教程 (避免踩坑)
    ubuntu18.04 更换镜像源
    自定义日志轮转
    linux常用命令
    Thinkphp6 + uniapp框架,接口访问跨域问题
    机器学习-主成分分析PCA与奇异值分解SVD
    机器学习-数据预处理&特征工程
    机器学习-梯度提升树(xgboost)
    github打不开怎么办
  • 原文地址:https://www.cnblogs.com/gull/p/1874582.html
Copyright © 2020-2023  润新知