首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >问答首页 >@@IDENTITY在SQL Compact Edition的事务中时返回NULL

@@IDENTITY在SQL Compact Edition的事务中时返回NULL
EN

Stack Overflow用户
提问于 2013-01-10 03:04:44
回答 2查看 3.2K关注 0票数 2

我有一个SQL Server Compact Edition数据库,其中有一个表,其中包含3列:IdField1Field2IdIDENTITY(1,1) NOT NULL

代码语言:javascript
代码运行次数:0
运行
复制
const string SQL_INSERT = @"INSERT INTO Table(Field1, Field2) VALUES(@Param1, @Param2)";
const string SQL_SELECT_IDENTITY = @"SELECT @@IDENTITY AS ID";
SqlCeConnection cn = null;
SqlCeTransaction tr = null;
SqlCeCommand cm = null;

try
{
   cn = Utility.GetConnection();
   cn.Open();

   tr = cn.BeginTransaction();
   cm = new SqlCeCommand(SQL_INSERT, cn);
   cm.Transaction = tr;
   cm.Parameters.AddWithValue("@Param1", data.Data1);
   cm.Parameters.AddWithValue("@Param2", (int)data.Data2);
   cm.ExecuteNonQuery();

   cm = new SqlCeCommand(SQL_SELECT_IDENTITY, cn);
   object o = cm.ExecuteScalar();
   data.Id = Convert.ToInt32(o);
   // other operations
}

问题是cm.ExecuteScalar()返回null。如果我删除事务,查询将返回适当的值。使用SCOPE_IDENTITY()会失败,因为在SQL Server CE中不支持它。

如何检索插入的标识值?有没有解决这个问题的方法?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2013-01-10 03:25:32

我才意识到原因,身份选择也需要使用事务。

代码语言:javascript
代码运行次数:0
运行
复制
cm = new SqlCeCommand(SQL_SELECT_IDENTITY, cn);
// ADD THE TRANSACTION TO THE COMMAND
cm.Transaction = tr;
// ----------------------------------
object o = cm.ExecuteScalar();
data.Id = Convert.ToInt32(o);
票数 3
EN

Stack Overflow用户

发布于 2013-02-15 09:45:59

它对我起作用的方式是通过替换:

代码语言:javascript
代码运行次数:0
运行
复制
cm = new SqlCeCommand(SQL_SELECT_IDENTITY, cn);
object o = cm.ExecuteScalar();
data.Id = Convert.ToInt32(o);

有了这个:

代码语言:javascript
代码运行次数:0
运行
复制
cm.CommandText = "SELECT @@IDENTITY";
var id = cm.ExecuteScalar();

我还删除了(不需要):

tr = cn.BeginTransaction();cm.Transaction = tr;

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/14244563

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档