我有一个数据库(sql server 2008),我在visual studio 2010中使用c#。
我想与我的数据库建立连接。我已经为此编写了如下代码:
SqlConnection mySqlConnection = new SqlConnection
("Data Source=servername\\SQL2008; Initial Catalog=MyData;UID=MyID;PWD=mypassword;");
SqlCommand mySqlCommand = mySqlConnection.CreateCommand();
mySqlCommand.CommandText = "SELECT image_column FROM images_table ";
mySqlConnection.Open();
SqlDataReader productsSqlDataReader = mySqlCommand.ExecuteReader();
我不知道如何继续前进。我的意思是在执行上述语句后如何从阅读器中提取列?此外,我需要逐行遍历整个列并将每个图像转换为IContent项。我是否必须为此编写自己的转换器,或者是否有任何.NET类已经执行此操作?
继承人的情景。我有一个20列的表,其中一列是images_column。该列是唯一的列,其中的图像存储为二进制数据。 remainingig列是通常的整数(其大小值)和与该特定图像相关联的字符串(其名称,位置等)。我希望现在很清楚。
感谢。
答案 0 :(得分:1)
根据您在数据库中保存图像的方式,可以使用Bitmap类提取它们。它的构造函数需要几个不同的参数,例如Stream。例如。
您可以使用其Read功能从阅读器获取数据。如果你有一个有效的行,它会告诉你一个bool。您可以在if语句或while语句中使用它。
将数据从数据库列提供给MemoryStream,并将其提供给Bitmap构造函数。
while (productsSqlDataReader.Read()) {
MemoryStream stream = new MemoryStream((byte[])productsSqlDataReader["image_column"]);
new Bitmap(stream);
}
答案 1 :(得分:0)
我不确定您的问题究竟是什么,但要将图片作为Bitmap
与您的读者一起从列中删除,您可以使用以下内容。
while (productsSqlDataReader.Read())
{
byte[] buf = productsSqlDataReader["image_column"] as byte[];
using (MemoryStream ms = new MemoryStream(buf))
{
Bitmap bmp = Bitmap.FromStream(ms);
//do whatever with the bitmap BEFORE you dispose the stream
}
}
答案 2 :(得分:0)
string conn = "Data Source=servername\\SQL2008; Initial Catalog=MyData;UID=MyID;PWD=mypassword;";
using (SqlConnection dbConn = new SqlConnection(conn))
{
dbConn.Open();
string sql = "SELECT DATALENGTH(image_column), image_column FROM images_table ";
using (SqlCommand cmd = new SqlCommand(sql, dbConn))
{
using (SqlDataReader reader = cmd.ExecuteReader())
{
while (reader.Read())
{
int size = reader.GetInt32(0);
byte[] buff = new byte[size];
reader.GetBytes(1, 0, buff, 0, size);
MemoryStream ms = new MemoryStream(buff, 0, buff.Length);
ms.Write(buff, 0, buff.Length);
StoreImage(Image.FromStream(ms, true));
}
}
}
}