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