2011-09-06 45 views
5

Tôi nhận này follwing ngoại lệ sql trong khi chèn một hình ảnh vào máy chủ sql 2008.Làm thế nào để lưu trữ hình ảnh vào một cột varbinary (max)?

chuyển đổi ngầm từ kiểu dữ liệu nvarchar sang varbinary (max) không phép. Sử dụng hàm CONVERT để chạy truy vấn này

Trong cơ sở dữ liệu Hình ảnh cột kiểu dữ liệu là Varbinary (MAX).

Hãy giúp tôi về điều này.

Sửa

Mã dỡ bỏ từ bình luận

paramaters.Add(getParam("@imageFilePath", DbType.AnsiString, imageFilePath)); 
+0

Vui lòng hiển thị mã bạn đang sử dụng để nhập hình ảnh. –

+0

Bạn có đang chèn biểu diễn base64 hay gì đó không? Có vẻ như đối tượng 'SqlParameter' bạn đang sử dụng được định cấu hình không chính xác. – Tejs

Trả lời

2

Dường như bạn đang cố gắng để thiết lập các dữ liệu hình ảnh vào một cột được thiết lập để NVARCHAR (một văn bản cơ bản) kiểu dữ liệu. Hoặc đặt dữ liệu hình ảnh vào cột đúng là VARBINARY (MAX) - hoặc thêm cột đó vào bảng của bạn nếu nó chưa tồn tại. Hoặc bạn có thể thay đổi cột hiện tại bạn đang sử dụng cho loại dữ liệu VARBINARY (MAX) thông qua lệnh ALTER TABLE, nếu đó thực sự là cột đúng và nó vừa được tạo với kiểu dữ liệu sai để bắt đầu.

+0

Hi Mufasa, Dưới đây là phương pháp thêm tôi nghĩ rằng đây là vấn đề iam nhận được những gì là dbType tôi cần change.please giúp tôi. paramaters.Add (getParam ("@ imageFilePath", DbType.AnsiString, imageFilePath)); – Indra

+0

Không - Bạn cần phải làm nhiều hơn thay đổi loại. Bạn không thể chỉ gửi cho SQL Server đường dẫn tệp mà bạn cần gửi cho nó dữ liệu nhị phân. –

+0

Tôi mới làm quen với cách này tôi có thể làm gì? – Indra

13

Sử dụng này để đọc các tập tin vào một mảng byte:

// Old fashioned way 
    public static byte[] ReadFile(string filePath) 
    { 
     byte[] buffer; 
     FileStream fileStream = new FileStream(filePath, FileMode.Open, FileAccess.Read); 
     try 
     { 
      int length = (int)fileStream.Length; // get file length 
      buffer = new byte[length];   // create buffer 
      int count;       // actual number of bytes read 
      int sum = 0;       // total number of bytes read 

      // read until Read method returns 0 (end of the stream has been reached) 
      while ((count = fileStream.Read(buffer, sum, length - sum)) > 0) 
       sum += count; // sum is a buffer offset for next reading 
     } 
     finally 
     { 
      fileStream.Close(); 
     } 
     return buffer; 
    } 

hoặc

// Thanks Magnus! 
    byte[] data = System.IO.File.ReadAllBytes(filePath); 

Sau đó lưu dữ liệu hình ảnh sử dụng này (Tôi đang sử dụng một lớp hình ảnh "dụ" có chứa của tôi thông tin hình ảnh và mảng byte trong instance.Data):

using(SqlCommand cm = new SqlCommand("SaveImage", connection, transaction)){ 
     cm.CommandType = CommandType.StoredProcedure; 
     cm.Parameters.Add(new SqlParameter("@Id", SqlDbType.Int,0, ParameterDirection.InputOutput, false, 10, 0, "Id", DataRowVersion.Current, (SqlInt32)instance.Id)); 
     cm.Parameters.Add(new SqlParameter("@Title", SqlDbType.NVarChar,50, ParameterDirection.Input, false, 0, 0, "Title", DataRowVersion.Current, (SqlString)instance.Title)); 
     if (instance.Data.Length > 0) 
     { 
      cm.Parameters.Add(new SqlParameter("@Data", SqlDbType.VarBinary,instance.Data.Length, ParameterDirection.Input, false, 0, 0, "Data", DataRowVersion.Current, (SqlBinary)instance.Data)); 
     } 
     else 
     { 
      cm.Parameters.Add(new SqlParameter("@Data", SqlDbType.VarBinary,0, ParameterDirection.Input, false, 0, 0, "Data", DataRowVersion.Current, DBNull.Value));      
     } 

     cm.ExecuteNonQuery(); 
    ) 

Và đây là một ví dụ được lưu trữ thủ tục:

CREATE PROCEDURE SaveImage 
(
@Id int OUTPUT 
,@Title nvarchar(50) 
,@Data varbinary(MAX) 
) 
AS 
SET NOCOUNT ON 
SET XACT_ABORT ON 

IF @Id IS NULL OR @Id <= 0 
BEGIN 
SELECT @Id = ISNULL(MAX([Id]),0) + 1 FROM [dbo].[Images] 
END 

INSERT INTO [dbo].[Images] (
[Id] 
,[Title] 
,[Data] 
) VALUES (
@Id 
,@Title 
,@Data 
) 
+9

System.IO.File.ReadAllBytes (filePath) – Magnus

+0

@Magnus Cuộc gọi tốt. –

+0

Bạn nên thay thế "instance.Data.Length" trong dòng Parameters.Add bằng "-1" để biểu diễn VARBINARY (MAX). –

4

Bạn gặp lỗi vì bạn đang cố gắng chèn văn bản vào cột đa chiều (tối đa); do đó, bạn không lưu trữ hình ảnh mà đúng hơn là PATH cho hình ảnh.

Nếu bạn chỉ muốn để lưu trữ các PATH, thay đổi loại cột của bạn từ varbinary (max) để varchar (max) Nếu bạn muốn lưu trữ các IMAGE byte sau đó bạn cần có mã để đọc các hình ảnh từ các tập tin như một mảng byte và sau đó bạn chèn các dữ liệu như vậy:

byte [] buffer = File.ReadAllBytes("Path/to/your/image/"); 
... 

SqlCommand command = .... 
command.CommandType=CommandType.StoredProcedure; 
command.Parameters.AddWithValue("@image",buffer); 
command.ExecuteNonQuery(); 

hoặc

SqlCommand command = .... 
command.Text="INSERT INTO YOUR_TABLE_NAME (image) values (@image)"; 
command.Parameters.AddWithValue("@image",buffer); 
command.ExecuteNonQuery(); 
1

Hãy nhìn vào hai điều sau đây:

Họ hiển thị không chỉ làm thế nào để làm điều đó, nhưng làm thế nào để làm điều đó một cách hiệu quả sử dụng ngữ nghĩa suối.Các giải pháp ngây thơ của tải toàn bộ hình ảnh vào một byte bộ nhớ [] sẽ tiêu thụ quá nhiều bộ nhớ trong quá trình ASP của bạn. Mã được hiển thị đang sử dụng MVC, nhưng bạn có thể dễ dàng điều chỉnh nó thành Mẫu APS.

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