我將圖像存儲在數據庫中,並希望將它們從字節數組轉換爲圖像。我沒有任何問題將對象轉換爲字節數組,但當嘗試從字節數組轉換爲圖像時,出現「參數無效」的錯誤。我傳遞給我的方法的對象來自數據集行。將圖像文件保存到sql server並將字節數組轉換爲圖像
存儲過程
USE [----------------]
GO
/****** Object: StoredProcedure [dbo].[usp_imageloader_add_test] Script Date: 01/16/2012 09:19:46 ******/
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
ALTER procedure [dbo].[usp_imageloader_add_test]
@p_Image Image
as
INSERT into Test_Images VALUES(@p_Image)
上載文件控制 /圖像文件轉換爲字節陣列和數據保存到數據庫,該數據庫調用objToImg方法
protected void btnUpload_Click(object sender, EventArgs e)
{
if (ctrlUpload.PostedFile != null)
{
if (ctrlUpload.PostedFile.ContentLength > 0)
{
// Get Posted File
HttpPostedFile objHttpPostedFile = ctrlUpload.PostedFile;
// Find its length and convert it to byte array
int ContentLength = objHttpPostedFile.ContentLength;
// Create Byte Array
byte[] bytImg = new byte[ContentLength];
// Read Uploaded file in Byte Array
objHttpPostedFile.InputStream.Read(bytImg, 0, ContentLength);
using (SqlConnection dbConnection = new SqlConnection(app_settings.sql_conn_string_db))
{
try
{
string sql = "usp_imageloader_add_test";
SqlCommand cmd = new SqlCommand(sql, dbConnection);
cmd.CommandType = System.Data.CommandType.StoredProcedure;
cmd.Parameters.AddWithValue("@p_Image", bytImg).SqlDbType = SqlDbType.Binary;
cmd.Connection.Open();
cmd.ExecuteNonQuery();
cmd.Connection.Close();
}
catch (Exception ex)
{
ex.Message.ToString();
}
}
}
}
}
表方法
protected void Page_Load(object sender, EventArgs e) { generateTable(false); } private Table generateTable(bool flag) { Table tb = BuildList(GetData(), flag); if (imgloadercms != null) { PlaceHolder ph = new PlaceHolder(); StringBuilder sb = new StringBuilder(); ph.Controls.Add(new LiteralControl(sb.ToString())); } imgloadercms.Controls.Add(tb); return tb; } protected Table BuildList(DataTable tb, bool flag) { Table tblImageLibrary = new Table(); tblImageLibrary.BorderStyle = BorderStyle.Solid; tblImageLibrary.BorderWidth = Unit.Pixel(8); if (tb.Rows.Count > 0) { try { if (!flag) { tblImageLibrary.BorderColor = Color.Black; tblImageLibrary.BorderWidth = Unit.Pixel(1); TableRow tr = new TableRow(); // Table row for header of table tr.BackColor = Color.LightBlue; TableCell c1 = new TableCell(); TableCell c2 = new TableCell(); c1.Controls.Add(new LiteralControl("Image Id")); tr.Cells.Add(c1); c2.Controls.Add(new LiteralControl("Image")); tr.Cells.Add(c2); tblImageLibrary.Rows.Add(tr); } int i = 0; foreach (DataRow r in tb.Rows) // Create new row foreach row in table { TableRow tr = new TableRow(); if (i % 2 == 0) { tr.BackColor = Color.LightYellow; } // Build cells TableCell c1 = new TableCell(); TableCell c2 = new TableCell(); c2.Width = 300; c1.Controls.Add(new LiteralControl(r["Image_Id"].ToString())); tr.Cells.Add(c1); // Call method to serialize obj to byte array //System.Drawing.Image dbImg = ObjToImg(r["Image_File"]); } catch (Exception ex) { ex.ToString(); } if (!flag) { } } return tblImageLibrary; }
返回圖像
private System.Drawing.Image ObjToImg(object obj)
{
//byte[] byteArray = null;
if (obj == null)
return null;
else
{
BinaryFormatter bf = new BinaryFormatter();
using (MemoryStream ms = new MemoryStream())
{
bf.Serialize(ms, obj); //now in Memory Stream
ms.ToArray(); // Array object
ms.Seek(0, SeekOrigin.Begin);
//return (System.Drawing.Image)bf.Deserialize(ms);
System.Drawing.Image myImage = (System.Drawing.Image)bf.Deserialize(ms);
return myImage;
}
每當我試着內存流對象添加到圖像對象的構造函數,我得到的錯誤消息「參數無效」。也許我在將字節數組插入到數據庫時犯了一個錯誤,因爲我查看了其他代碼,並且它沒有任何意義。
向我們展示您將字節傳遞給'ObjToImg'的位置 –
我有類似的代碼,其中我使用'varbinary(max)'而不是'image'。編輯:剛剛發現這個鏈接也 - - http://stackoverflow.com/questions/4113294/is-there-a-big-technical-difference-between-varbinarymax-and-image-data-types – robasta
它從一排在一個數據表我會更新我原來的帖子。 –