正在插入SQL Server CE数据库文件并返回插入的id

本文关键字:插入 返回 文件 id CE SQL Server 数据库 | 更新日期: 2023-09-27 18:23:53

问题是:

我的查询

INSERT INTO TableName(val1,val2)values(1,2);
SELECT @@IDENTITY;

当我在服务器资源管理器的运行查询中运行它时,我得到了正确的结果。

但是当我使用ExecuteScalarExecuteDataTable时,我会得到一个错误,。。。查询返回空

public object ExecuteScalre(string Query, CommandType type) 
{ 
    OpenConnection(); 
    cmd.CommandText = Query; 
    cmd.CommandType = type; 
    object obj = null; 
    try 
    { 
        obj = cmd.ExecuteScalar(); 
    } 
    catch 
    { 
    } 
    finally 
    { 
        ReleaseResource(); 
    } 
    return obj; 
} 
public DataTable ExecuteDataTable(string Query, CommandType type)
{
    OpenConnection();
    cmd.CommandText = Query;
    cmd.CommandType = type;
    DataTable dt = new DataTable();
    dataAdaptor = new SqlCeDataAdapter(cmd);
    try
    {
        dataAdaptor.Fill(dt);
    }
    catch
    {
    }
    finally
    {
        ReleaseResource();
    }
    return dt;
}

注意:它是一个.sdf文件(SQL Server CE),NOT.mdf,所以我们不能使用存储过程

正在插入SQL Server CE数据库文件并返回插入的id

Sql Server Compact Edition不支持在一个查询中使用多个语句
该数据库(通常)在单用户场景中使用,因此您可以拆分命令并向数据库发送两个查询,第一个插入记录,第二个返回@@IDENTITY值。

    cmd = new SqlCeCommand("INSERT INTO TableName(val1,val2)values(1,2)", cn);
    cmd.ExecuteNonQuery();
    cmd.CommandText = "SELECT @@IDENTITY";
    int result = Convert.ToInt32(cmd.ExecuteScalar());
这是因为您在一个Command对象中提交了两个sql命令。INSERT语句没有返回任何内容,这是正确的行为
使用TSQL的OUTPUT-子句。这将把插入或删除的行中的值作为记录集提供给您。因此,您可以使用ExecuteScalar来获取此值。

假设您有一个具有以下结构的表

CREATE TABLE [dbo].[Table_1]  
([ID] [int] IDENTITY(1,1) NOT NULL,  
[Value1] [int] NOT NULL,  
[Value2] [int] NULL ) ON [PRIMARY]

使用下面的SQL可以为您提供作为结果集插入的行的ID

插入表_1 OUTPUT插入ID值(1,2)