首页 新闻 会员 周边 捐助

Sql server 问题?

0
悬赏园豆:20 [已解决问题] 解决于 2012-12-10 16:03

代码如下,

主要就是,意思是先差标的一列的最大值,然后把这个最大值+1,然后在构造sql语句插入数据,两个sql语句是在事务中完成,但是多个客户端同事,调用这段代码是,MaxBoxIndex这个会出现重复,怎么解决啊,有什么好方法不?

   for (int i = 0; i < list.Count; i++)
                {
                    model = (Model.tbCustBoxInfo)list[i];
                    string strCCGC = @"insert into dbo.tbCustBoxInfo(OrderType,OrderID,CustID,BoxCode,WholeBox,Proline,Sorter,BoxIndex,SortTime)
                                               values('{0}','{1}','{2}','{3}','{4}','{5}','{6}','{7}',GetDate())";
                    strSQL = string.Format(strCCGC,model.OrderType, model.OrderID, model.CustID, model.BoxCode, model.WholeBox, model.ProLine, model.Sorter, GetMaxID(model.OrderID));
                    SQL_List.Add(strSQL);
                }
                using (IDatabase database = DatabaseFactory.CreateDatabase("DbConnStr"))
                {
                    database.ExecuteNonQuery(SQL_List, true);//true 表示开事务
                    return true;
                }

 

 public int GetMaxID(string OrderID)
        {
            string strSQL=@"select isNull(Max(BoxIndex),0)+1 as MaxBoxIndex from tbCustBoxInfo where OrderID=@OrderID";
            DataTable dtable = new DataTable();
            int iMaxID = 1;
            using (IDatabase database = DatabaseFactory.CreateDatabase("DbConnStr"))
            {
                using(ICommand cmd = database.CreateCommand(strSQL))
                {
                    cmd.AddInParameter("@OrderID",OrderID);
                    dtable = database.ExecuteDataTable(cmd);
                }
            }
            if (dtable != null && dtable.Rows.Count > 0)
            {
                try
                {
                    iMaxID = Convert.ToInt16(dtable.Rows[0][0].ToString());
                }
                catch (Exception ex)
                {
                    iMaxID = 1;
                }
            }
            return iMaxID;
        }

夜星冷的主页 夜星冷 | 初学一级 | 园豆:71
提问于:2012-11-02 13:59
< >
分享
最佳答案
0

不行就加入一个lock吧,或者你定义一个静态的字段在内存中,insert进去的是就用这个字段,用完一下+1 记住对它的操作都要lock

收获园豆:4
chenping2008 | 大侠五级 |园豆:9836 | 2012-11-02 14:08

这个代码是放在多个客户段执行,winfom程序,几天电脑一起操作的,怎么lock啊,内存变量也不行噶

夜星冷 | 园豆:71 (初学一级) | 2012-11-02 14:10

@夜星冷: 你有服务器端吗?难道就是客户端+数据的形式?

chenping2008 | 园豆:9836 (大侠五级) | 2012-11-02 14:13

没服务端,因为只有这么一个模块是多客户端操作的,再说这个也是别人开发的,我现在维护呢

夜星冷 | 园豆:71 (初学一级) | 2012-11-02 14:21

@夜星冷: 你这样的话,还不如让boxindex这个字段自增算了

chenping2008 | 园豆:9836 (大侠五级) | 2012-11-02 14:28
其他回答(4)
0

   意思比较模糊,可能需要加锁

收获园豆:4
know-more | 园豆:106 (初学一级) | 2012-11-02 14:22
0

插入之前判断一下当前值和数据库中现有最大值。当然这不是好的方法,好的方法应该是让这个字段自增长

收获园豆:4
田林九村 | 园豆:2367 (老鸟四级) | 2012-11-02 14:24

能自增长,当然是最好,我是没想到可行,那一列 不是唯一的,是更具自己的单号而自动增长

支持(0) 反对(0) 夜星冷 | 园豆:71 (初学一级) | 2012-11-02 14:31
0

list 里是不是有重复的数据!如果没有。。在插入的时候加入Lock锁。Lock会自动解锁。。如果数据在多的情况下。。建议加事务。不管有多少个客户端。。数据只能一条一条的插入。。建议你看看分布式编程、、

收获园豆:4
在 水 一 方 | 园豆:1097 (小虾三级) | 2012-11-02 14:37
0

Insert语句中你知道使用GetDate() 那为什么不直接把select isNull(Max(BoxIndex),0)+1 as MaxBoxIndex from tbCustBoxInfo whereOrderID=@OrderID  放到insert里面去

收获园豆:4
John29 | 园豆:825 (小虾三级) | 2012-11-20 13:15
清除回答草稿
   您需要登录以后才能回答,未注册用户请先注册