我想实现这样的功能:asp.net页面上有个按钮,点击后能使用事务处理自动插入多条数据库记录。我使用参数化语句,代码如下:Hashtable ht = new Hashtable(); //创建一个Hashtable实例
            for (int i = 0; i < Month; i++)
            {
                string sy = "insert into ht_ysk(htbh,ysrq,ysje,czy,addtime) values(@htbh,@ysrq,@ysje,@czy,@addtime)";
                var pay = new List<DbParameter>()
                {
                    du.CreateDbParameter("@htbh",_htbh),
                    du.CreateDbParameter("@ysrq",d1.AddMonths(i)),
                    du.CreateDbParameter("@ysje",_yzj),
                    du.CreateDbParameter("@czy",_czy),
                    du.CreateDbParameter("@addtime",DateTime.Now)
                };
                ht.Add(sy, pay);
            }
            string cjg = du.ExecuteSqlTran(ht);
            if (cjg == "ok")
            {
                Response.Write("<script>alert('批量添加成功!');location.href ='ht_ysk_list.aspx?id=" + _htbh + "';</script>");
                Response.End();
            }
            else
            {
                Response.Write("<script>alert('执行失败。" + cjg + "');location.href ='ht_ysk_list.aspx?id=" + _htbh + "';</script>");
                Response.End();
            }
执行后报告错误:已添加项。字典中的关键字:“insert into ht_ysk(htbh,ysrq,ysje,czy,addtime) values(@htbh,@ysrq,@ysje,@czy,@addtime)”所添加的关键字:“insert into ht_ysk(htbh,ysrq,ysje,czy,addtime) values(@htbh,@ysrq,@ysje,@czy,@addtime)”如何解决?

解决方案 »

  1.   

    string sy作为key每次都是一样的,当然哈希表会抛出错误。
    其实你的需求跟哈希表没有关系。用错数据容器了。
    用类似List<MyCommand>就可以了,MyCommand也可以是Tuple<string, List<DbParameter>>等等。
    struct MyCommand
    {
       public string Cmd;
       public List<DbParameter> Parameters;
    }
      

  2.   

    你的key明显是相同的,这个时候不应该用哈希表来存储,只要需要唯一值判定的集合都不可以的。如:
    Dictionary;HashMap。不过你可以这样写,将你这块代码封装成对象
    string sy = "insert into ht_ysk(htbh,ysrq,ysje,czy,addtime) values(@htbh,@ysrq,@ysje,@czy,@addtime)";
                    var pay = new List<DbParameter>()
                    {
                        du.CreateDbParameter("@htbh",_htbh),
                        du.CreateDbParameter("@ysrq",d1.AddMonths(i)),
                        du.CreateDbParameter("@ysje",_yzj),
                        du.CreateDbParameter("@czy",_czy),
                        du.CreateDbParameter("@addtime",DateTime.Now)
                    };
    然后存储到List<T>里面。
    或者你使用楼上所说的Tuple,不过这个Tuple必须是.NET 4.0的框架下才支持