我写了这段代码,但遇到了一个例外: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();
}
答案 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的情况下,内容绝对不是字符串,所以使用参数化查询。无论如何你应该做什么,养成一个好习惯。 您还需要使用,您的代码在整个地方泄漏资源。