1、杨教授工作室 精心创作的优秀程序员 职业提升必读系列资料杨教授工作室,版权所有,盗版必究, 1/17 页11.1 跟我学 VS#语言编程技术操作数据库中的二进制字段的应用示例所谓二进制字段,是指任何二进制类型的文件,可以保存在数据库的字段中,如图像文件或者 Word 文档文件等。 对二进制字段,在 Access 数据库中一般设计为 OLE 对象,而在SQLServer 中则设计为 image 类型。下面通过两个应用的实例来说明实现的方法。1.1.1 将 Word 文档文件存储到数据库表中的应用示例数据库字段的数据为 Word 文档文件由于 Word 文档通常比较大,所以在对数据库操作时并不希望
2、将所有的记录全部调入内存,而是希望当用户浏览到所需要的 Word 文档所在的记录时,再将它所对应的 Word 文档字段调入内存比较合适。所以构造两个连接,第一个是除去大二进制字段的数据集,主要用于显示基础信息(作为浏览内容),第二个则只调入需要的那条记录,再该记录中包括需要处理的 Word 文档大二进制字段。1、设计包含有 Word 文档的数据表在 DataBase 数据库文件中新增一个数据表,包含 Word 文档的数据库表结构如下,表名为 WordBinData:ID int 4 主键,自动增加FileName nvarchar 20WordFile image 16杨教授工作室 精心创作的
3、优秀程序员 职业提升必读系列资料杨教授工作室,版权所有,盗版必究, 2/17 页22、设计一个 C#的应用程序项目其界面如下:一个 DataGrid 控件和五个按钮。3、加入两个 SqlDataAdapter 控件,都连接到 Word 表但 sqlDataAdapter1 控件连接到 Word 表中的 ID 和 FileName 字段。目的是只显示基本的数据以快速导航,当查看到指定的记录时再显示详细的数据。杨教授工作室 精心创作的优秀程序员 职业提升必读系列资料杨教授工作室,版权所有,盗版必究, 3/17 页3而 sqlDataAdapter2 控件连接到 Word 表中的 ID 和 File
4、Name、WordFile 字段杨教授工作室 精心创作的优秀程序员 职业提升必读系列资料杨教授工作室,版权所有,盗版必究, 4/17 页4注意:两个连接的表是相同的,所以 DataSet 建立表的时候发生重名;需要将 sqlDataAdapter1的 TableMaping 属性修改表的名字为 WordBinData。而需要利用 sqlDataAdapter2 的杨教授工作室 精心创作的优秀程序员 职业提升必读系列资料杨教授工作室,版权所有,盗版必究, 5/17 页5TableMaping 属性来设置修改表的名字为 WordBinDataAll。4、生成数据集选择“数据”菜单中的“生成数据集”
5、子菜单。5、将 DataGrid 的 DataSource 属性设置为 dataSet11.WordBinData 数据表以进行绑定。杨教授工作室 精心创作的优秀程序员 职业提升必读系列资料杨教授工作室,版权所有,盗版必究, 6/17 页66、编程各个按钮的事件private void button1_Click(object sender, System.EventArgs e) /下载数据dataSet11.Clear();sqlDataAdapter1.Fill(dataSet11);private void button2_Click(object sender, System.Eve
6、ntArgs e) /保存为本地文件int RowNum=dataGrid1.CurrentRowIndex; /获取当前行号dataSet11.Tables“WordBinDataAll“.Clear();/当前行完成数据下载sqlDataAdapter2.SelectCommand.CommandText=“select * from WordBinData where ID=“+dataSet11.Tables“WordBinData“.RowsRowNum“ID“.ToString();sqlDataAdapter2.Fill(dataSet11);string saveFileNam
7、e;SaveFileDialog saveDlg=new SaveFileDialog();saveDlg.Filter = “Word 文档|*.Doc“;if (saveDlg.ShowDialog() = DialogResult.OK)trysaveFileName = saveDlg.FileName;/构造一个文件流和一个二进制流,注意添加 using System.IO;FileStream fs;BinaryWriter bw;byte outbyte;outbyte=(byte)dataSet11.Tables“WordBinDataAll“.Rows0“WordFile“;
8、fs = new FileStream(saveFileName, FileMode.OpenOrCreate, FileAccess.Write);bw = new BinaryWriter(fs);/把数组中的 Word 文档的数据保存到文件中bw.Write(outbyte);bw.Close();杨教授工作室 精心创作的优秀程序员 职业提升必读系列资料杨教授工作室,版权所有,盗版必究, 7/17 页7fs.Close();statusBar1.Text = “已经保存“;catchstatusBar1.Text = “保存错误“;private void button3_Click(o
9、bject sender, System.EventArgs e) /修改文件字段int RowNum=dataGrid1.CurrentRowIndex; /把选中行的全部数据调进来sqlDataAdapter2.SelectCommand.CommandText=“select * from WordBinData where ID=“+dataSet11.Tables“WordBinData“.RowsRowNum“ID“.ToString();dataSet11.Tables“WordBinDataAll“.Clear();sqlDataAdapter2.Fill(dataSet11)
10、;string curFileName;OpenFileDialog openDlg=new OpenFileDialog(); /从当地文件系统调入文件内容openDlg.Filter = “Word 文档|*.Doc“;if (openDlg.ShowDialog() = DialogResult.OK)trycurFileName = openDlg.FileName; /获得用户所选择的文件名称/构造一个流对象,文件名是选中的文件FileStream fs = new FileStream(curFileName, FileMode.OpenOrCreate, FileAccess.R
11、ead);byte rawData= new bytefs.Length; /构造一个动态字节数组/读流对象,从 0 开始,长度是 fs 的长度fs.Read(rawData, 0, System.Convert.ToInt32(fs.Length);fs.Close();/把数据写进数据库dataSet11.Tables“WordBinDataAll“.Rows0“WordFile“ = rawData; 杨教授工作室 精心创作的优秀程序员 职业提升必读系列资料杨教授工作室,版权所有,盗版必究, 8/17 页8dataSet11.Tables“WordBinDataAll“.Rows0“Fi
12、leName“=dataSet11.Tables“WordBinData“.RowsRowNum“FileName“;sqlDataAdapter2.Update(dataSet11); /提交数据以保存到数据库中statusBar1.Text = “修改正确“;catchstatusBar1.Text = “修改错误“;private void button4_Click(object sender, System.EventArgs e) /提交sqlDataAdapter1.Update(dataSet11);private void button5_Click(object sende
13、r, System.EventArgs e) /删除记录int RowNum=dataGrid1.CurrentRowIndex;dataSet11.Tables“WordBinData“.RowsRowNum.Delete();sqlDataAdapter1.Update(dataSet11);7、执行该程序杨教授工作室 精心创作的优秀程序员 职业提升必读系列资料杨教授工作室,版权所有,盗版必究, 9/17 页9注意:1) 由于开始的时候,数据库表中没有数据;因此,在 FileName 字段中输入信息,然后点击“提交”按钮,将数据真正地写到数据库的数据文件中。2) 然后,再点击“保存 Wor
14、d 文件到数据库”按钮,再通过对话框内实现将 WordBinData 文档保存到数据库中。3) 通过点击“保存为本地文件”按钮以显示出1.1.2 图片字段的处理技术及相关的应用示例1、设计数据库表同样道理,当然也可以处理图形文件问题,假定图片放在 Access 数据库中 HR.MDB,表名 PHOTO,字段如下:ID 自动编号EMPID 文本PHOTO OLE 对象2、设计出一个 C#应用程序项目杨教授工作室 精心创作的优秀程序员 职业提升必读系列资料杨教授工作室,版权所有,盗版必究 , 10/17 页10并构造出 GUI 界面:包含有四个按钮、DataGrid 和 PictureBox、状态
15、条 StatusBar。3、添加 OleDataAdapter 控件,以连接到 ImageDB.MDB 数据库的 PHOTO 表名4、生成数据集并将数据集中的指定表名称的对象与 DataGrid 控制相绑定。杨教授工作室 精心创作的优秀程序员 职业提升必读系列资料杨教授工作室,版权所有,盗版必究 , 13/17 页135、将数据集中的指定表名称的对象与 DataGrid 控制相绑定。6、编程各个按钮的事件响应程序/*ImageConverter 是可用于将 Image 对象从一种数据类型转换为另一种数据类型的类。其名称空间为 System.Drawing*/ImageConverter img
16、= new ImageConverter();Image curImage;杨教授工作室 精心创作的优秀程序员 职业提升必读系列资料杨教授工作室,版权所有,盗版必究 , 14/17 页14int RowNum; /保存当前行号private void Form1_Load(object sender, System.EventArgs e)oleDbDataAdapter1.Fill(dataSet11);RowNum = 0;try /显示当前行的图形curImage = (Image)img.ConvertFrom(dataSet11.Tables0.Rows0“photo“);pictu
17、reBox1.Image = curImage;catchstatusBar1.Text = “无图形数据“;private void dataGrid1_CurrentCellChanged(object sender, System.EventArgs e)try/行号不同才进行重新显示if (RowNum != dataGrid1.CurrentCell.RowNumber)RowNum = dataGrid1.CurrentCell.RowNumber;curImage = (Image)img.ConvertFrom(dataSet11.Tables0.RowsRowNum“phot
18、o“);pictureBox1.Image = curImage;statusBar1.Text = “显示图形正确 “;catchstatusBar1.Text = “显示图形错误“;private void button1_Click(object sender, System.EventArgs e) /更新数据库中的字段oleDbDataAdapter1.Update(dataSet11);杨教授工作室 精心创作的优秀程序员 职业提升必读系列资料杨教授工作室,版权所有,盗版必究 , 15/17 页15private void button2_Click(object sender, S
19、ystem.EventArgs e) /将图像保存到数据库中string curFileName;OpenFileDialog openDlg=new OpenFileDialog();openDlg.Filter = “jpg 图形文件|*.jpg“;if (openDlg.ShowDialog() = DialogResult.OK)trycurFileName = openDlg.FileName; /获得用户所选择的图像文件名/构造一个流对象,文件名是选中的文件,需要引入 using System.IO;FileStream fs = new FileStream(curFileNam
20、e, FileMode.OpenOrCreate, FileAccess.Read);byte rawData= new bytefs.Length; /构造一个动态字节数组/读流对象,从 0 开始,长度是 fs 的长度fs.Read(rawData, 0, System.Convert.ToInt32(fs.Length); fs.Close();dataSet11.Tables0.RowsRowNum2 = rawData;oleDbDataAdapter1.Update(dataSet11);/显示新的图形curImage =(Image)img.ConvertFrom(dataSet1
21、1.Tables0.RowsRowNum“photo“);pictureBox1.Image = curImage;statusBar1.Text = “完成更新“;catchstatusBar1.Text = “修改错误“;private void button3_Click(object sender, System.EventArgs e) /从数据库中获得图像string saveFileName;杨教授工作室 精心创作的优秀程序员 职业提升必读系列资料杨教授工作室,版权所有,盗版必究 , 16/17 页16SaveFileDialog saveDlg=new SaveFileDial
22、og();saveDlg.Filter = “jpg 图形文件|*.jpg“;if (saveDlg.ShowDialog() = DialogResult.OK)trysaveFileName = saveDlg.FileName;FileStream fs;BinaryWriter bw;byte outbyte;outbyte =(byte)dataSet11.Tables0.RowsRowNum2;fs = new FileStream(saveFileName, FileMode.OpenOrCreate, FileAccess.Write);bw = new BinaryWrite
23、r(fs);bw.Write(outbyte);bw.Close();fs.Close();statusBar1.Text = “已经保存“;catchstatusBar1.Text = “保存错误“;private void button4_Click(object sender, System.EventArgs e) /删除数据库中的某图像dataSet11.Tables0.RowsRowNum.Delete();oleDbDataAdapter1.Update(dataSet11);7、执行该程序杨教授工作室 精心创作的优秀程序员 职业提升必读系列资料杨教授工作室,版权所有,盗版必究 , 17/17 页17可以将磁盘中的某一图像保存到数据库中,也可以将数据库中的某一图像存储到磁盘文件中。