我的思路是这样的,这是一句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");
真的感觉这样做很累,还是直接传参好