这里介绍两种种方法。
1,SqlDataReader的GetSqlBytes方法用于检索varbinary(max)列的内容。
reader = commandExecuteReader(CommandBehaviorSequentialAccess);
while (readerRead())
SqlBytes bytes = readerGetSqlBytes(0);
例1从NorthWind数据库的Employees表读取雇员图像并显示。SqlDataReader的GetSqlBytes方法返回一个SqlBytes对象,该对象公开Stream属性。使用该属性创建新的Bitmap对象,然后以Gif ImageFormat格式保存到Stream。
private void ReadPhoto(string lastName) //读取雇员图像并显示
{
using (SqlConnection connection = new SqlConnection(ConnectionString))
{
Stream s = new MemoryStream(); //创建一个以内存为后备存储的流
SqlCommand command = connectionCreateCommand();
SqlDataReader reader = null;
try
{
commandCommandText = "SELECT LastName,Photo FROM dboEmployees " +
" WHERE LastName=@LastName";
commandCommandType = CommandTypeText;
//声明参数并赋值
SqlParameter parameter = new SqlParameter("@LastName", SqlDbTypeNVarChar, 20);
parameterValue = lastName;
commandParametersAdd(parameter);
connectionOpen();
//修改DataReader的默认行为,SequentialAccess按顺序接收数据并立即加载
//CloseConnection指明关闭DataReader时,对数据库的连接也关闭
reader = commandExecuteReader(
CommandBehaviorSequentialAccess|CommandBehaviorCloseConnection);
if (readerHasRows)
{
while (readerRead())
{
//SequentialAccess要求按顺序接收数据,先接受reader[0]
thislabel1Text = reader[0]ToString();
if (readerIsDBNull(1)) //若列值为空返回
return;
else
{
//使用readerGetSqlBytes获取图像数据
SqlBytes bytes = readerGetSqlBytes(1);
using (Bitmap productImage = new Bitmap(bytesStream))
{
//以gif格式保存在Stream流并显示
productImageSave(s, SystemDrawingImagingImageFormatGif);
thispictureBox1Image = SystemDrawingImageFromStream(s);
} } }
}
else
MessageBoxShow("No records returned");
}
catch (Exception ex)
{
MessageBoxShow(exMessage);
}
Finally
{
if (reader != null)
readerDispose(); //关闭DataReader,同时关闭对数据库连接
}
sClose(); //关闭流
}
}
本程序将DataReader设置为SequentialAccess,要求顺序访问字段,所以先读取LastName小数据,再读取图像大数据。程序运行后从组合框选取雇员的LastName,将在图形框出现雇员的图像,
2,SqlDataReader的GetSqlBinary方法可用于检索varbinary(max)列的内容。
reader = commandExecuteReader(CommandBehaviorCloseConnection);
while (readerRead())
SqlBinary binaryStream = readerGetSqlBinary(0);
例2 AdventureWorks2008数据库中的ProductionProductPhoto表含有图形列LargePhoto,数据类型是varbinary(max),可空。用GetSqlBinary方法检索图形数据的代码如下:
private void ReadPhoto(int documentID) //输入参数documentID是产品ID
{
using (SqlConnection connection = new SqlConnection(GetConnectionString()))
{
thislabel1Text = documentIDToString();
try
{
string queryString = "SELECT LargePhoto FROM ProductionProductPhoto " +
"WHERE ProductPhotoID=@ProductPhotoID";
SqlCommand command = new SqlCommand(queryString, connection);
SqlParameter paramID = new SqlParameter("@ProductPhotoID", SqlDbTypeInt);
paramIDValue = documentID;
commandParametersAdd(paramID);
connectionOpen();
//修改DataReader的默认行为
SqlDataReader reader = commandExecuteReader(
CommandBehaviorSequentialAccess|CommandBehaviorCloseConnection);
if (readerHasRows)
{
while (readerRead())
{
if (readerIsDBNull(0))
return;
else
{
Stream s = new MemoryStream();
SqlBinary binaryStream = readerGetSqlBinary(0);
//根据SqlBinary值初始化SqlBytes类的新实例
SqlBytes bytes = new SqlBytes(binaryStream);
using (Bitmap productImage = new Bitmap(bytesStream))
{
//用gif格式保存图形
productImageSave(s, SystemDrawingImagingImageFormatGif);
thispictureBox1Image = SystemDrawingImageFromStream(s);
}
sClose();
} }
}
else
MessageBoxShow("No records returned");
}
catch (Exception ex)
{
MessageBoxShow(exMessage);
} }
}
下图为documentID=100的自行车类型
以上示例取自C#编程指南但尧编著清华大学出版社2011年1月
首先定义一个函数将转化为二进制码
//定义将转化为长二进制代码的函数getphoto()
public Byte[] getphoto(string photopath)
{
string str = photopath;
FileStream file = new FileStream(str, FileModeOpen, FileAccessRead);
Byte[] bytBLOBData = new Byte[fileLength];
fileRead(bytBLOBData, 0, bytBLOBDataLength);
fileClose();
return bytBLOBData;
}//这是定义函数
然后就是将转换成二进制码的插入数据库中下面是简单的也是重要的sql语句
if (thispictureBox1Image != null)
{
sql1 = sql1 + ",Photo";
sql2 = sql2 + ",bytBLOBData";
Byte[] bytBLOBData = getphoto(openFileDialog1FileName);
cmdParametersAdd(new OleDbParameter("jpeg", OleDbTypeBinary, bytBLOBDataLength, ParameterDirectionInput, true, 0, 0, null, DataRowVersionDefault, bytBLOBData));
}
接下来是读取
string sql = "select photo from studentinfo where studentid = " + thisTagToString();
OleDbCommand cmd = new OleDbCommand(sql, connection1);
if (ConvertDBNull != cmdExecuteScalar())
pictureBox1Image = ImageFromStream(new MemoryStream((Byte[])cmdExecuteScalar()));//读取长二进制为
//--用自己的初始连接 初始一个SQL连接实体
MyDataSQLDataContext dbc = new MyDataSQLDataContext("Data Source=;Initial Catalog=TEXT;uid=sa;pwd=8888;");
DataSet ds = null;
string commads = "SELECT [name],[photo] FROM [TABE1]";
ds = dbcGetDataSet(commads);
if (ds != null && dsTablesCount > 0 && dsTables[0]RowsCount > 0)
{
for (int i = 0; i < dsTables[0]RowsCount; i++)
{
try
{
//--判断字段数据是否有数据且有照片流数据
if (((Byte[])dsTables[0]Rows[i]["photo"])Length > 0 && ((Byte[])dsTables[0]Rows[i]["photo"])Max() > 0)
{
byte[] aa = (Byte[])dsTables[0]Rows[i]["photo"];
Bitmap bit = new Bitmap(new SystemIOMemoryStream((Byte[])dsTables[0]Rows[i]["photo"]));
//--保存照片
pictureBox1Image = bit;
}
}
catch (Exception ex)
{ MessageBoxShow(exToString()); }
dsClear(); dsDispose();
}
}
试试
方法/步骤1
先从左侧的工具栏拖进控件Button和RichTextBox。
接着在RichTextBox中写上连接数据库的字符串。
Data Source=AH;Initial Catalog=DS20;User ID=sa;password=xxxxxxx;
Data Source:数据库服务器名称。
Initial Catalog:数据库名称。
User ID:数据库用户名。
password:数据库连接密码。
双击Button按钮,进入按钮点击事件,添加访问数据库的代码。这里代码的意思是,尝试连接SQL数据库,如果连接成功则显示“OK”,如果连接失败则显示失败信息。
SqlConnection:表示数据库SQL连接的类。
Open():打开数据库。
Exception i:获取连接失败SQL的信息。
接下来分别演示“连接成功”和“连接失败”的效果。
假设你动态添加的textbox为:
TextBox text1 = new TextBox();
text1Name = "text1";
text1Top = 10;
text1Left = 20;
thisControlsAdd(text1);
则获取Text方法为:
TextBox txt = (TextBox)thisControls["text1"];
string s=txtText;
然后传到数据库里就行了(数据库Insert或Update)
这个我可以有,
// 你要刷新哪条就更新哪行,listView1items[索引],取到索引行
ListViewItem lvi = listView1Items[0];
lviText = "更新的字段一";
lviSubItems[1]Text = "更新的字段二";
lviSubItems[2]Text = "更新的字段三";
以上就是关于C#读出SQL数据库中存储的图片到picturebox全部的内容,包括:C#读出SQL数据库中存储的图片到picturebox、winform 中如何将图片以二进制存到数据库中、使用C#读取SQL数据库中的图片等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)