从SQL Server检索图像

时间:2012-02-10 22:15:45

标签: c# sql-server-2008

我写了这段代码,但遇到了一个例外:Parameter Not Valid.

    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();
}

3 个答案:

答案 0 :(得分:2)

嗯,那不行。

“存储”图像的代码,实际上并不像您认为的那样。

“test.jpg”放入图像字段。那不是二进制图像数据;只有文件名

所以,当你把它拉出来时,Image.FromStream(mstream)调用会打破块,因为值“test.jpg”不是图像.. ergo:参数无效< / em>的

以下是将图像实际放入数据库时​​需要做的一个示例:

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

答案 1 :(得分:1)

关闭流然后尝试从流中提取图像,因此错误“无法访问已关闭的流。”

尝试交换最后两行的顺序:

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

答案 2 :(得分:0)

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

会简化事情。我怀疑你的问题是你需要在写入之后和搜索之前调用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文件的内容放在数据库中。因为在jpg的情况下,内容绝对不是字符串,所以使用参数化查询。无论如何你应该做什么,养成一个好习惯。 您还需要使用,您的代码在整个地方泄漏资源。