代码如下,
主要就是,意思是先差标的一列的最大值,然后把这个最大值+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;
}
不行就加入一个lock吧,或者你定义一个静态的字段在内存中,insert进去的是就用这个字段,用完一下+1 记住对它的操作都要lock
这个代码是放在多个客户段执行,winfom程序,几天电脑一起操作的,怎么lock啊,内存变量也不行噶
@夜星冷: 你有服务器端吗?难道就是客户端+数据的形式?
没服务端,因为只有这么一个模块是多客户端操作的,再说这个也是别人开发的,我现在维护呢
@夜星冷: 你这样的话,还不如让boxindex这个字段自增算了
意思比较模糊,可能需要加锁
插入之前判断一下当前值和数据库中现有最大值。当然这不是好的方法,好的方法应该是让这个字段自增长
能自增长,当然是最好,我是没想到可行,那一列 不是唯一的,是更具自己的单号而自动增长
list 里是不是有重复的数据!如果没有。。在插入的时候加入Lock锁。Lock会自动解锁。。如果数据在多的情况下。。建议加事务。不管有多少个客户端。。数据只能一条一条的插入。。建议你看看分布式编程、、
Insert语句中你知道使用GetDate() 那为什么不直接把select isNull(Max(BoxIndex),0)+1 as MaxBoxIndex from tbCustBoxInfo whereOrderID=@OrderID 放到insert里面去