2

IdField1およびの 3 つの列を持つテーブルを持つ SQL Server Compact Edition データベースがありますField2Idです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 を返すことです。トランザクションを削除すると、クエリは適切な値を返します。SQL Server CE ではサポートされていないため、単に使用するSCOPE_IDENTITY()と失敗します。

挿入された ID 値を取得するにはどうすればよいですか? この問題を解決するための回避策はありますか?

4

2 に答える 2

3

原因に気付きました。ID 選択もトランザクションを使用する必要があります。

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-01-09T19:25:31.523 に答える
0

それが私のために働いた方法は、次のものを置き換えることです:

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;


于 2013-02-15T01:45:59.243 に答える