Я хочу сделать что-то вроде следующего:
update AutoTagUse set TimeActive = (TimeActive + @OrigTimeActive) where AutoTagUseId = @AutoTagUseId
Где TimeActive
- это столбец TIME(0)
в SQL Server, а OrigTimeActive
- это переменная TimeSpan
(в C #).
Я пытаюсь сделать это, чтобы у меня было несколько служб, одновременно обновляющих это значение в базе данных, без необходимости блокировать транзакции.
Запись SQL Server для создания столбца::
[TimeActive] TIME (0)
CONSTRAINT [DF_AutoTagUse_TimeActive] DEFAULT ('00:00:00') NOT NULL,
Я сейчас пытаюсь:
TimeSpan difference = TimeActive - origTimeActive;
conn.ExecuteScalar("update AutoTagUse set TimeActive = dateadd(SECOND, @OrigTimeActive, TimeActive) where AutoTagUseId = @AutoTagUseId",
new { AutoTagUseId = AutoTagUseId, OrigTimeActive = difference }, transaction);
И я получаю:
System.Data.SqlClient.SqlException
HResult = 0x80131904
Сообщение = Время типа данных аргумента недопустимо для аргумента 2 функции dateadd.
Source = .Net Поставщик данных SqlClient
StackTrace:
в Dapper.SqlMapper.ExecuteScalarImpl [T] (IDbConnection cnn, CommandDefinition & command)
в Dapper.SqlMapper.ExecuteScalar (IDbConnection cnn, String sql, Параметр объекта, IDbTransaction транзакция, Nullable 1 commandTimeout, Nullable
1 commandType)
в LicenseLibrary.DataObateUb.сonn, транзакция IDbTransaction) в C: \ git \ Store \ LicenseLibrary \ DataObjects \ AutoTagUse.cs: строка 171
в TestLibrary.DataObjects.TestAutoTagUse. <> c.b__2_0 (IDbConnection conn) в C: \ git \ Store \TestLibrary \ DataObjects \ TestAutoTagUse.cs: строка 59
в LicenseLibrary.Database.AzureDataAccess. <> C__DisplayClass11_0.b__0 () в C: \ git \ Store \ LicenseLibrary \ Database \ AzureDataAccess.cs: строка 104
в Microsoft.Practices.EnterpriseLibrary.TransientFaultHandling.RetryPolicy. <> C__DisplayClass1.b__0 ()
в Microsoft.Practices.EnterpriseLibrary.TransientFaultHandling.RetryPolicy.ExecuteAction * TResult] (1035) 10)