FYI:我正在运行dotnet 3.5 SP1
我正在尝试在执行更新(使用sqlDataAdapter和sqlCommandBuilder)之后检索一个标识列的值到我的数据集中.
执行sqlDataAdapter.Update(myDataset)后,我想能够读取myDataset.tables(0).Rows(0)(“ID”)的自动分配的值,但它是System.DBNull(尽管事实上该行已插入).
(注意:我不想明确地写一个新的存储过程来做到这一点!)
经常发布的一种方法是:http://forums.asp.net/t/951025.aspx修改sqlDataAdapter.InsertCommand和UpdatedRowSource,如下所示:
sqlDataAdapter.InsertCommand.CommandText += "; SELECT MyTableID = SCOPE_IDENTITY()" InsertCommand.UpdatedRowSource = UpdateRowSource.FirstReturnedRecord
显然,这对过去的许多人来说似乎是有效的,但对我来说并不奏效.
另一种技术:http://forums.microsoft.com/MSDN/ShowPost.aspx?PostID=619031&SiteID=1对我来说不起作用,因为在执行sqlDataAdapter.Update之后,sqlDataAdapter.InsertCommand.Parameters集合将重置为原始(丢失附加的附加参数).
有人知道这个答案吗?
解决方法
这是一个我以前遇到的问题,这个bug似乎是在你打电话时
da.Update(DS);
insert命令的参数数组将重置为从命令构建器创建的初始列表,它将删除您添加的身份的输出参数.
da.Update(DS);
insert命令的参数数组将重置为从命令构建器创建的初始列表,它将删除您添加的身份的输出参数.
解决方案是创建一个新的dataAdapter并复制命令,然后使用这个新的da.update(ds);
喜欢
sqlDataAdapter da = new sqlDataAdapter("select Top 0 " + GetTableSelectList(dt) + "FROM " + tableName,_sqlConnectString); sqlCommandBuilder custCB = new sqlCommandBuilder(da); custCB.QuotePrefix = "["; custCB.QuoteSuffix = "]"; da.TableMappings.Add("Table",dt.TableName); da.UpdateCommand = custCB.GetUpdateCommand(); da.InsertCommand = custCB.GetInsertCommand(); da.DeleteCommand = custCB.GetDeleteCommand(); da.InsertCommand.CommandText = String.Concat(da.InsertCommand.CommandText,"; SELECT ",GetTableSelectList(dt)," From ",tableName," where ",pKeyName,"=SCOPE_IDENTITY()"); sqlParameter identParam = new sqlParameter("@Identity",sqlDbType.BigInt,pKeyName); identParam.Direction = ParameterDirection.Output; da.InsertCommand.Parameters.Add(identParam); da.InsertCommand.UpdatedRowSource = UpdateRowSource.FirstReturnedRecord; //new adaptor for performing the update sqlDataAdapter daAutoNum = new sqlDataAdapter(); daAutoNum.DeleteCommand = da.DeleteCommand; daAutoNum.InsertCommand = da.InsertCommand; daAutoNum.UpdateCommand = da.UpdateCommand; daAutoNum.Update(dt);