2014-09-21 86 views
3

问题是:插入到SQL Server CE数据库文件,并返回插入ID

我查询

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

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

但是当我使用ExecuteScalarExecuteDataTable我得到一个错误,...查询返回NULL

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,所以我们不能使用存储过程

+3

你能显示执行查询的代码吗? – Steve 2014-09-21 20:03:30

+0

公共对象ExecuteScalre(字符串查询,CommandType类型) OpenConnection(); cmd.CommandText =查询; cmd.CommandType = type; object obj = null; 尝试 { obj = cmd.ExecuteScalar(); } 捕获 { } 最后 { ReleaseResource(); } return obj; } 或 – 2014-09-21 20:09:00

+0

@OsamaElfar请注意,您可以编辑您的问题。上面的代码应该通过编辑包含在问题中。 – Dmitry 2014-09-21 20:10:49

回答

6

Sql Server精简版不支持多条语句红霉素。
这个数据库(通常)是在单个用户场景中雇用的,因此您可以拆分命令并向数据库发送两个查询,第一个插入记录,第二个返回@@ 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()); 
+2

重要的部分是连接应该在两个命令之间保持打开 – ErikEJ 2014-09-22 06:25:06

-1

原因是这样的事实,即您在一个Command对象中提交两个sql命令。 INSERT声明确实没有任何回报,这是正确的行为。
使用OUTPUT - 使用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

插入TABLE_1 OUTPUT Inserted.ID值(1 ,2)

+0

如果我们在谈论Sql Server(这种情况下,双语句也可以),但是OP正在使用Sql Server精简版并没有可用的OUTPUT。 – Steve 2014-09-28 20:01:58