Я читал о вставке изображений в базы данных 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;
Вы не используете 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
Если вам просто нужно конвертировать битмап в массив байтов для вставки в столбец blob, это должно помочь: http://stackoverflow.com/questions/7350679/convert-a-bitmap-into-a-byte-array-in-c – David
Что такое тип данных 'Скриншот' в вашей таблице? – Dai