首页 新闻 会员 周边 捐助

DbParameter支持多种数据库参数问题

0
悬赏园豆:100 [已关闭问题] 关闭于 2008-10-08 15:44

目的:让参数传递支持多种数据库

这是我的解决办法:

         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类型.但是还是会报错.

忘那位能解决??

Astar的主页 Astar | 高人七级 | 园豆:40805
提问于:2008-10-05 17:07
< >
分享
所有回答(2)
0

DateTime.Now.ToString(),Access的日期必须采用字符串形式。

麦舒 | 园豆:452 (菜鸟二级) | 2008-10-05 18:34
0

access数据库不能使用hasttable,因为它是无序的,遍历时不是按照添加的顺序输出,应该使用dictionary,Dictionary<string,string>

智伟 | 园豆:266 (菜鸟二级) | 2012-07-05 14:00
清除回答草稿
   您需要登录以后才能回答,未注册用户请先注册