当前位置:  开发笔记 > 后端 > 正文

可以使用SqlCommandBuilder检索插入的IDENTITY列值(不使用存储过程)?

如何解决《可以使用SqlCommandBuilder检索插入的IDENTITY列值(不使用存储过程)?》经验,为你挑选了1个好方法。

仅供参考:我在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集合被重置为原始(丢失额外添加的参数).

有谁知道答案???



1> 小智..:

这是我之前遇到的一个问题,当你调用da.Update(ds)时,错误似乎就是这个问题.insert命令的parameters数组将重置为从命令构建器创建的初始列表,它会删除您为标识添加的输出参数.

解决方案是在命令中创建一个新的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, 0, 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);

推荐阅读
小妖694_807
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有