Может ли кто-нибудь сказать мне, что происходит в этой функции? В следующем фрагменте кода, user.Id = 0
, id.Value = 0
и id.SqlDbType = Int
.. как ожидается, начиная с user.Id
is int field.Конструктор .NET SqlParameter несовместим?
Однако error.Value = null
и error.SqlDbType = BigInt
. Что дает? Если я использую ненулевое значение, он обнаруживает значение int и правильное значение.
Примечание: свойства Value одинаковы до и после объявления направления параметра.
public static long InsertUpdate(User user) {
SqlParameter id = new SqlParameter("@id", user.Id);
id.Direction = ParameterDirection.InputOutput;
cmd.Parameters.Add(id);
SqlParameter error = new SqlParameter("@error_code", 0);
error.Direction = ParameterDirection.Output;
cmd.Parameters.Add(error);
.... other stuff
}
Как хорошо, если @SET @error_Code = 0 в sproc, error.Value = NULL, и error.SqlDbType = NVARCHAR после процедуры проходит. Если я устанавливаю его в целое число, я получаю тип Int.
UPDATE: После указания SqlDbType.Int параметр теперь имеет правильный SqlDbType до и после команды ... Однако хранимая процедура еще установка @error_code = нуль, когда я на самом деле установить его в 0.
UPDATE: когда sproc выполняет ЗЕЬЕСТ параметр @error_code всегда возвращается как нуль, независимо от того, когда и не было установлено ... это происходит только тогда, когда есть оператор выбора ...
Вот процедура для воспроизведения:
ALTER PROCEDURE [dbo].[usp_user_insert_v1]
@username VARCHAR(255),
@password VARCHAR(255),
@gender CHAR(1),
@birthday DATETIME,
@error_code INT OUTPUT
AS
BEGIN
-- SET NOCOUNT ON added to prevent extra result sets from
-- interfering with SELECT statements.
SET NOCOUNT ON;
DECLARE @default_dt DATETIME
EXEC @default_dt = uf_get_default_date
DECLARE @dt DATETIME = GETUTCDATE()
INSERT INTO users(username, password, gender, birthday, create_dt, last_login_dt, update_dt, deleted)
VALUES(@username, @password, @gender, @birthday, @dt, @default_dt, @default_dt, 0)
SELECT * FROM users WHERE id = SCOPE_IDENTITY()
SET @error_code = 3
RETURN
END
РЕШЕНИЕ?
Найдено эту ссылку на форумах ASP ... видимо вы не можете прочитать выходной параметр, пока не прочитал все результаты от SqlDataReader ... очень печально для меня, так как я решаю даже ли или нет я хочу, чтобы читать результаты на основании выходного сигнала парам ...
Можете ли вы объяснить, почему SqlParamter («@ id», user.Id) создает Int, а не SqlParameter («@ error_code», 0)? user.Id - это поле int, установленное в 0. Кроме того, SqlParamter («@ error_code», 2) правильно создает устанавливает SqlDataParamter в int ... поэтому я не думаю, что он выбирает конструктор SqlDataType (name, SqlDbType) когда передается целочисленный литерал. – Cailen
'user.Id' не является целым ** литералом ** при любых обстоятельствах. И это целочисленный литерал '0', который имеет этот специальный случай, который позволяет преобразовать его в значение« enum ». И, если вы мне не верите, попробуйте добавить больше примеров к образцу кода, который я включил в свой ответ, который я сделал, чтобы вы могли * видеть *, какая перегрузка выбрана для разных обстоятельств. –
Извините, буквальное было совершенно неправильным словом. Я вижу вашу точку зрения, странно, что другие целочисленные литералы не интерпретируются как перечисления SqlDbType. – Cailen