数据库与ADO - web.suda.edu.cn

74
1 数据库与ADO.Net 数据库提供了一种将信息集合在一起的方法。 数据库应用系统主要由三部分组成:数据库管理系 (DBMS),是针对所有应用的,例如Access。数 据库本身,是按一定的结构组织在一起的相关数据。 数据库应用程序,它是针对某一具体数据库应用编 制的程序,用来获取,显示和更新数据库存储的数 据,方便用户使用。这里讲的是如何编写数据库应 用程序。 常见的数据库管理系统有: FoxProAccessOracleSQLserverSybase等。数据库管理系统 主要基于3种数据模型:层次模型、网状模型、关 系模型。

Transcript of 数据库与ADO - web.suda.edu.cn

Page 1: 数据库与ADO - web.suda.edu.cn

1

数据库与ADO.Net

数据库提供了一种将信息集合在一起的方法。数据库应用系统主要由三部分组成:数据库管理系统(DBMS),是针对所有应用的,例如Access。数

据库本身,是按一定的结构组织在一起的相关数据。数据库应用程序,它是针对某一具体数据库应用编制的程序,用来获取,显示和更新数据库存储的数据,方便用户使用。这里讲的是如何编写数据库应用程序。

常见的数据库管理系统有:FoxPro,Access,Oracle,SQLserver,Sybase等。数据库管理系统主要基于3种数据模型:层次模型、网状模型、关系模型。

Page 2: 数据库与ADO - web.suda.edu.cn

2

目前应用最广泛的是基于关系模型的关系数据

库,以上所列数据库管理系统都是关系数据库。一

个关系数据库由若干表组成,表是一组相关的数据

按行排列,例如一个通信录就是这样一个表,表中

的每一列叫做一个字段,例如通信录中的姓名,地

址,电话都是字段。字段包括字段名及具体的数据,

每个字段都有相应的描述信息,例如数据类型,数

据宽度等。表中每一行称为一条记录。

利用ADO.Net技术可以开发数据库应用程序。

Page 3: 数据库与ADO - web.suda.edu.cn

38.1 设计数据库应用程序的基本步骤设计一个数据库应用程序可以采用连接方式和不连接方式。

所谓连接方式,是数据库应用程序通过SQL语句直接对数据

库操作,例如,查找记录、删除记录、修改记录。所谓不连接方式,是数据库应用程序把数据库中感兴趣的数据读入,建立一个副本,数据库应用程序对副本进行操作,必要时将修改的副本存回数据库。使用ADO.Net设计一个不连接方式数据库应用程序一般包括以下基本步骤:

1. 创建数据库,包括若干个表,在表中添入数据(若干记录)。

2. 使用SqlConnection或OleDbConnection类建立数据库应用程序和数据库的连接。

3. 使用OleDbAdapter或SqlDataAdapter类对象从数据库指定表中取出感兴趣的记录。

Page 4: 数据库与ADO - web.suda.edu.cn

4

4. 从数据库指定表中取出的感兴趣记录做成一个新表,填充到DataSet类对象中,可填充多个表,并可在DataSet类对象中指定表和表的关系。DataSet对象建立在内存中,可以认为是数据库在内存中的一个子集。取出所有感兴趣的数据后,断开和数据库的连接。

5. 用支持数据绑定的控件(例如DataGraid控件)显示DataSet类对象中的数据,供用户浏览、查询、修改。

6. 及时更新DataSet中的内容,并把修改的数据存回源数据库。

8.1 设计数据库应用程序的基本步骤(续)

Page 5: 数据库与ADO - web.suda.edu.cn

5

8.1 设计数据库应用程序的基本步骤(续)

设计一个连接方式数据库应用程序一般包括以下基本步骤:

1. 建立数据库,包括若干个表,在表中添入数据(若干记录)。

2. 使用SqlConnection或OleDbConnection类建立数据库应用程序和数据库的连接对象。

3. 使用OleDbCommand或SQLCommand类对象用SQL语句来访问数据库中的数据,直接在数据库的表中查询指定记录、增加记录、删除记录,修改记录中的数据。

VS2005速成版仅支持OLE DB和SQL Server文件系统数据库。

Page 6: 数据库与ADO - web.suda.edu.cn

6

8.2 用SQL Server Express创建数据库

