【问题标题】:Inserting into SQL Server CE database file and return inserted id插入 SQL Server CE 数据库文件并返回插入的 id
【发布时间】:2014-09-22 12:37:18
【问题描述】:

问题是:

我的查询

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

【问题讨论】:

  • 能否展示执行查询的代码?
  • public object ExecuteScalre(string Query, CommandType type) { OpenConnection(); cmd.CommandText = 查询; cmd.CommandType = 类型;对象 obj = null;尝试 { obj = cmd.ExecuteScalar(); } 赶上 { } 最后 { ReleaseResource(); } 返回对象; } 或
  • @OsamaElfar 请注意,您可以编辑您的问题。上面的代码应该通过编辑包含在问题中。
  • 删除try/catch。并检查异常。创建空的 try/catch 是隐藏代码中错误的有效方法。
  • 这是来自跟踪的错误:解析查询时出错。 [令牌行号=1,令牌行偏移量=103,错误令牌=SELECT]

标签: c# sql-server-ce


【解决方案1】:

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】:

这样做的原因是,您在一个命令对象中提交了两个 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

insert Table_1 OUTPUT Inserted.ID 值 (1,2)

【讨论】:

  • 如果我们谈论的是 Sql Server,这将是真的,(在这种情况下,双语句也可以工作)但是 OP 使用的是 Sql Server Compact Edition,并且没有可用的 OUTPUT。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-09-13
相关资源
最近更新 更多