Nano Hash - криптовалюты, майнинг, программирование

Получение выходных переменных SQL Server в С#

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

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 в С# и поставить его output в С#:

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 

и С#

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 сохранит любое значение, с которого оно должно начинаться. 05.12.2011

Ответы:


1

Прежде всего - если это параметр OUTPUT, вы не можете использовать .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());
05.12.2011

2

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

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());
05.12.2011
  • Это должно быть Parameters["@guidid"] (квадратные скобки, а не круглые скобки) 05.12.2011
  • Звучит заразно. Будь осторожен! ;-П 05.12.2011

  • 3

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

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

    05.12.2011

    4

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

    05.12.2011

    5

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

    Кластеризация: более глубокий взгляд
    Кластеризация — это метод обучения без учителя, в котором мы пытаемся найти группы в наборе данных на основе некоторых известных или неизвестных свойств, которые могут существовать. Независимо от..

    Как написать эффективное резюме
    Предложения по дизайну и макету, чтобы представить себя профессионально Вам не позвонили на собеседование после того, как вы несколько раз подали заявку на работу своей мечты? У вас может..

    Частный метод Python: улучшение инкапсуляции и безопасности
    Введение Python — универсальный и мощный язык программирования, известный своей простотой и удобством использования. Одной из ключевых особенностей, отличающих Python от других языков, является..

    Как я автоматизирую тестирование с помощью Jest
    Шутка для победы, когда дело касается автоматизации тестирования Одной очень важной частью разработки программного обеспечения является автоматизация тестирования, поскольку она создает..

    Работа с векторными символическими архитектурами, часть 4 (искусственный интеллект)
    Hyperseed: неконтролируемое обучение с векторными символическими архитектурами (arXiv) Автор: Евгений Осипов , Сачин Кахавала , Диланта Хапутантри , Тимал Кемпития , Дасвин Де Сильва ,..

    Понимание расстояния Вассерштейна: мощная метрика в машинном обучении
    В обширной области машинного обучения часто возникает необходимость сравнивать и измерять различия между распределениями вероятностей. Традиционные метрики расстояния, такие как евклидово..

    Обеспечение масштабируемости LLM: облачный анализ с помощью AWS Fargate и Copilot
    В динамичной области искусственного интеллекта все большее распространение получают модели больших языков (LLM). Они жизненно важны для различных приложений, таких как интеллектуальные..