【例8.1】用SQL Server Express创建一个学生信息管理系统,包括两个表,表1记录学生的基本情况,包括以下字段:学号、姓名、性别。表2记录学生的学习成绩,包括以下字段:记录编号、课程名称、分数、拥有该课程成绩学生的学号。由于要记录全校所有学生的成绩,把学习成绩表字段定义为:学号、语文成绩、数学成绩、物理成绩等字段是不合适的,这样做,增加一门课程,就要增加一个字段,字段要动态增加,而且不同专业所开设的课程也不相同,某些课程字段只是个别专业使用,这显然不合理。创建数据库具体步骤如下:

Page 7: 数据库与ADO - web.suda.edu.cn

7运行VS2005程序,选择菜单“视图(V)|其他窗口(E)|数据

资源管理器(D)”菜单项,打开“数据资源管理器”窗体:

Page 8: 数据库与ADO - web.suda.edu.cn

8右击字符"数据连接",在快捷菜单中选择"添加连接(A)…"菜单项,

Page 9: 数据库与ADO - web.suda.edu.cn

9打开建立数据库连接对话框,按图中那样填写,单击确定按钮

Page 10: 数据库与ADO - web.suda.edu.cn

10在“数据资源管理器”窗体中展开StudentI.mdf,右击字符“表”,在快捷菜单中,选择“添加新表(T)”菜单项,如下图,为新表增加字段。创建学号字

段StudentNum,int类型,必填字段,默认值为0。姓名字段StudentName,nvarchar(20) 类型。性别字段StudentSex,nchar(1)类型,注意一个中文字符或英文字符长度都为1。右击字段StudentNum,在弹出快捷菜单中单击"设置主键(Y)"菜单项,设置字段StudentNum为主关键字,这样每个学生的学号都不能相同,可以用学号字段区分不同记录,方便查询。结果如图8.2。单击工具条"保存"按钮保存该表,表名为"Student"。

Page 12: 数据库与ADO - web.suda.edu.cn

12在“数据资源管理器”窗体中,右击字符“Student”,在快捷菜单中,选择“显示表数据(S)”菜单项,打开新窗体,可以为“Student ”表

各个字段输入数据,例如:1,张三,男;2,李四,女;3,王五,男;4,鲁豫,女。如下图:

同样方法建立表Score,记录所有学生学习成绩。包括记录编号字段ScoreID,int类型,主关键字;课程名称字段ClassName,nvarchar(30)类型;分数字段Score,int类型;拥有该课程成绩学生的学号字段StudentNum,int类型,必填字段。增加若干数据。

Page 14: 数据库与ADO - web.suda.edu.cn

14

8.3 结构化查询语言SQL

数据库应用程序通过SQL(Structed Query

Language,结构化查询语言)来访问数据库中的数据,

使用SQL语句可以在数据库的表中查询指定记录、增

加记录、删除记录,修改记录中的数据。几乎所有

的数据库都支持SQL语言,编写数据库应用程序必须

学习SQL语言。这里只介绍最基本的SQL语句,读者

还应更深入的学习SQL语言。Select语句是最常用的

SQL语句,可以从数据库的表中获得满足一些条件的

记录集。常见的SQL语句如下:

Page 15: 数据库与ADO - web.suda.edu.cn

15• select * from student:

• select StudentNum,StudentName from student:

• select * from score where StudentNum=1:

• Insert Into student(StudentNum,StudentName,

StudentSex)Value(5,“田七”,“男”):

• Delete From student where StudentNum=1:

• Update Student Set StudentName=“陈七”

Where StudentNum=1:

Page 16: 数据库与ADO - web.suda.edu.cn

168.4 连接数据库(SqlConnection和OleDbConnection类)

如数据库应用程序连接微软的SQL Server Express数据库,使 用 SqlConnection 类 建 立 连 接 效 率 较 高 。 使 用SqlConnection 类 必 须 引 用 如 下 命 名 空 间 : usingSystem.Data; using System.Data.SqlClient; 使 用SqlConnection类建立连接对象的例子如下:

String s="Data Source=.\\SQLEXPRESS;

AttachDbFilename=D:\\StudentI.mdf;

Integrated Security=True;Connect Timeout=30;

User Instance=True ";

SqlConnection conn=new SqlConnection(s);

Conn.Open()建立连接

