DataTable с полем byte[] в качестве параметра хранимой процедуры

Я повторно использовал этот метод использования DataTable в качестве параметра для хранимой процедуры, и он прекрасно работал. Это упрощенный рабочий код:

using (dbEntities dbe = new dbEntities())
{
    var dt = new dataTable();
    dt.Columns.Add("ID");
    dt.Columns.Add("Message");
    dt.Columns.Add("CreatedOn", typeof(DateTime));

    foreach (var row in randomDataSource)
    {
        dt.Rows.Add(
            row.id,
            row.message,
            DateTime.Now
            );
    }

    var tableType = new SqlParameter("tableType", SqlDbType.Structured);
    tableType.Value = dt;
    tableType.TypeName = "[dbo].[RandomTableType]";

    dbe.ExecuteStoreCommand(
        "EXEC [dbo].[SaveTable] @tableType",
        new object[] { tableType }
        );
}

Проблема возникает, когда поле, которое я хочу добавить, имеет двоичный тип. то есть:

dt.Columns.Add("BinaryMessage", typeof(byte[]));

Соответствующий столбец в базе данных varbinary(MAX) Кстати. Когда я пытаюсь запустить это, я получаю эту ошибку:

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

Как мне изменить то, что я должен сделать, чтобы это работало?

1 ответ

Решение

Представление для двоичной строки в.NET является SqlBinary структура.

Вы хотите добавить свой столбец так:

dt.Columns.Add("BinaryMessage", typeof(SqlBinary));

SqlBinary Класс имеет явное преобразование в байтовый массив и неявное преобразование из байтового массива, поэтому значение из байтового массива в столбец является простым вопросом присваивания, в то время как получение байтового массива из столбца требует явного преобразования.

Другие вопросы по тегам