使用SqlCeCommand插入后选择SCOPE_IDENTITY

时间:2016-11-14 17:59:41

标签: c# sql sql-server sql-server-ce

我的程序有在线和离线模式。

  • 在线它使用C#SqlCommand类连接到SQL Server实例。
  • 离线它使用C#.SDF类连接到本地SqlCeCommand文件。

现在我想做以下在线模式下工作

GetSqlCommand("insert into my_table (col1) values (@c1); SELECT SCOPE_IDENTITY()", conn))

所以我插入一条记录,用SELECT SCOPE_IDENTITY()取回该新记录的ID。

但是在使用SQL Server CE的脱机模式下,它会抛出错误。有没有办法从SQL Server CE的插入中获取ID而不运行单独的查询?

3 个答案:

答案 0 :(得分:1)

SQL Server CE在单个命令中不支持多个查询,请尝试如下

SqlCeCommand  cmd = new SqlCeCommand("insert into my_table (col1) values (@c1)", conn);
//set paremeter values 
//execute insert 
cmd.ExecuteNonQuery();
//now change the sql statment to take identity 
cmd.CommandText = "SELECT @@IDENTITY";
int id = Convert.ToInt32(cmd.ExecuteScalar());

https://stackoverflow.com/a/6480017/2558060

答案 1 :(得分:0)

虽然Damith回答是对的,但是我们无法使用SQL Server CE运行多个查询。

我以相同的代码举例说明。

    SqlCeCommand  cmd = new SqlCeCommand("insert into my_table (col1) values (@c1)", conn);
    //set paremeter values 
    //execute insert 
    cmd.ExecuteNonQuery();
    //now change the sql statment to take identity 
    ////////////////**CONNECTION SHOULD NOT BE CLOSED BETWEEN TWO COMMANDS**/////
    cmd.CommandText = "SELECT @@IDENTITY";
    int id = Convert.ToInt32(cmd.ExecuteScalar());

注意:连接应该在两个命令之间打开,否则第二个查询将失败。

最好在Transaction中使用此代码。

注意:SQL Server CE对象不是线程安全的,如果跨线程共享SqlCeConnectionSqlCeTransaction的实例,则可能导致访问冲突异常。建议每个线程应使用单独的连接,不应跨多个线程共享。

答案 2 :(得分:0)

我认为这是你的答案: How do I use an INSERT statement's OUTPUT clause to get the identity value?但我不确定SQL CE ..试一试。

修改 那么这个答案可能是正确的:Inserting into SQL Server CE database file and return inserted id