Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/272.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 从SQL Server检索图像_C#_Sql Server 2008 - Fatal编程技术网

C# 从SQL Server检索图像

C# 从SQL Server检索图像,c#,sql-server-2008,C#,Sql Server 2008,我编写了这段代码,但遇到了一个异常,即:参数无效。 string connstr = @"Data Source=.\SQLEXPRESS;AttachDbFilename=|DataDirectory|\db.mdf;Integrated Security=True;User Instance=True"; SqlConnection conn = new SqlConnection(); conn.ConnectionString = connstr; c

我编写了这段代码,但遇到了一个异常,即:
参数无效。

    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();
例外情况是:

参数无效。

Image.FromStream
代码行中

我检查了datatable中分配给image字段的值。它是
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;
}
以及:


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

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

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

嗯,那是行不通的

你的“存储”图像的代码,其实并不像你想象的那样

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

因此,当您要将其拉出时,
Image.FromStream(mstream)
调用将导致块,因为值“test.jpg”不是图像。。因此:参数无效

以下是将图像实际放入数据库所需操作的示例:

会简化事情。我怀疑您的问题是,您需要在写入之后和查找之前调用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();
  }
}
注意,它将文件的内容放入数据库中。因为对于jpg,内容肯定不是字符串,所以使用参数化查询。不管怎样,你我应该做的就是养成一个好习惯。
您还需要使用suss out,因为您的代码到处都在泄漏资源。

@JYelton:我想您直到“我清除了行mstream.Close();但遇到另一个例外情况时才读到:参数无效。在代码下面的最后一行代码中;”谢谢你的提醒,别紧张@Tim指出了这一点,但这至少解决了一个问题。对于异常“参数无效…”,通常必须处理不正确图像类型或格式的数据。看看这些相关的问题:,我编辑了这篇文章。现在,如果我的图像保存方式有误,你可以查看它。我稍微修改了这个问题,以便它反映出当前面临的实际错误。先前命名的异常不是germaine。当我们进行此操作时,请发布准确的错误消息。System.Drawing.dll中出现“System.ArgumentException”类型的未处理异常。其他信息:参数无效。请忽略它。再问一个问题。我如何在我的数据库中存储图像而不是它所在的文件名……我对此进行了测试,但遇到了相同的异常。发生了什么?当你把一个字符串放在数据库中时,从数据库中检索一个图像的测试没有意义!您希望代码能够做到这一点,还是希望继续使用您的版本?这是一个有趣的解决方案。我永远不会去工作。这将把变量的类名放在数据库中,就像在System.Drawing.Image中一样。@Amin:你做了什么?您应该已经修改了图像保存代码。如果是这样,请用新代码更新您的问题。我是这样做的:代码[sql=string.Format(sql,Image.FromFile(“test.jpg”);]请参阅主代码。@Amin:在生成内联sql时使用string.Format将不起作用。请阅读链接文章。您必须将实际图像数据作为二进制对象传递给数据库服务器。最好的方法是通过参数化查询(无论如何你都应该这样做)。我今天早上读了这篇文章,对此我有问题。@Amin:你完全复制了这篇文章中的代码吗?如果是这样,请在上面重新构造保存代码,然后重新运行它并发布错误消息。
using (MemoryStream mstream = new MemoryStream((byte[])dt.Rows[1]["image"]))
{
    img.Image = Image.FromStream(mstream);
}
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();
  }
}