2012-09-18 35 views
6

Tôi đã sử dụng lại phương pháp này bằng cách sử dụng một DataTable làm tham số cho một thủ tục được lưu trữ và nó hoạt động rất tốt. Đây là mã làm việc được đơn giản hóa:DataTable với trường byte [] làm tham số cho một thủ tục được lưu trữ

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 } 
     ); 
} 

Sự cố phát sinh khi trường tôi muốn thêm là loại nhị phân. tức là:

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

Cột tương ứng trong cơ sở dữ liệu là varbinary(MAX) bằng cách này. Khi tôi cố gắng chạy điều này, tôi nhận được lỗi này:

Implicit conversion from data type nvarchar(max) to varbinary(max) is not allowed. Use the CONVERT function to run this query.

Làm cách nào để sửa đổi những gì tôi phải thực hiện công việc này?

+0

như bạn có thể biết byte [] không phải là kiểu dữ liệu, sử dụng byte thay vì –

+0

Nhưng một mảng là một kiểu dữ liệu ... – kei

Trả lời

9

Biểu thị cho chuỗi nhị phân trong .NET là SqlBinary structure.

Bạn muốn thêm cột của bạn như thế này:

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

Lớp SqlBinaryexplicit conversion to a byte array và một implicit conversion from a byte array, vì vậy giá trị từ một mảng byte đến cột là một vấn đề đơn giản của chuyển nhượng, trong khi nhận được một mảng byte từ cột yêu cầu một diễn viên rõ ràng.

+2

+1 Tìm thấy tốt! Sẽ rõ ràng hơn nếu mã gửi 'DataTable' đến SQL Server đã ném một ngoại lệ cho cột' typeof (byte []) '. Thông báo lỗi SQL Server là bất cứ điều gì nhưng rõ ràng. – Andomar

+0

@casperOne - Cảm ơn bạn đã đăng câu trả lời này - nó thực sự đã giúp tôi! Thật không may, [Tôi đã gặp phải một vấn đề tương tự trong một trường hợp cạnh] (http://stackoverflow.com/questions/35782496/empty-datatable-causes-errors-when-table-valued-parameter-has-varbinary-types) . Tôi rất muốn nghe nếu bạn có bất kỳ suy nghĩ :-) –

Các vấn đề liên quan