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函数运行此查询。

如何修改我的工作?

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

您想要像这样添加列:

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

SqlBinary类具有到字节数组的显式转换和字节数组的隐式转换 ,因此从字节数组到列的值是一个简单的赋值,而从列中获取字节数组需要显式转换。