2013-07-18 8 views
1

Я читал о вставке изображений в базы данных SQL-сервера, но я не мог заставить свой код работать. Вот мой первоначальный код.Вставка скриншота в базу данных

public void InsertResults(string Id, Bitmap bitmap) 
     { 
      try 
      { 
       using (SqlConnection conn = new SqlConnection(connectionString)) 
       { 
        conn.Open(); 
        using (SqlCommand cmd = new SqlCommand("INSERT INTO Results VALUES(@ResultID, @HasSucceeded, @ScenarioID, @Screenshot)", conn)) 
        { 

         cmd.Parameters.AddWithValue("@ResultID", 0); 
         cmd.Parameters.AddWithValue("@HasSucceeded", 0); 
         cmd.Parameters.AddWithValue("@ScenarioID", Id); 
         cmd.Parameters.AddWithValue("@Screenshot", bitmap); 

         cmd.ExecuteNonQuery(); 
        } 
       } 
      } 
      catch (SqlException ex) 
      { 
       //Log exception 
      } 
     } 

Я знаю, что вы не можете просто вставить растровое изображение, как я пытался выше. Как мне перейти на преобразование Bitmap в то, что я могу вставить?

Я знаю, что какой-то SQL, подобный этому ниже, должен использоваться, но я не уверен, как его интегрировать в мой код.

INSERT INTO DatabaseImageTable ([image name], [image]) 
SELECT 'SQL Server Image', * 
FROM OPENROWSET(BULK N'C:\images\sql-server-image-file.jpg', SINGLE_BLOB) image; 
+1

Вы не используете OPENROWST/BULK из кода. Вместо этого просто напишите BLOB непосредственно (выставленный в ADO.NET как 'byte []'; преобразуйте Bitmap в/из). В качестве альтернативы используйте тип [FILESTREAM] (http://msdn.microsoft.com/en-us/library/gg471497.aspx) (который хорошо подходит для [большого] хранилища файлов). Некоторые подсказки здесь: http://stackoverflow.com/questions/697779/custom-streaming-to-read-blobs-from-ms-sql-how-should-i-handle-the-connection и оболочка потока blob http: //stackoverflow.com/questions/2101149/how-to-i-serialize-a-large-graph-of-net-object-into-a-sql-server-blob-without-c – user2246674

+1

Если вам просто нужно конвертировать битмап в массив байтов для вставки в столбец blob, это должно помочь: http://stackoverflow.com/questions/7350679/convert-a-bitmap-into-a-byte-array-in-c – David

+0

Что такое тип данных 'Скриншот' в вашей таблице? – Dai

ответ

2

Написать растровое изображение в двоичном виде: чаще всего, сохранить его в MemoryStream, а затем вызвать ToArray() на MemoryStream(), чтобы получить байт []. Этот байт [] может быть тривиально сохранен в столбце типа «изображение» или (и предпочтительно) «varbinary (max)».

+4

Если вы идете по этому маршруту, определенно используйте 'varbinary', поскольку' image' ('ntext' и' text') устарели и будут удалены в более новых версиях sql-сервера. – Matthew

Смежные вопросы