2012-02-10 118 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