C# 插入SQL Server CE数据库文件并返回插入的id

C# 插入SQL Server CE数据库文件并返回插入的id,c#,sql-server-ce,C#,Sql Server Ce,问题是: 我的问题 INSERT INTO TableName(val1,val2)values(1,2); SELECT @@IDENTITY; 当我在服务器资源管理器的运行查询中运行它时,我得到了正确的结果 但是当我使用ExecuteScalar或ExecuteDataTable时,我得到一个错误,。。。查询返回空值 public object ExecuteScalre(string Query, CommandType type) { OpenConnection();

问题是:

我的问题

INSERT INTO TableName(val1,val2)values(1,2);
SELECT @@IDENTITY;
当我在服务器资源管理器的运行查询中运行它时,我得到了正确的结果

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

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),不是
.mdf
,因此我们不能使用存储过程原因是,您在一个命令对象中提交两个SQL命令。
INSERT
语句没有返回任何内容,这是正确的行为。
使用TSQL的
输出
-子句。这会将插入或删除行中的值作为记录集提供给您。因此,您可以使用
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输出插入的.ID值(1,2)


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());

可以显示执行查询的代码吗?公共对象ExecuteScalre(字符串查询,CommandType){OpenConnection();cmd.CommandText=query;cmd.CommandType=type;object obj=null;尝试{obj=cmd.ExecuteScalar();}catch{}最后{ReleaseResource();}返回obj;}or@OsamaElfar请注意,您可以编辑您的问题。上述代码应通过编辑包含在问题中。删除try/catch。并检查异常。创建空的try/catch是隐藏代码中错误的有效方法。这是跟踪中的错误:解析查询时出错。[Token line number=1,Token line offset=103,Token in error=SELECT]重要的一点是,两条命令之间的连接应该保持打开状态。如果我们谈论的是Sql Server,这将是正确的(在这种情况下,double语句也可以工作)但是OP使用的是Sql Server Compact Edition,因此没有可用的输出。