2012-02-10 122 views
-1

我寫了這個代碼,但面對一個異常說:Parameter Not Valid.檢索從SQL Server圖像

string connstr = @"Data Source=.\SQLEXPRESS;AttachDbFilename=|DataDirectory|\db.mdf;Integrated Security=True;User Instance=True"; 

    SqlConnection conn = new SqlConnection(); 
    conn.ConnectionString = connstr; 

    conn.Open(); 

    SqlCommand cmd = new SqlCommand(); 
    cmd.Connection = conn; 

    cmd.CommandText = "SELECT * FROM tbl"; 

    SqlDataAdapter da = new SqlDataAdapter(); 
    da.SelectCommand = cmd; 

    DataTable dt = new DataTable(); 
    da.Fill(dt); 

    byte[] barrImg = (byte[])dt.Rows[1]["image"]; 

    MemoryStream mstream = new MemoryStream(); 

    mstream.Write(barrImg, 0, barrImg.Length); 
    mstream.Seek(0, SeekOrigin.Begin); 

    img.Image = Image.FromStream(mstream); 
    mstream.Close(); 

唯一的例外是:

Parameter is not valid.

Image.FromStream

碼。

我檢查了數據表分配給圖像字段的值。它是System.Byte[]。我追溯了代碼。每件事似乎都是正確的。但它不起作用。

我搜索了這個問題。另一個網站首選設置mstream.Position = 0。但那不行。

我用這段代碼存儲了我的圖片。如果它可能是我保存了這個錯誤!

string connstr = @"Data Source=.\SQLEXPRESS;AttachDbFilename=|DataDirectory|\db.mdf;Integrated Security=True;User Instance=True"; 

    SqlConnection conn = new SqlConnection(); 
    conn.ConnectionString = connstr; 

    conn.Open(); 

    SqlCommand cmd = new SqlCommand(); 
    cmd.Connection = conn; 

    string sql = "INSERT INTO tbl (name, family, image) VALUES ('name', 'family', '{0}')"; 
    sql = string.Format(sql, Image.FromFile("test.jpg")); 

    cmd.CommandText = sql; 
    cmd.ExecuteNonQuery(); 
    conn.Close(); 

新代碼保存圖像:

public byte[] ReadFile(string sPath) 
{ 
    byte[] data = null; 


    FileInfo fInfo = new FileInfo(sPath); 
    long numBytes = fInfo.Length; 

    FileStream fStream = new FileStream(sPath, FileMode.Open, FileAccess.Read); 

    BinaryReader br = new BinaryReader(fStream); 

    data = br.ReadBytes((int)numBytes); 

    return data; 
} 

和:

private void cmdSave_Click(object sender, EventArgs e) 
{ 
    string connstr = @"Data Source=.\SQLEXPRESS;AttachDbFilename=|DataDirectory|\db.mdf;Integrated Security=True;User Instance=True"; 

     byte[] imageData = ReadFile("test.jpg"); 

     SqlConnection CN = new SqlConnection(connstr); 

     string qry = "insert into tbl (name, family, image) VALUES ('name', 'family', '{0}')"; 
     qry = string.Format(qry, imageData); 

     SqlCommand SqlCom = new SqlCommand(qry, CN); 

     CN.Open(); 
     SqlCom.ExecuteNonQuery(); 
     CN.Close(); 
} 
+0

我稍微改變了這個問題,以便它反映了當前面臨的實際錯誤。之前提到的那個不是德國美人魚。 – NotMe 2012-02-10 22:51:44

+0

沒有也許關於它...... – 2012-02-10 22:53:04

+0

雖然我們在它,請張貼您的確切的錯誤信息。 – NotMe 2012-02-10 23:10:36

回答

1

您關閉流,然後嘗試從流中提取的圖像,因此錯誤「無法訪問封閉的溪流「。

嘗試更換您的最後兩行的順序:

img.Image = Image.FromStream(mstream); 
mstream.Close(); 
+0

它沒有工作。我測試了它。 – Amin 2012-02-10 22:20:37

+0

@JYelton:我假設你沒有閱讀,直到「我清除了行mstream.Close();但面對另一個Exceptioon說:參數無效。在代碼的最後一行代碼」) – 2012-02-10 22:22:33

+0

謝謝你提起來,放輕鬆! – Amin 2012-02-10 22:24:14

2

嗯,這是行不通的。

您的「存儲」圖像的代碼並沒有真正做到您認爲它的功能。

它將「test.jpg」放入圖像字段中。這不是二進制圖像數據;只有文件名

所以,當你去把它拉回到了Image.FromStream(mstream)呼叫要打擊塊,因爲值「test.jpg放在」不是一個圖像.. ERGO:在參數無效

這裏是的,你有什麼需要做實際上把圖像到數據庫的例子:

http://www.codeproject.com/Articles/21208/Store-or-Save-images-in-SQL-Server

+0

我這樣做了。它不起作用。 – Amin 2012-02-10 22:55:10

+0

@Amin:你做了什麼?你*應該*已經修改了你的圖像保存代碼。如果是這樣,請用新代碼更新您的問題。 – NotMe 2012-02-10 23:03:28

+0

我這樣做如下:代碼[sql = string.Format(sql,Image.FromFile(「test.jpg」));]查看主代碼。 – Amin 2012-02-10 23:05:20

0
using (MemoryStream mstream = new MemoryStream((byte[])dt.Rows[1]["image"])) 
{ 
    img.Image = Image.FromStream(mstream); 
} 

將簡化事情。我懷疑你的問題是你需要在寫之後和seek之前調用mStream.Flush()。

要將圖像放入數據庫,一種方法是。

string connstr = @"Data Source=.\SQLEXPRESS;AttachDbFilename=|DataDirectory|\db.mdf;Integrated Security=True;User Instance=True"; 

using(SqlConnection conn = new SqlConnection(connstr)) 
{ 
    using (SqlCommand comm = new SqlCommand(conn)) 
    { 
    comm.CommandText = "INSERT INTO tbl (name, family, image) VALUES (@name,@family,@Content)"; 
    comm.Parameters.Add(new SqlParameter("name",DbType.String,"Fred")); 
    comm.Parameters.Add(new SqlParameter("family",DbType.String,"Flintstone")); 
    using(FileStream fs = new FileStream("FredWilmaBamBamAndDino.jpg",FileMode.Open,FileAccess.Read)) 
    { 
     comm.Parameters.Add(new SqlParameter("content",DbType.Image,fs)); 
    } 
    cmd.ExecuteNonQuery(); 
    } 
} 

注意它將teh文件的內容放在數據庫中。由於在內容絕對不是字符串的情況下,使用參數化查詢。無論如何,你應該做什麼,養成一個好習慣。 你也需要使用,你的代碼泄漏資源到處都是。

+1

忘記它。問另一個問題。我如何存儲圖像,而不是它所在的文件的名稱,在我的數據庫.... – 2012-02-10 22:51:47

+0

我測試了這個,但面臨着同樣的異常。發生了什麼事? – Amin 2012-02-10 22:57:05

+0

當你將一個字符串放入它時,沒有必要在數據庫中檢索圖像!你想要這樣做的代碼,還是你想繼續使用你的版本,永遠不會? – 2012-02-10 23:33:07