//方法Open()和Close(),连接和断开数据库连接。

Page 17: 数据库与ADO - web.suda.edu.cn

178.5OleDbCommand和SQLCommand类

建立连接后,ADO.Net可以通过OleDbCommand或

SQLCommand类对象用SQL语句来访问数据库中的数

据,在数据库表中查询指定记录、增加记录、删

除记录、修改记录中的数据。例如建立一个

SQLCommand类查询对象方法如下:

string s="SELECT * FROM student";

SQLCommand Command1=new SQLCommand(s,conn);

Command1.ExecuteNonQuery(); //执行SQL语句

Page 18: 数据库与ADO - web.suda.edu.cn

18【例8.2】采用连接方式的数据库应用程序例子。有时,数据库应用程序使用连接方式可能更方便一些,例如,用户的注册信息应该立即存到数据库表中。下边的例子模拟用户注册,首先请用户输入个人信息,单击注册按钮,用SQL语句把数据存到前边用SQL Server Express创建的StudentI数据库的Student表中。在Form1.cs文件头部引入命名空间using System.Data.SqlClient;为Form1类增加变量:SqlConnection conn; SqlCommand da;

Page 19: 数据库与ADO - web.suda.edu.cn

19private void button1_Click(object sender,EventArgs e)

{ if(textBox1.Text==""||textBox2.Text=="“

||textBox3.Text=="")

{ MessageBox.Show("所有项都必须填写!");

return; }

string txt1="Data Source=.\\SQLEXPRESS;

AttachDbFilename=D:\\StudentI.mdf;

Integrated Security=True;Connect Timeout=30;

User Instance=True ";

string txt2="Insert Into Student(StudentNum,

StudentName,StudentSex) Values('";

txt2+=textBox1.Text + "' , '";

txt2+=textBox2.Text + "' , '";

txt2+=textBox3.Text+"')";

Page 20: 数据库与ADO - web.suda.edu.cn

20conn=new SqlConnection(txt1);

conn.Open(); //打开数据库连接

da=new SqlCommand(txt2, conn);

da.ExecuteNonQuery(); //执行SQL语句

textBox1.Text="";

textBox2.Text="";

textBox3.Text="";

conn.Close();

}

Page 21: 数据库与ADO - web.suda.edu.cn

218.6 OleDbAdapter和SqlDataAdapter类OleDbAdapter或SqlDataAdapter类包括如下属性:SelectCommand、InsertCommand、DeleteCommand

和UpdateCommand,可以赋值为相应的SQL语句,

实现对数据库中的数据的选择,插入,更新,删除等功能。这两个类隐藏了OleDbCommand或SQLCommand类操作数据库的细节,方便使用。在不连接方式数据库应用程序中,一般使用这两个类的方法Fill()和Update()填充和更新DataSet类对象,具体例

子参见以后章节。如果使用SqlDataAdapter类建立连接对象,建立SqlDataAdapter对象语句如下:

Page 22: 数据库与ADO - web.suda.edu.cn

22

string txtConn="Data Source=.\\SQLEXPRESS;

AttachDbFilename=D:\\vc#\\StudentI.mdf;

Integrated Security=True;Connect

Timeout=30;User Instance=True";

SqlConnection conn=new SqlConnection(txtConn);

string s = "SELECT * FROM Student";

SqlDataAdapter da = new SqlDataAdapter(s, conn);

Page 23: 数据库与ADO - web.suda.edu.cn

238.7 DataSet类对象

可使用OleDbAdapter或SqlDataAdapter类从数据库指定表中取出感兴趣的记录,将这些记录集合做成一个新表,填充到DataSet类对象中。可在DataSet类对象中填充多个表,并可在DataSet类对

象中指定表和表的关系,以及指定对表包含数据的约束信息。DataSet对象被建立在内存中,可以认为是数据库在内存中的一个子数据库。DataSet对象只

在获取或更新数据时保持和数据库连接,其他时间都是断开的,使数据库可以自由执行其他任务。尽管数据集是作为从数据库获取的数据的缓存,但数据集与数据库之间没有任何实际关系。

Page 24: 数据库与ADO - web.suda.edu.cn

248.7.1使用DataSet类的必要性

在传统的数据库应用程序中,数据库应用程序通过SQL语句直接对数据库操作,在操作数据过程中保

