ALTER PROCEDURE dbo.ovpn_AddCurrentSession
(
@userName nvarchar(50),
@realAddress varchar(30),
@virtualAddress varchar(30),
@sessionStartTime datetime,
@bytesRecieved bigint,
@bytesSent bigint
)
AS
...
Вызов хранимой процедуры, проблема с передачей даты
Код:
На C# вызываю следующим образом:
Код:
private static void AddCurrentSessionProc(SqlConnection con, SqlTransaction tran, SessionInfo session) {
using (SqlCommand cmd = new SqlCommand()) {
cmd.CommandType = CommandType.StoredProcedure;
cmd.CommandText = "ovpn_AddCurrentSession";
cmd.Connection = con;
cmd.Transaction = tran;
cmd.Parameters.Add("@userName", SqlDbType.NVarChar).Value = session.UserName;
cmd.Parameters.Add("@realAddress", SqlDbType.VarChar).Value = session.RealAddress;
cmd.Parameters.Add("@virtualAddress", SqlDbType.VarChar).Value = session.VirtualAddress;
cmd.Parameters.Add("@sessionStartTime", SqlDbType.DateTime).Value = session.SessionStartTime;
cmd.Parameters.Add("@bytesRecieved", SqlDbType.BigInt).Value = session.BytesRecieved;
cmd.Parameters.Add("@bytesSent", SqlDbType.BigInt).Value = session.BytesSent;
cmd.ExecuteNonQuery();
}
}
using (SqlCommand cmd = new SqlCommand()) {
cmd.CommandType = CommandType.StoredProcedure;
cmd.CommandText = "ovpn_AddCurrentSession";
cmd.Connection = con;
cmd.Transaction = tran;
cmd.Parameters.Add("@userName", SqlDbType.NVarChar).Value = session.UserName;
cmd.Parameters.Add("@realAddress", SqlDbType.VarChar).Value = session.RealAddress;
cmd.Parameters.Add("@virtualAddress", SqlDbType.VarChar).Value = session.VirtualAddress;
cmd.Parameters.Add("@sessionStartTime", SqlDbType.DateTime).Value = session.SessionStartTime;
cmd.Parameters.Add("@bytesRecieved", SqlDbType.BigInt).Value = session.BytesRecieved;
cmd.Parameters.Add("@bytesSent", SqlDbType.BigInt).Value = session.BytesSent;
cmd.ExecuteNonQuery();
}
}
При вызове получаю SqlException, сообщающее о том, что дата имеет неверный формат:
Цитата:
{"Conversion failed when converting datetime from character string."}
Пробовал назначить Thread-у инвариантную культуру - всеравно ругается.
З.Ы. параметр session хранит корректные значения.
Какой тип у SessionInfo.SessionStartTime? Случаем не закралось ли там Nullable<DateTime> вместо DateTime?
Код:
public sealed class SessionInfo {
...
private DateTime sessionStartTime;
public DateTime SessionStartTime {
get { return sessionStartTime; }
}
...
}
...
private DateTime sessionStartTime;
public DateTime SessionStartTime {
get { return sessionStartTime; }
}
...
}
Вообще все члены SessionInfo четко определены - никаких null-ов, везде реальные корректные значения.
Еще пробовал передавать серверу SET LANGUAGE с текущим языком из CultureInfo.CurrentCulture - не помогает...
Посмотрел я SQL-код хранимой процедуры (ну, прошелся пошагово тоже) и заметил такое вот несоответствие:
Код:
INSERT INTO ovpn_CurrentSessions (UserName, [COLOR="Red"]SessionStartTime[/COLOR], [COLOR="Red"]RealAddress[/COLOR], VirtualAddress, BytesRecieved, BytesSent, SessionActive)
VALUES (@userName, [COLOR="Red"]@realAddress[/COLOR], [COLOR="Red"]@sessionStartTime[/COLOR], @virtualAddress, @bytesRecieved, @bytesSent, 1)
VALUES (@userName, [COLOR="Red"]@realAddress[/COLOR], [COLOR="Red"]@sessionStartTime[/COLOR], @virtualAddress, @bytesRecieved, @bytesSent, 1)
Вот и ругал меня SQL-сервер не за вызов хранимки, а за кривость в INSERT-е. Эх, невнимательность.
Цитата: hardcase
Нет, весь код пишу руками, потому такой баг бы заметил (никакого ADO.NET - мне так проще и быстрее). Nullable<T> по-возможности избегаю...
Позволю себе вас поправить :-) ADO.NET как раз таки используется, и нарекания в его сторону вряд ли найдутся, а вот что касается его части связанной с DataSet и глубже - согласен, штука сильно мешает, когда размер системы вырастает за границы нескольких справочников... никакого представления о целостностях :-( . Исходя из этого - O/RM, который вы благополучно используете.
Цитата: hardcase
А ларчик просто открывался...
На вашем месте, в таких случаях хочется убиться :D .
Цитата: Ap0k
На вашем месте, в таких случаях хочется убиться :D .
Истину говоришь :D