当前位置: 首页 > 面试题库 >

T-SQL:将新的INSERT身份返回给C#

屈翰飞
2023-03-14
问题内容

我正在使用存储过程将值放入SQL Server。该过程将向添加的行添加一个ID。我需要将此ID恢复到我的代码中。

目前,我可以在Visual Studio的OUTPUT窗口中看到输出ID,但似乎无法在我的代码中捕获它。这是proc的摘要版本:

SQL

CREATE PROCEDURE dbo.DoSomething
(
    @var1 INT = NULL,
    @var2 INT = NULL,
    @var3 DATE = NULL
)
AS

BEGIN

    INSERT INTO atable
    (
        vara,
        varb,
        varc
    )
    VALUES
    (
        @var1,
        @var2,
        @var3
    )

    RETURN SCOPE_IDENTITY()

END

C#:

int result = 0;

/// create command
SqlCommand cmd = new SqlCommand("DoSomething", this.OpenSqlConnection());
cmd.CommandType = CommandType.StoredProcedure;
cmd.Parameters.AddWithValue("@var1", thing.value1);
cmd.Parameters.AddWithValue("@var2", thing.value2);
cmd.Parameters.AddWithValue("@var3", thing.value3);


/// send data to db
result = (int)cmd.ExecuteScalar();

所以我收到一个错误: 对象引用未设置为对象的实例。 当它到达(int)cmd.ExecuteScalar()时。

有任何想法吗?


问题答案:
...
SELECT SCOPE_IDENTITY()

RETURN值实际上作为特殊的OUTPUT参数返回。SELECT给出ExecuteScalar的结果集。

您也可以使用OUTPUT子句代替单独的SELECT:

...
AS
BEGIN
    INSERT INTO atable
    (
        vara,
        varb,
        varc
    )
    OUTPUT INSERTED.IDCol
    VALUES
    (
        @var1,
        @var2,
        @var3
    )
END
GO

这也适用于多行。



 类似资料:
  • 在 T-SQL 中,INSERT 语句用于向表中添加新行。 INSERT INTO SELECT 需要源中的数据类型,目标匹配表。 表中的现有记录不受 INSERT 语句的影响。 语法: 以下是 的两种语法。 第一种语法: 其中 是表中的列名。 当为列添加值时,无法在 SQL 查询中指定列名。值的顺序与下面指定的顺序相同。 INSERT 语句的语法,第二种语法如下: 例子: 以下语句将在 CUST

  • 问题内容: 这是场景。有问题的列称为“ datein”,其类型为“ datetime”。我有三行,“ datein”的值为“ 2009-10-01 00:00:00.000”。为什么此查询返回上述行? 使用 返回相同的结果 问题答案: 千分之一秒的精度不足。尝试使用“ .997”。 MSDN DateTime文档 运行此命令,您将看到:

  • 问题内容: 我遇到的情况是,我经常需要从具有唯一约束的表中获取行,如果不存在,则创建它并返回。例如,我的表可能是: 它包含: 然后,我想: 也许: 并返回bob的id 。但是,仅返回插入或更新的行。因此,在上面的示例中,它不会返回任何内容。为了使它发挥所需的功能,我实际上需要: 这似乎很麻烦。我想我的问题是: 不允许(我的)期望行为的原因是什么? 有没有更优雅的方法可以做到这一点? 问题答案: 这

  • 我正在尝试在反应式Spring Boot应用程序中配置Spring Security性,并包括依赖于新的Spring Security版本5.0.0的父项目。RC1: 我将我的Spring WebSecurity配置为使用自定义AuthenticationFilter来检索我的身份验证信息,以及使用我自己的提供者的自定义AuthenticationManager。 配置: ReactiveAuth

  • 我有一个Keycloak Cordova本地应用程序,一旦启动,就会正确显示Keycloak的用户名/密码表单,但在成功验证后,当试图重定向到该应用程序时,会显示err_connection_rejection。重定向当前设置为“http://localhost”。 我使用了这个例子https://github.com/keycloak/keycloak/tree/master/examples/

  • 问题内容: 好的,我有一个非常简单的mysql数据库,但是当我尝试通过mysql-admin运行此查询时,出现奇怪的错误 INSERT INTO自定义报告(研究,类型,模式,选择,描述)VALUES(‘1’,‘2’,‘3’,‘4’,‘5’); 错误: 1064-您的SQL语法有误;检查与您的MySQL服务器版本相对应的手册以获取正确的语法,以便在“选择,描述” VALUES(“ 1”,“ 2”,“