持连接状态。出于各种原因,该方法在许多数据库应用程序中是不实用的。

• 一个数据库只可以维持少量的并发连接。

• 在Web应用中,浏览器从服务器请求网页,服务器发

送该页后,服务器就不再与浏览器有任何连接,直到下一次请求为止。

• 如果数据库应用程序的多个控件需对数据库数据操作,则多个控件都必须和数据库建立连接。

• 异构数据库的数据交换。

Page 25: 数据库与ADO - web.suda.edu.cn

258.7.2使用DataSet类对象

string txtConn="Data Source=.\\SQLEXPRESS;

AttachDbFilename=D:\\vc#\\StudentI.mdf;

Integrated Security=True;Connect Timeout=30;User

Instance=True";

SqlConnection conn=new SqlConnection(txtConn);

string s = "SELECT * FROM Student";

SqlDataAdapter da = new SqlDataAdapter(s, conn);

DataSet ds = new DataSet();

da.Fill(ds, “Student”); //自动建立连接填充后关闭

if(ds.HasChanges()) //检查DataSet是否有改动

da.Update(ds); //更新数据库

Page 26: 数据库与ADO - web.suda.edu.cn

268.8 数据绑定概念和BindingSource组件所谓数据绑定技术是把数据集(例如:DataSet、数组)

的某个或某些数据与控件的某些能够显示的属性绑定在一起的技术,这些控件可以是Label、ListBox、DataGridView等数据显示控件,当这些控件完成数据绑定后,这些被绑定的属性显示的值将随着数据集中被绑定的数据变化而变化。BindingSource 组件是将ListBox、DataGridView等数据显示控件绑定到数据集的中间层,BindingSource 组件首先绑定到数据集,然后将ListBox、DataGridView等数据显示控件绑定到BindingSource组件,利用BindingSource组 件 提 供 的 功 能 , 不 用 编 程 , ListBox 、DataGridView等数据显示控件可以很容易的实现导航、排序、筛选和更新。BindingSource 组件常用属性及构造函数如下:

Page 27: 数据库与ADO - web.suda.edu.cn

27• DataSource属性:绑定的数据源,可以是DataSet对象,也可以是集合类对象(如List)。

• DataMember属性:如DataSource是DataSet对象,该属性为DataSet对象中的表名。

• Sort属性:指定绑定数据的排序列名称、排序表达式、排序顺序。

• Filter属性:指定显示数据源中的那些数据。

• 无参数构造函数():建立BindingSource类对象,以上4个属性为空。

【例8.3】本例将studentI.mdf数据库的student表中所有记录用DataGridView显示。在Form1.cs文件头部增加语句using

System.Data.SqlClient;放置控件DataGridView到主窗体。为Form1类增加变量:SqlConnection conn;SqlDataAdapter da;

DataSet ds;BindingSource bindingSource1;修改Form1类构造函数如下(注意SQL2005数据库速成版的连接字符串格式):

Page 28: 数据库与ADO - web.suda.edu.cn

28public Form1()

{ InitializeComponent();

string txtConn="Data Source=.\\SQLEXPRESS; AttachDbFilename=D:\\vc#\\StudentI.mdf; Integrated Security=True;Connect Timeout=30;User Instance=True";

conn=new SqlConnection(txtConn);

string s = "SELECT * FROM Student";

da = new SqlDataAdapter(s, conn);

ds = new DataSet();

da.Fill(ds, "Student");

bindingSource1=new BindingSource();

bindingSource1.DataSource=ds;

bindingSource1.DataMember="Student";

bindingSource1.Filter="StudentSex='男'"; bindingSource1.Sort="StudentNum DESC";

dataGridView1.DataSource=bindingSource1; }

Page 30: 数据库与ADO - web.suda.edu.cn

30

8.9 DataGridView控件

当DataGraidView控件的属性DataSource被正确设定,DataGraidView控件将以网格形式正确显示DataSet对象中相应数据表。DataGraid控件中的数据被修改后,DataSet对象中相应数据表中的数据也

被修改。这种关系叫做数据绑定。数据绑定有两个要点:第一,支持数据绑定的控件能按绑定的数据源正确显示数据源的数据,第二,在支持数据绑定控件中被修改的数据能被正确写回数据源,这里的数据源一般是数据集DataSet对象中的一个表或者是表中的一个字段。许多控件都支持数据绑定。

