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