DataTable,byte []字段作为存储过程的参数

kei*_*kei 8 .net c# datatable table-valued-parameters

我一直在重用这种使用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 }
        );
}
Run Code Online (Sandbox Code Playgroud)

当我想要添加的字段是二进制类型时,会出现问题.即:

dt.Columns.Add("BinaryMessage", typeof(byte[]));
Run Code Online (Sandbox Code Playgroud)

varbinary(MAX)顺便提一下,数据库中的相应列.当我尝试运行它时,我收到此错误:

不允许从数据类型nvarchar(max)到varbinary(max)的隐式转换.使用CONVERT函数运行此查询.

如何修改我的工作原理?

cas*_*One 11

.NET中二进制字符串的表示形式是SqlBinary结构.

您想要像这样添加列:

dt.Columns.Add("BinaryMessage", typeof(SqlBinary));
Run Code Online (Sandbox Code Playgroud)

SqlBinary类有一个显式转换为一个字节数组和一个从一个字节数组的隐式转换,因此从一个字节数组的列的值是分配的一个简单的事情,同时获得来自列的字节数组需要显式转换.

  • +1找到了!如果将`DataTable`发送到SQL Server的代码抛出`typeof(byte [])`列的异常将更清楚.SQL Server错误消息是明确的. (2认同)