【例8.4】用DataGridView显示studentI数据库student

表的所有记录,步骤如下:

Page 31: 数据库与ADO - web.suda.edu.cn

31建立一个新项目。放DataGridView控件到窗体。选中该控件,单击该控件右上角标题为一箭头的按钮,将打开一窗体。

Page 32: 数据库与ADO - web.suda.edu.cn

32打开标题为"选择数据源"的ComboBox控件下拉列表,单击"添加项目数据源…"

Page 33: 数据库与ADO - web.suda.edu.cn

33打开"数据源配置向导"对话框,选中"数据库",单击"下一步"按钮,打开下一个"数据源配置向导"对话框

Page 34: 数据库与ADO - web.suda.edu.cn

34可以选择已有的数据库连接,也可以建立新的数据库连接。这里单击"新建连接(C)…"按钮,打开"添加连接"对话框

Page 35: 数据库与ADO - web.suda.edu.cn

35可以选择已有的数据库连接,也可以建立新的数据库连接。这里单击"新建连接(C)…"按钮,打开"添加连接"对话框,按照图那样修改数据。

Page 36: 数据库与ADO - web.suda.edu.cn

36单击"测试连接…"按钮,应出现一个对话框,显示连接成功。

单击“确定”按钮,退出“添加连接”对话框,回到“数据源配置向导”对话框,可以看到连接字符串。

Page 37: 数据库与ADO - web.suda.edu.cn

37

单击“下一步”按钮,打开对话框如下图:

Page 38: 数据库与ADO - web.suda.edu.cn

38

单击“是(Y)”按钮,出现如下对话框:

Page 39: 数据库与ADO - web.suda.edu.cn

39

按照图中那样选择,单击“下一步”按钮,打开对话框如下图:

Page 41: 数据库与ADO - web.suda.edu.cn

41

可看到集成环境自动增加了三个组件,studentIDataSet、studentBindingSource、studentTableAdapter,第一个是DataSet组件,第二个是BindingSource,是VS2005增加的新组件,用于简化控件数据绑定的过程,第三个是适配器组件。

运行可看到studentI数据库student表的所有记录,单

击某一网格,可以修改该网格数据,可以在最后一行增加一个记录,选中一行,可以用键盘的“Delete”键,删除该纪录。

为了保存所作的修改到数据库,增加一个按钮,为其增加事件处理函数如下:

Page 42: 数据库与ADO - web.suda.edu.cn

42private void button1_Click(object sender, EventArgs e)

{ //如果DataSet中数据被修改

if (this.studentIDataSet.HasChanges())

studentTableAdapter.Update(this.studentIDataSet);

}

如集中调试环境中不能保存所作的修改,脱离集中调试环境运行可以保存所作的修改。

运行后单击按钮,可保存所作的修改。单击DataGridView控件右上角箭头按钮,将打开窗体,如下图:

Page 43: 数据库与ADO - web.suda.edu.cn

43

窗体增加了“添加查询…”和“预览数据…”两项,单击第二项可以预览所连接的数据库表的数据,单击第一项打开“查询标准生成器”对话框:

Page 44: 数据库与ADO - web.suda.edu.cn

44

单击“查询生成器(Q)…”按钮,打开“查询生成器”对话框:

Page 45: 数据库与ADO - web.suda.edu.cn

45

可以使用查询生成器,生成带参数的SQL查询语句,选择所希望的数据,例如希望男生和女生分别显示,可在StudentSex字段后的筛选器键入@Sex。选择学号为降序排列,单击“执行查询(E)”按钮,将生成SQL语句。

Page 46: 数据库与ADO - web.suda.edu.cn

46单击“确定”按钮,退出“查询生成器”对话框,自动在窗体增加控件fillByToolStrip,在属性窗体将其标题修改为中文。选中DataGridView控件,单击该控件右上角箭头按钮,将打开如一窗体,单击“编辑列…”项,将打开标题为“编辑列”的窗体:

Page 47: 数据库与ADO - web.suda.edu.cn

47可以修改表的每一列的属性,例如,修改属性HeaderText,将列标题为中文。运行,在控件fillByToolStrip的选择性别编辑框中输入“男”,单击“确定”按钮,将只显示男生,降序排列。运行效果如图:

