Использование DBNull.Value с SqlParameter без знания sqlDbType?
Я использую SqlParameter
для передачи нулевых значений в таблицу для различных столбцов, которые могут быть обнулены. Проблема в том, что SqlParameter выглядит так, как будто он по умолчанию равен nvarchar, если нет sqlDbType. Это представляет проблему, если фактический тип db является varbinary; Я получаю исключение, говорящее
Неявное преобразование из типа данных nvarchar в varbinary (max) недопустимо. Используйте функцию CONVERT для запуска этого запроса.
Когда я создаю SqlParameter, все, что я знаю, это имя параметра и объект. Если объект является нулевым, SqlParameter, очевидно, не может вывести правильный тип для использования, так есть ли способ использовать SqlParameter с нулевыми значениями, не зная sqlDbType при создании параметра sql?
- TransactionScope и SQL Server Compact
- Возвращает логическое значение из запроса выбора
- Сколько соединений доступно в пуле соединений ADO.NET
- Использование базы данных SQL Server для входа в систему управления вместо стандартной базы данных ASPNETDB.mdf
- LocalDB: изменить расположение по умолчанию SQL Server
По существу передать DBNull в базу данных без указания типа и позволить базе данных обращаться с ним?
- Веб-приложения ASP.NET 2.0-4.0 испытывают чрезвычайно медленный первоначальный запуск.
- Можно ли возвращать несколько наборов результатов, используя ExecuteQuery в Linq to Sql?
- Есть ли семантический движок вики, который работает в стеке microsoft (.NET, SQL Server)?
- Какой был бы лучший способ собрать около миллиона записей из БД?
- Отношение «один ко многим», основанное на множественном ключе (условном) в Entity Framework
- Как получить доступ к классу .NET TimeZoneInfo из SQL Server 2005?
- Используйте SqlDataReader и строковый массив
- Внешняя сборка SSRS: не удалось загрузить сборку узла выражения
Старый пост, но может быть полезен кому-то другому.
Convert.DBNull
Как это
command.Parameters.AddWithValue("@param", Convert.DBNull);
Задайте значение по умолчанию для столбцов NULL (до NULL), а затем не передайте ни один столбцы NULL в инструкции insert.
Есть еще один способ сделать это. Вы все еще можете использовать AddWithValue, однако используйте SqlBinary.Null вместо DBNull.Value:
c.Parameters.AddWithValue ("@ cfp", SqlBinary.Null);
Не забудьте импортировать System.Data.SqlTypes в свой проект.
Источник
Я имею дело с своего рода ORM, который использует objects
для генерации параметров. Так как они по сути являются необъективными, когда null
это затрудняет дифференциацию различных типов нуль SQL.
DBNull.Value
работает почти для каждого типа SQL, но он терпит неудачу для используемого varbinary(max)
столбца. Вместо этого вы должны использовать SqlBinary.Null
– не спрашивайте меня, почему.
Я решил использовать специальное помеченное значение здесь, чтобы указать, когда этот тип столбца должен использоваться. Полный, за исключением нашего «ОРМ» ниже:
using System.Data.SqlTypes; class MyModelType { public Guid ID { get; set; } public byte[] Data { get; set; } } static readonly object NullSqlBinary = new object(); object SqlValueForObject(object val) { if (val == null) { val = DBNull.Value; } else if (val == NullSqlBinary) { val = SqlBinary.Null; } return val; } IDictionary<string, object> Params(MyModelType x) { return new Dictionary<string, object> { { "@ID", x.ID }, { "@Data", x.Data ?? NullSqlBinary }, }; } private SqlCommand CreateCommand() { var cmd = Connection.CreateCommand(); cmd.CommandTimeout = 60; return cmd; } SqlCommand CreateCommand(string sql, IDictionary<string, object> values) { var cmd = CreateCommand(); cmd.CommandText = sql; cmd.Transaction = GetCurrentTransaction(); cmd.Parameters.Clear(); if (values != null) { foreach (var kvp in values) { object sqlVal = SqlValueForObject(kvp.Value); cmd.Parameters.AddWithValue(kvp.Key, sqlVal); } } return cmd; } int Execute(string sql, IDictionary<string, object> values) { using (var cmd = CreateCommand(sql, values)) { return cmd.ExecuteNonQuery(); } } void InsertMyModel(MyModelType obj) { DB.Execute( @"INSERT INTO MyTable (ID, Data) VALUES (@ID, @Data)", Params(obj)); }
command.Parameters.AddWithValue("@param", DBNull.Value);