如何在还没更新数据库前取得将要使用的用作标识的id的值(sqlsever) rt 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 如果是自增列,你可以用max函数呀,呵呵.但是如果考虑并发的话就需要一些技巧了,嘿嘿. max的话,自增值不为1该怎么办 提得问题有点问题,换个思路行不?=================================按<ado.net技术内幕>中的介绍,这个问题可以这样来解决,DataColumn dc = dt.Columns["id"];//这一列对应的数据库中的表字段是自增列,在内存DataTable中进行批输入更新时不能马上得到新输入的上一条记录的主键,所以建立临时唯一主键如下:dc.AutoIncrement = true;//设置该列为自增长,dc.AutoIncrementSeed = -1;//新增列的初始值。dc.AutoIncrementStep = -1;//列的值自动递增的数值。默认为 1。这样你添加第一条新增数据的时候临时主键为-1,第二条为-2,...在使用DataAdapter.Update(dt);进行更新的时候,如果数据源是Sql Server那使用存储过程输出参数把自增主键输出会自动更新新增的DataRow,比如上面的-1,-2,-3等自动会更新成实际数据库中的自增主键值。这种方式具体可以看我的一片文章,http://blog.csdn.net/zhzuo/archive/2004/08/06/67037.aspx如果是Access或其他数据库就有点麻烦,回填实现如下:注册DataAdapter.RowUpdated事件。da.RowUpdated += new OleDbRowUpdatedEventHandler(da_RowUpdated);事件处理程序,private static void da_RowUpdated(object sender, OleDbRowUpdatedEventArgs e) { if(e.Status == UpdateStatus.Continue && e.StatementType = StatementType.Insert) { OleDbConnection conn = new OleDbConnection("连接字符串"); OleDbCommand comm = new OleDbCommand("SELECT @@IDENTITY",conn); conn.Open(); e.Row["id"] = (int)comm.ExecuteScalar();//得到最新递增值更新到内存DataTable中刚更新的DataRow. e.Row.AcceptChanges(); conn.Close(); } }//处理程序中的每次生成conn,和comm没有必要,你可以只初始化一次,这里这么写只是为了说明过程,而且也没有必要多次打开或关闭连接。 ms-help://MS.VSCC.2003/MS.MSDNQTR.2003FEB.2052/cpguide/html/cpconretrievingidentityorautonumbervalues.htm 100分求一段ADSL宽带全自动断线重拨的源码,不是源码也行。。 - -! C#怎样加速文件读取 c# 打包数据库文件 是不是一定要安装sql server 分不多,求一思路。多谢。 在winfrom程序如何与windows服务进行消息传递??? 关于List<T>的问题 在一个字符串后写{0}" 关于传送序列化类的问题,急!!!!!!!!!!!!!!! Socket仿WCF通信 .net下写的COM+怎么在XP下无法注册?该怎么办? 公司要我把c的程序移植到c#上面,头痛! 在C#中如何运行以下命令!!
=================================
按<ado.net技术内幕>中的介绍,这个问题可以这样来解决,
DataColumn dc = dt.Columns["id"];//这一列对应的数据库中的表字段是自增列,
在内存DataTable中进行批输入更新时不能马上得到新输入的上一条记录的主键,
所以建立临时唯一主键如下:
dc.AutoIncrement = true;//设置该列为自增长,
dc.AutoIncrementSeed = -1;//新增列的初始值。
dc.AutoIncrementStep = -1;//列的值自动递增的数值。默认为 1。
这样你添加第一条新增数据的时候临时主键为-1,
第二条为-2,
...
在使用DataAdapter.Update(dt);进行更新的时候,
如果数据源是Sql Server那使用存储过程输出参数把自增主键输出会自动更新新增的DataRow,
比如上面的-1,-2,-3等自动会更新成实际数据库中的自增主键值。
这种方式具体可以看我的一片文章,
http://blog.csdn.net/zhzuo/archive/2004/08/06/67037.aspx
如果是Access或其他数据库就有点麻烦,回填实现如下:
注册DataAdapter.RowUpdated事件。
da.RowUpdated += new OleDbRowUpdatedEventHandler(da_RowUpdated);
事件处理程序,
private static void da_RowUpdated(object sender, OleDbRowUpdatedEventArgs e)
{
if(e.Status == UpdateStatus.Continue && e.StatementType = StatementType.Insert)
{
OleDbConnection conn = new OleDbConnection("连接字符串");
OleDbCommand comm = new OleDbCommand("SELECT @@IDENTITY",conn);
conn.Open();
e.Row["id"] = (int)comm.ExecuteScalar();//得到最新递增值更新到内存DataTable中刚更新的DataRow.
e.Row.AcceptChanges();
conn.Close();
}
}
//处理程序中的每次生成conn,和comm没有必要,你可以只初始化一次,这里这么写只是为了说明过程,而且也没有必要多次打开或关闭连接。