Получение выходных переменных SQL Server в c # - PullRequest
5 голосов
/ 05 декабря 2011

У меня есть хранимая процедура:

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
)

Мне нужно id в C # и поместить его output в c #:

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

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

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

, но в окне сообщения отображается нулевое значение!!

Как я могу вернуть идентификатор?

Я изменил его на:

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

но это не такничего не вернуть

Ответы [ 5 ]

13 голосов
/ 05 декабря 2011

Прежде всего - если это параметр OUTPUT, вы не можете использовать .AddWithValue в C # - вам нужно использовать:

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());
4 голосов
/ 05 декабря 2011

Перед выполнением запроса необходимо указать направление параметра, в этом случае вывести. e.g.:

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());
1 голос
/ 05 декабря 2011

Вам необходимо построить SqlParameter , используя один из конструкторов, который позволяет указать ParameterDirection , например this * .Либо создайте свой параметр, а затем установите направление, используя свойство Направление .

Для получения дополнительной информации перейдите по этой ссылке в MSDN.

0 голосов
/ 13 января 2014

Я также нашел это очень расстраивающим, и я не мог понять проблему. Хотя многие ответы верны, была одна простая строка, которую я и другие часто упускали из виду, а именно: команда должна быть процедурой хранения, а не просто каким-либо 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()   
       }
0 голосов
/ 05 декабря 2011

Почему вы устанавливаете вывод @guidid uniqueidentifier как выходной параметр? Это означает, что он переопределит его после выполнения хранимой процедуры. Если это ваше намерение, то вам нужно добавить оператор после оператора вставки, чтобы установить для выходного параметра желаемое значение. что-то вроде этого: выберите @guidid = @generatedID. Да, посмотрите на код marc_s, именно так вы и должны это делать.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...