Использование DBNull.Value с SqlParameter без знания sqlDbType?

Я использую SqlParameter для передачи нулевых значений в таблицу для различных столбцов, которые могут быть обнулены. Проблема в том, что SqlParameter выглядит так, как будто он по умолчанию равен nvarchar, если нет sqlDbType. Это представляет проблему, если фактический тип db является varbinary; Я получаю исключение, говорящее

Неявное преобразование из типа данных nvarchar в varbinary (max) недопустимо. Используйте функцию CONVERT для запуска этого запроса.

Когда я создаю SqlParameter, все, что я знаю, это имя параметра и объект. Если объект является нулевым, SqlParameter, очевидно, не может вывести правильный тип для использования, так есть ли способ использовать SqlParameter с нулевыми значениями, не зная sqlDbType при создании параметра sql?

По существу передать DBNull в базу данных без указания типа и позволить базе данных обращаться с ним?

Старый пост, но может быть полезен кому-то другому.

 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); 
  • Почему HashSet <T> приписывается MayLeakOnAbort, но Словарь <K, V> нет?
  • Обработчик события .NET на объекте базы данных
  • Что является альтернативой провайдеру oledb при использовании ссылок (mdb) связанных таблиц снова sql-сервера в .NET.
  • C # управление транзакцией через несколько баз данных
  • SqlDataReader.GetSqlBinary vs SqlDataReader.GetSqlBytes?
  • Каков правильный / лучший способ обработки параметров с нулевым значением в Insight.Database?
  • SqlParameter не работает с инструкцией INSERT
  • Подключение к файлу mdf базы данных sql-сервера без установки SQL-сервера на клиентской машине?
  • Преимущества «использования» блока для инициализации SqlCommand
  • Каков наилучший способ хранения даты без года в базе данных SQL?
  • Как вы разбираете большие SQL-скрипты в партии?
  • Interesting Posts

    Оптимизация предложения WHERE SQL-запроса

    Анализ XML с использованием T-SQL и XQUERY – Поиск определенных значений

    Разделение строк с разделителями FileTable

    месяцев между двумя датами в sql-сервере со стартовой и конечной датой каждого из них в sql-сервере

    SQL-запрос, который отображает имена спортсменов, которые участвовали в нескольких мероприятиях

    Как восстановить базу данных SQL Server с помощью C #, даже если она используется

    SQL Server – Кластерный дизайн индекса для словаря

    Ошибка SQL Server при обновлении – «Суровая ошибка в текущей команде»

    Удаленные записи SQL Server, несмотря на то, что в подзапросе была обнаружена ошибка, которая находится в разделе where с тегом IN

    sysprocess в SQL Server

    Access 97 Frontend – ошибка SQL Server 2005 Backend Linked Table

    Тест для верхнего случая – T-Sql

    конвертировать HH: MM: SS.MS в секундах с использованием SQL Server 2008 R2

    Запрос Linq не поддерживает System.String

    SQL Получить сначала не пустое значение из родительских строк

    Давайте будем гением компьютера.