我有一个SQL Server Compact Edition数据库,其中有一个表,其中包含3列:Id
、Field1
和Field2
。Id
是IDENTITY(1,1) NOT NULL
。
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中不支持它。
如何检索插入的标识值?有没有解决这个问题的方法?
发布于 2013-01-09 19:25:32
我才意识到原因,身份选择也需要使用事务。
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);
发布于 2013-02-15 01:45:59
它对我起作用的方式是通过替换:
cm = new SqlCeCommand(SQL_SELECT_IDENTITY, cn);
object o = cm.ExecuteScalar();
data.Id = Convert.ToInt32(o);
有了这个:
cm.CommandText = "SELECT @@IDENTITY";
var id = cm.ExecuteScalar();
我还删除了(不需要):
tr = cn.BeginTransaction();cm.Transaction = tr;
https://stackoverflow.com/questions/14244563
复制相似问题