Page 48: 数据库与ADO - web.suda.edu.cn

48

8.10 BindingNavigator控件

BindingNavigator控件外观如图,包括若干按钮,单击按钮完成大多数常见的与数据库相关的操作:添加数据、删除数据和定位数据。默认情况下,该控件包含图中所有标准按钮,设计阶段可通过单击该控件右上角标题为一箭头的按钮,单击打开窗体中的"编辑项…"字符,增删BindingNavigator控件中的按钮或控件。

Page 49: 数据库与ADO - web.suda.edu.cn

49【例8.5】本例用TextBox显示Student表的StudentName字段,一次显示一个记录,使用BindingNavigator控件移动记录。

建立一个新项目。放bindingSource控件到窗体。在属性窗口中,打开该控件DataSource属性后边的ComboBox控件的下拉列表,单击“添加项目数据源…”,打开“数据源配置向导”对话框,按照

例8.4中步骤完成配置后,集成环境将增加studentIDataSet1对象。

在属性窗口中,打开bindingSource控件DataMember属性后边的ComboBox控件的下拉列表,选中Student表。完成此步骤后,集成环境将增加studentTableAdapter对象。

Page 50: 数据库与ADO - web.suda.edu.cn

50放TextBox控件到窗体。在属性窗口中,选中该控件的属性DataBindings,单击属性前边+号展开,选中Text属性,从其下拉列表中选择StudentName。

放BindingNavigator控件到窗体。修改该控件BindingSource属性为bindingSource1。

运行,在TextBox控件中可以看到数据库表Student中第一个记录StudentName字段的值。单击BindingNavigator控件中箭头按钮,可以移动记录。运行效果如图:

Page 51: 数据库与ADO - web.suda.edu.cn

51

8.11 建立主从关系表

【例8.6】在显示数据库StudentI的Student和Score表数据时,希望在Student表选中某个学生时,Score表只显示此学生的成绩,两个表的这种关系叫做主从关系。现在实现这两个表的主从关系。具体步骤如下:

建立一个新项目。在菜单中,单击"数据(A)|添加项目数据源(N)…"菜单项,打开"数据源配置向导"对话框。按照例8.4中步骤添加数据源。注意在出现图8.6时,要选择表Student和Score。

VS2005集成环境自动生成架构文件(StudentIDataSet.xsd)。在"解决方案资源管理器"中可看到这个架构文件。双击打开架构文件,显示两个表Student和Score。

Page 52: 数据库与ADO - web.suda.edu.cn

52

从"工具箱"中,将 Relation 组件拖到Score表(子表)上。"关系"对话框打开(图8.12),其中带有从这两个表中带来的默认值。不做修改,单击"确定"按钮退出。

Page 54: 数据库与ADO - web.suda.edu.cn

54放BindingSource控件到窗体。在属性窗口中,从属性DataSource后边的下拉列表中选择“其他数据源”中的studentIDataSet。属性DataMember选择Student表。

放DataGridView控件到窗体,Name=dataGridView1。选中该控件,单击该控件右上角标题为一箭头的按钮,将打开一窗体,选择bindingSource1为数据源。

放DataGridView控件到窗体,Name=dataGridView2。选择Student_Score为数据源。

运行,可以看到dataGridView1显示学生情况表,dataGridView2显示dataGridView1表中被选中的学生的成绩。在dataGridView1表中选择不同学生,dataGridView2显示相应学生的成绩。

Page 56: 数据库与ADO - web.suda.edu.cn

568.12 OleDbDataReader和SqlDataReader类

很多情况下,仅仅让用户浏览一些数据,并不允许修改数据。如果使用DataSet类对象显示大量的只读数据,由于DataSet类对象是数据库在内存中的一个子数据库,将占用较多内存空间,降低计算机的性能。使用OleDbDataReader和SqlDataReader类对象可以克服这个缺点。这两个类可以从数据库表中顺序读出数据,作为只读数据流,并不把读出的数据保存到内存中,减少计算机系统的开销。它们的常用的属性、方法如下:

• 属性FieldCount:

• 方法Close:

• 方法Read:

• 方法GetInt16、GetString、GetByte等:

Page 57: 数据库与ADO - web.suda.edu.cn

57

