【问题标题】:Retrieving SQL Server output variables in c#在 C# 中检索 SQL Server 输出变量
【发布时间】:2012-01-13 10:08:07
【问题描述】:

我有一个存储过程:

ALTER PROCEDURE [dbo].[pr_Tbl_Test_Insert]
    @guidid uniqueidentifier output,
    @sname nvarchar(50)
AS
-- INSERT a new row in the table.
INSERT [dbo].[Tbl_Test]
(
    [id],
    [name]
)
VALUES
(
    ISNULl(@guidid, (newid())),
    @sname
)

我需要 C# 中的 id 并将其放在 c# 中的 output

cmd.Parameters.AddWithValue("@guidid",_id);//_id is SqlGuid

cmd.Parameters.AddWithValue("@sname", "mehdi");

cmd.ExecuteNonQuery();
MessageBox.Show(_id.ToString());

但是消息框显示空值!!

如何返回 id?

我改成:

ALTER PROCEDURE [dbo].[pr_Tbl_Test_Insert] 
  @guidid uniqueidentifier output, 
  @sname nvarchar(50) 
AS 

DECLARE @NewID UNIQUEIDENTIFIER 
SET @NewID = newid(); 

-- INSERT a new row in the table. 
INSERT [dbo].[Tbl_Test]([id], [name]) VALUES(@NewID, @sname); 

SET @guidid = @NewID 

和 C#

SqlParameter outparam = cmd.Parameters.Add("@guidid",SqlDbType.UniqueIdentifier);
outparam.Direction = ParameterDirection.Output;

cmd.Parameters.AddWithValue("@sname", "mehdi");

cmd.ExecuteNonQuery();
MessageBox.Show(_id.Value.ToString());

但它不返回任何东西

【问题讨论】:

  • SP 是否真的设置 @guidid?我很喜欢 ISNULL 命令只返回 newid() 的值,而@guidid 将保留它必须开始的任何值。

标签: c# asp.net sql-server-2008 stored-procedures


【解决方案1】:

我也觉得这很令人沮丧,我无法理解这个问题。虽然很多答案都是正确的,但有一个简单的行经常被我和其他人忽略,即命令需要是存储过程而不仅仅是任何带参数的 sql,所以我希望这会有所帮助:

           cmd.CommandType = CommandType.StoredProcedure;

cmd.Txt 应该如下所示:

           @"my_stored_proct "

不是

           @"my_stored_proct @p1, @p2, @p3 out"

所以把它们放在一起。你可能想把它分成几个方法。并添加 TimeOuts 等。然而,这些是我认为与没有输出参数的其他命令不同的关键部分。

      using (SqlCommand cmd= new SqlCommand())
      {
           cmd.Text= ...;
           cmd.CommandType = CommandType.StoredProcedure;
           SqlParameter outParam = cmd.Parameters.Add("@guidid", SqlDbType.Uniqueidentifier);
           outParam.Direction = ParameterDirection.Output;

           using (var connection = new SqlConnection(this.myConnectionString))
           {
            connection.Open();
            cmd.Connection = connection;

            try
            {
                cmd.ExecuteNonQuery();
            }
            catch
            {
             //    put your sql catches etc. here..
              throw;
            }  
          }  
       var outValue = outParam.Value; 
       //query outValue e.g. ToString()   
       }

【讨论】:

    【解决方案2】:

    首先——如果是OUTPUT参数,你不能在C#中使用.AddWithValue——你需要使用:

    SqlParameter outParam = cmd.Parameters.Add("@guidid", SqlDbType.Uniqueidentifier);
    outParam.Direction = ParameterDirection.Output;
    

    另外,在您的 T-SQL 代码中,您需要将新值分配给输出参数!

    ALTER PROCEDURE [dbo].[pr_Tbl_Test_Insert]
      @guidid uniqueidentifier output,
      @sname nvarchar(50)
    AS
    
    DECLARE @NewID UNIQUEIDENTIFIER
    SET @NewID = newid();
    
    -- INSERT a new row in the table.
    INSERT [dbo].[Tbl_Test]([id], [name]) VALUES(@NewID, @sname);
    
    SET @guidid = @NewID
    

    更新:如果您在 SQL Server Mgmt Studio 中运行它 - 它会显示什么吗??

    DECLARE @insertedID UNIQUEIDENTIFIER
    
    EXEC dbo.pr_Tbl_Test_Insert @guidid = @insertedID OUTPUT,
                                @sname = N'TestUser' -- nvarchar(50)
    
    SELECT @insertedID
    

    在您的 C# 中 - 您必须在调用 ExecuteNonQuery! 后读出输出参数的值!

    SqlParameter outparam = cmd.Parameters.Add("@guidid",SqlDbType.UniqueIdentifier);
    outparam.Direction = ParameterDirection.Output;
    
    cmd.Parameters.AddWithValue("@sname", "mehdi");
    
    cmd.ExecuteNonQuery();
    
    Guid newlyInsertedID = new Guid(cmd.Parameters["@guidid"].Value);
    MessageBox.Show(newlyInsertedID.ToString());
    

    【讨论】:

      【解决方案3】:

      为什么将@guidid uniqueidentifier 输出设置为输出参数?这意味着一旦您执行存储过程,它将覆盖它。如果这是您的意图,那么您需要在插入语句之后添加一条语句,以将输出参数设置为您想要的值。像这样:选择@guidid = @generatedID。是的,看看 marc_s 代码,这就是你应该这样做的方式。

      【讨论】:

        【解决方案4】:

        在执行查询之前,您需要指定参数的方向,在本例中为输出。例如:

        cmd.Parameters.AddWithValue("@guidid",_id);//_id is SqlGuid
        
        cmd.Parameters.AddWithValue("@sname", "mehdi");
        
        cmd.Parameters["@guidid"].Direction = ParameterDirection.Output
        
        cmd.ExecuteNonQuery();
        MessageBox.Show(cmd.Parameters["@guidid"].Value.ToString());
        

        【讨论】:

        • 应该是Parameters["@guidid"](方括号而不是括号)
        • 这听起来很有感染力。当心! ;-P
        【解决方案5】:

        您需要使用可让您指定ParameterDirection 的构造函数之一来构造SqlParameter,例如this one。或者,构造您的参数,然后使用Direction property 设置方向。

        Check this link on MSDN for more information.

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2011-07-30
          • 1970-01-01
          • 1970-01-01
          • 2019-09-16
          • 2012-10-11
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多