Обновите SqlSever с помощью дополнительных параметров / condition из C # / Dapper

#c# #sql-server #dapper

#c# #sql-server #dapper

Вопрос:

У меня есть приложение, в котором я беру данные из API и отправляю их в свою базу данных SQL Server. Иногда я просто хочу обновить один определенный столбец в базе данных из моего приложения новыми данными.

Это код, который я запускаю в приложении для отправки данных прямо сейчас

 public void TestinPE(long? instID, float? Value)
{
    using (IDbConnection connection = new System.Data.SqlClient.SqlConnection(Helper.CnnVal("BorsdataDB")))
    {
        //Person newPerson = new Person { ModelName = Variable, LastName = lastName, EmailAddress = emailAddress, PhoneNumber = phoneNumber };
        List<KpiReturn> updateKpi = new List<KpiReturn>();
        updateKpi.Add(new KpiReturn { instID = instID, psValue = Value });
        connection.Execute("dbo.UpdateRec @instID,@psValue", updateKpi);
    }
}
  

И процедура, которую я вызываю, выглядит следующим образом

 ALTER PROCEDURE [dbo].[UpdateRec]
    @instID int,
    @psValue float = null,
    @peValue float = null
AS
BEGIN
    SET NOCOUNT ON;

    UPDATE StockData
    SET peValue = ISNULL(@peValue, peValue), 
        psValue = ISNULL(@psValue, psValue)
    WHERE instID = @instID
END
  

Допустим, теперь, когда я хочу обновить psValue , он отлично работает, но если я вместо этого попытаюсь обновить peValue и изменю свой код C # на

 updateKpi.Add(new KpiReturn { instID = instID, peValue = Value });
connection.Execute("dbo.UpdateRec @instID,@peValue", updateKpi);
  

psValue в моих обновлениях SQL Server в этом случае всегда обновляется первый параметр в запросе @psValue float = null .

Он отлично работает, если я запускаю запрос в SQL, как показано ниже, он игнорирует psValue , но обновляет peValue . Но я могу добиться этого при попытке передать параметры из C#

 exec dbo.UpdateRec @instID = 2, @peValue = 500
  

Какие-нибудь подсказки для меня по этому поводу?

Ответ №1:

Он отлично работает, если я запускаю запрос в SQL, как показано ниже, он игнорирует значение psValue, но обновляет значение peValue. Но я могу добиться этого при попытке передать параметры из C#

exec dbo.UpdateRec @instID = 2, @peValue = 500

Эти фрагменты кода передают значения параметров по порядковому номеру вместо имени, поэтому код процедуры будет видеть значения как @instID и @psValue независимо от предоставленного имени параметра:

 updateKpi.Add(new KpiReturn { instID = instID, psValue = Value });
connection.Execute("dbo.UpdateRec @instID,@psValue", updateKpi);

updateKpi.Add(new KpiReturn { instID = instID, peValue = Value });
connection.Execute("dbo.UpdateRec @instID,@peValue", updateKpi);
  

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

 updateKpi.Add(new KpiReturn { instID = instID, psValue = Value });
connection.Execute("dbo.UpdateRec @instID=@instID, @psValue=@psValue", updateKpi);

updateKpi.Add(new KpiReturn { instID = instID, peValue = Value });
connection.Execute("dbo.UpdateRec @instID=@instID, @peValue=@peValue", updateKpi);