【例8.7】下面用一个例子介绍SqlDataReader类的使用方法,该例用SqlDataReader类读出数据,用ListView控件显示。具体步骤如下:

新建项目。增加语句using System.Data.SqlClient;

放置视图控件ListView到窗体,属性View=Detail。单击属性Column右侧标题为“…”的按钮,在弹出的“ColumnHeader集合编辑器”对话框中添加3

个列头,属性Text分别为:学生学号、学生姓名、学生性别。

Page 59: 数据库与ADO - web.suda.edu.cn

59为Form1类增加变量:SqlConnection conn;SqlCommand da;

SqlDataReader dr;修改构造函数如下:

public Form1()

{ InitializeComponent();//构造函数原有的语句

string s = "Data Source=.\\SQLEXPRESS;"+"AttachDbFilename=E:\\C#应用程序设计教程例子\\StudentI.mdf;"+" Integrated Security= True;Connect Timeout=30;User Instance=True";

conn=new SqlConnection(s);

s="SELECT * FROM Student";

da=new SqlCommand(s,conn);

conn.Open();

dr=da.ExecuteReader();

Page 60: 数据库与ADO - web.suda.edu.cn

60while (dr.Read())//读1个记录,返回false,所有记录已被读出

{ ListViewItem lvi;

string[] s1 = new String[]//注意读出每个字段的方法

{ dr.GetInt32(0).ToString(), dr.GetString(1), dr.GetString(2) };

lvi=new ListViewItem(s1);

listView1.Items.Add(lvi);

}

dr.Close();

conn.Close();

运行,可以看到表Student中的信息。运行效果如图

Page 62: 数据库与ADO - web.suda.edu.cn

62

8.13 存储过程

存储过程是在数据库系统中预先定义的SQL语句的集合,数据库应用程序可以直接调用这些存储过程,加快运行速度。使用VS2005可为SQL Server

Express 数据库创建存储过程。

【例8.8】为8.2节创建的StudentI.mdf数据库增加一个查询男生或女生的存储过程。

运行VS2005程序,选择菜单“视图(V)|其他窗口(E)|数据资源管理器(D)”菜单项,打开“数据资源

管理器”窗体,右击“数据资源管理器”窗体中的字符“存储过程”,在快捷菜单中,选择“添加新存储过程(P)”菜单项,打开新窗体用来增加存储过程。

Page 64: 数据库与ADO - web.suda.edu.cn

64窗体中已有一个存储过程的基本框架,首先为存储过程增加参数@Sex,类型为nchar(1)。右击字符“AS”后边的空白行,在快捷菜单中,选择“插入SQL(Q)”菜单项,打开“查询生成器”窗体,可以生成所需SQL语句。修改后的存储过程语句如下:

ALTER PROCEDURE SelectManStudent

( @Sex nchar(1) )

AS

SELECT StudentNum,StudentName,StudentSex

FROM Student WHERE(StudentSex=@Sex)

RETURN

Page 66: 数据库与ADO - web.suda.edu.cn

66新建项目。在Form1.cs文件头部增加语句

using System.Data.SqlClient;

放置控件DataGridView到主窗体,属性Name=dataGridView1。DataGridView控件可按行和列格式显示数据库中指定数据表的数据。

( 为Form1类增加变量:SqlConnection conn;SqlDataAdapter da;

DataSet ds;BindingSource bindingSource1;

修改Form1类构造函数如下:

public Form1()

{ InitializeComponent();

string txtConn="Data Source=.\\SQLEXPRESS; AttachDbFilename=D:\\StudentI.mdf;

Integrated Security=True;Connect Timeout=30;

User Instance=True";

conn = new SqlConnection(txtConn);

da = new SqlDataAdapter("SelectManStudent", conn);

Page 67: 数据库与ADO - web.suda.edu.cn

67//下句修改SQL选择语句类型为存储过程,默认CommandType.Text

da.SelectCommand.CommandType=

CommandType.StoredProcedure;

//增加SQL语句参数名称为“@Sex”,初值为“男”,必须和存储

//过程参数名称相同

da.SelectCommand.Parameters.AddWithValue(“@Sex”, “男”);

//修改参数值

da.SelectCommand.Parameters["@Sex"].Value = "女";

ds = new DataSet();

da.Fill(ds, "Student");

dataGridView1.DataSource =

ds.Tables["Student"].DefaultView;

}

Page 68: 数据库与ADO - web.suda.edu.cn

68(1) 也可按8.9节例子的前3步完成,但在下图中选择存储过程SelectManStudent,而不选择Student表。在 Form1类构造函数中增加如下语句:selectManStudentTableAdapter.Fill(studentIDataSet.SelectManStudent, “男”);

第 一 个 参 数 是 被 填 充 的 表 名 , 这 可 以 从selectManStudentBindingSource 组 件 的 属 性DataSource和DataMember看出,第2个参数是赋给存储过程的参数@Sex的值。

Page 70: 数据库与ADO - web.suda.edu.cn

708.14 DataTable类【例8.9】用程序建立一个数据表,为表增加字段、填充数据

并用数据绑定控件显示。

新建项目。添加控件DataGridView到主窗体,属性Name=dataGridView1。为Form1.cs增加命名空间:using System.Data.SqlTypes;引入SQL Server数据库特有的数据类型。

为Form1窗体增加Load事件处理函数如下:

private void Form1_Load(object sender, EventArgs e)

{ DataTable dt = new DataTable("table1");//增加一个表,

//DataSet ds=new DataSet();//如果为DataSet对象增加一个表,

//DataTable dt=ds.Tables.Add(“table1”);//使用被注解的两条语句。

//使用自动增量,必须为SqlInt64

dt.Columns.Add("id", typeof(SqlInt64));

//id字段为自动增量字段

dt.Columns["id"].AutoIncrement = true;

Page 71: 数据库与ADO - web.suda.edu.cn

71DataColumn[] key = new DataColumn[1];//id字段为主键

key[0] = dt.Columns["id"];

dt.PrimaryKey = key;

//SqlString等价于nvarchar

dt.Columns.Add("姓名", typeof(SqlString));

dt.Columns.Add("年龄", typeof(SqlInt32));

dt.Columns.Add("出生日期", typeof(SqlDateTime));

DataRow row = dt.NewRow();//增加新记录

row["姓名"] = "张三";//为字段"姓名"赋值

row["年龄"] = 40;

row["出生日期"] = new DateTime(1976, 2, 3);

dt.Rows.Add(row);

dataGridView1.DataSource = dt;

}

Page 72: 数据库与ADO - web.suda.edu.cn

728.15 在SQL Server数据库中存储图像【例8.10】数据库test.mdf的test表包含pic字段,其数据类型

为image,是一幅图像,本例将pic字段绑定到pictureBox控件,具体步骤如下:

按照8.2节方法创建数据库Test.mdf,创建Test表,包含字段“ID”,int类型;(是标志)=是;标志增量=1;标志种子=1,即将字段“ID”设为自动增量字段,设为主键。创建字段“pic”,image类型,允许为空。

建立一个新项目。放PictureBox控件到窗体。单击菜单“数据(A)|添加新数据源(N)…”,打开“数据源配置向导”对话框,

按照8.9节的方法连接数据库Test.mdf。在PictureBox控件属性DataBindings.Image后的下拉列表中将看到pic字段,选中pic字段将PictureBox控件绑定到pic字段。

放BindingNavigator控件到窗体,修改该控件BindingSource属性为testBindingSource。

Page 73: 数据库与ADO - web.suda.edu.cn

73(放Button和OpenFileDialog控件到窗体,Button控件的标题为"增加或修改图像",按钮单击事件处理函数如下:

private void button1_Click(object sender, EventArgs e)

{ if (openFileDialog1.ShowDialog(this) ==

DialogResult.OK)

{ Bitmap bits=null;

bits = new Bitmap(openFileDialog1.FileName);

pictureBox1.Image = bits;

}

}

( 放Button控件到窗体,标题为"保存图像到数据库",单击事件处理函数如下:

private void button2_Click(object sender, EventArgs e)

{ if (this.testDataSet.HasChanges())

this.testTableAdapter.Update(this.testDataSet);

}

Page 74: 数据库与ADO - web.suda.edu.cn

74

如集中调试环境中不能保存所作的修改,脱离集中调试环境运行可以保存所作的修改。

编译运行,单击BindingNavigator控件标题为"+"按钮,为Test表增加一个记录,单击"增加或修改图像"按钮,可以为该记录增加图像。也可为当前记录修改图像。