目的:让参数传递支持多种数据库
这是我的解决办法:
public static int ExecuteNonQuery(string strSql, Hashtable paramHt)
{
using (conn = GetConn()) //通过配置文件创建了对应的连接对象
{
using (cmd = GetCmd(conn, strSql,CommandType.Text)) //同上
{
try
{
PrepareCommand(cmd, paramHt); //foreach参数,通过HashTable传递
int rows = cmd.ExecuteNonQuery();
cmd.Parameters.Clear();
return rows;
}
catch (Exception E)
{
ThrowErrorMsgAddLog("ExecuteNonQueryParams", strSql, E.Message);
return 0;
}
}
}
}
private static void PrepareCommand(IDbCommand cmd, Hashtable paramHt)
{
if (paramHt != null)
{
foreach (DictionaryEntry deTemp in paramHt)
{
DbParameter param = (DbParameter)cmd.CreateParameter(); //强转为DbParameter
param.ParameterName = deTemp.Key.ToString(); //获取参数名
param.Value = deTemp.Value; //获取参数值,MSDN:Parameter 对象的 Value 属性值会自动推断出 Parameter 的数据提供程序“类型”。
cmd.Parameters.Add(param); //添加到cmd
}
}
}
使用:
Hashtable ht = new Hashtable();
strSql = "insert into demo(title,contents,addname,adddate) values(@title,@contents,@addname,@adddate)";
ht.Add("@title", "ptitle");
ht.Add("@contents", "ptitle");
ht.Add("@adddate", DateTime.Now);//识别为DbType.DateTime
ht.Add("@addname", "pname");
ht.Add("@flag", 1);//识别为int32
if (ASHelper.ExecuteNonQuery(strSql, ht) > 0){......}
问题:
sqlserver:title(nvarchar(255)),contents(nvarchar(MAX)),adddate(datetime),addname(nvarchar(255)),flag(int)
access:title(文本),contents(备注),adddate(日期/时间),addname(文本),flag(数字)
如果是sqlserver数据库的话上面代码没有问题,Access数据库的话"标准表达式中数据类型不匹配",试了把@adddate,@flag去掉则成功.调试时它却时给@adddate,@flag自动加了datetime,int32类型.但是还是会报错.
忘那位能解决??
DateTime.Now.ToString(),Access的日期必须采用字符串形式。
access数据库不能使用hasttable,因为它是无序的,遍历时不是按照添加的顺序输出,应该使用dictionary,Dictionary<string,string>