第4讲 数据库编程与二层架构_第1页
第4讲 数据库编程与二层架构_第2页
第4讲 数据库编程与二层架构_第3页
第4讲 数据库编程与二层架构_第4页
第4讲 数据库编程与二层架构_第5页
已阅读5页,还剩23页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、第4讲 数据库编程与二层架构_入门在接下来的讲义中使用前面创建的DBS数据库,结合几个具体的应用项目首先来讲解数据库编程的基本技术,这些技术实质上就是数据库的二层架构开发技术。4.1 数据库连接在本节中介绍如何使用C#语言通过ADO.NET连接数据库,还要介绍如何将链接字符串放在配置文件中,便于应用程序生成后直接修改配置文件就可更改链接的服务器。将链接字符串暴露在XML格式的配置文件中,就没有安全性可言了,所以,还要介绍如何将连接字符串加密后放在配置文件中。4.1.1 生成连接字符串连接字符串是一串很长的字符串,其中包括:数据库服务器(数据源)、初始数据库以及身份验证方法说明,不便记忆,也容易

2、出错。我们可以利用Visual Studio平台自带的工具生成链接字符串。选择菜单“工具 > 连接到数据库”,如下图。弹出“添加连接”对话框,这时有两种身份验证方法选择(Windows身份验证 和 SQL Server身份验证)可选,服务器在本机的开发一般选择Windows身份验证,如下面两个图。“服务器名”可以选择,也可以用户输入,当选择SQL Server身份验证时,还需要输入登录的用户名和密码,这里的“sa”是个系统管理员用户名,然后输入或选择一个你要连接的数据库,如:DBS,再点击“测试连接”,若提示“测试成功”表示连接正确,否则,表示哪个参数不正确,很可能是服务器名不正确。若测

3、试成功后,点击“确定”按钮,在“服务器资源管理器”的“数据连接”中就会出现刚才建立的数据库连接,如下图,打开数据库连接,还可以看到数据库的各个对象,如:表、视图等。鼠标右击数据为连接对象,选择“属性”菜单项,如下图。选择“属性”菜单后,就会显示属性窗口。在属性窗口中显示了该连接的属性,其中包括连接字符串。下图显示两种不同身份验证的连接字符串。将连接字符串拷贝下来,供以后在编程中连接数据库使用。Windows身份验证的连接字符串:Data Source=LWHDELLSQL2008;Initial Catalog=DBS;Integrated Security=TrueSQL Server身份验

4、证的连接字符串:Data Source=LWHDELLSQL2008;Initial Catalog=DBS;Persist Security Info=True;User ID=sa;Password=1234.1.2 连接字符串写在代码中在本示例中演示如何使用连接字符串连接数据库DBS,并从数据库中取出学生信息(Student)数据。创建项目为了展示数据库连接功能的实现,我们需要设计一个简单的窗体,将学生表(Student)中的数据从数据库中取出来后显示到一个ListBox对象中。窗体如下:功能实现响应按钮“SQL2008”的“Click”事件,输入以下代码。 private void b

5、utton1_Click(object sender, EventArgs e) / Window 登录方式 string sConn = "Data Source=.Sql2008;Integrated Security=True; Initial Catalog=DBS" SqlConnection conn = new SqlConnection(sConn); try SqlCommand cmd = new SqlCommand("SELECT * FROM Student", conn); conn.Open(); SqlDataReader

6、 reader = cmd.ExecuteReader(); listBox1.Items.Clear(); while (reader.Read() string no = reader"Sno".ToString().Trim(); string name = reader"Sname".ToString().Trim(); string sex = reader"Ssex".ToString().Trim(); int age = Convert.ToInt32(reader"Sage"); string d

7、ept = reader"Sdept".ToString().Trim(); string s = string.Format("No:0, Name:1, Sex:2, Age:3, Dept:4", no, name, sex, age, dept); listBox1.Items.Add(s); reader.Close(); catch (Exception ex) MessageBox.Show(ex.Message); finally conn.Close(); 连接字符串中数据源的名称由“LWHDELLSQL2008”变成了“.SQL200

8、8”,这是因为测试机器(即本机)的名称是“LWHDELL”,在连接字符串中本机名称还可以使用“.”来代替,故可以使用“.SQL2008”代替“LWHDELLSQL2008”。下面解释如何使用Connection,Command,DataReader对象读取数据库中的数据。 SqlConnection conn = new SqlConnection(sConn);第一步,要想从数据库中取出数据,必须使用指定的连接字符串建立一个连接对象(这里是conn); SqlCommand cmd = new SqlCommand("SELECT * FROM Student", con

9、n);第二步,基于连接对象和SQL命令(这是是一条查询命令)建立一个命令对象(这里是cmd); conn.Open(); SqlDataReader reader = cmd.ExecuteReader();第三步,打开链接(即真正与数据库连接起来),使用ExecuteReader方法执行命令,即从数据库的Student表中取出全部数据,放到reader对象中; while (reader.Read() string no = reader"Sno".ToString().Trim(); string name = reader"Sname".ToStr

10、ing().Trim(); string sex = reader"Ssex".ToString().Trim(); int age = Convert.ToInt32(reader"Sage"); string dept = reader"Sdept".ToString().Trim(); string s = string.Format("No:0, Name:1, Sex:2, Age:3, Dept:4", no, name, sex, age, dept); listBox1.Items.Add(s);

11、reader.Close();第四步,循环地从reader对象取出数据库记录,添加到了ListBox对象中,即显示到了窗体中; conn.Close();最后,一定要关闭数据库连接,确保数据的安全。测试运行启动程序,运行结果如下。4.1.3 连接字符串写在配置文件中在“ChA101_数据库连接”项目中,连接字符串是写在程序代码中的,一旦生成后,就不可再修改了,这样不利于应用程序的推广和应用(因为数据库服务器通常不是在本机,对不同应用单位来说,连接字符串都是不一样的)。创建项目设计的窗口与“ChA101_数据库连接”项目相同。本项目我们把连接字符串放到应用程序配置文件中,需要手动添加一个配置文件

12、,并命名为App.config。配置文件的内容如下,即定义了数据库连接字符串,必须放在<connectionStrings>节中,且给该连接命了一个名字叫“LwhDellSql2008”。<?xml version="1.0" encoding="utf-8" ?><configuration> <connectionStrings> <add name="LwhDellSql2008" providerName="System.Data.SqlClient"

13、connectionString="Data Source=.Sql2008;Integrated Security=True; Initial Catalog=DBS"/> </connectionStrings></configuration>为了能够在程序中使用配置文件,必须手动添加一个引用“System.configuration”。功能实现响应按钮“SQL2008”的“Click”事件,输入以下代码。 private void button1_Click(object sender, EventArgs e) ConnectionSt

14、ringSettings cfg = ConfigurationManager.ConnectionStrings"LwhDellSql2008" string sConn = cfg.ConnectionString; SqlConnection conn = new SqlConnection(sConn); try SqlCommand cmd = new SqlCommand("SELECT * FROM Student", conn); conn.Open(); SqlDataReader reader = cmd.ExecuteReader(

15、); listBox1.Items.Clear(); while (reader.Read() string no = reader"Sno".ToString().Trim(); string name = reader"Sname".ToString().Trim(); string sex = reader"Ssex".ToString().Trim(); int age = Convert.ToInt32(reader"Sage"); string dept = reader"Sdept"

16、;.ToString().Trim(); string s = string.Format("No:0, Name:1, Sex:2, Age:3, Dept:4", no, name, sex, age, dept); listBox1.Items.Add(s); reader.Close(); catch (Exception ex) MessageBox.Show(ex.Message); finally conn.Close(); 与“ChA101_数据库连接”项目相比,真正不一样的,只有黄色部分,也就是说,修改了得到连接字符串的方式。测试运行启动程序,运行结果如下

17、。测试运行启动程序,运行结果如下。注意:应用程序生成后,在目标文件中没有App.config文件,而是与应用程序同名的一个配置文件,对于本项目来说,应用程序名为:ChA102_配置数据库连接.exe,配置文件为:ChA102_配置数据库连接.exe.config,如下图。在发布应用时,若需要修改数据库的连接,只需要修改“ChA102_配置数据库连接.exe.config”中的连接字符串即可,不需要再重新编译应用程序。“ChA102_配置数据库连接.exe.config”文件默认与开发时的App.config相同,内容如下。<?xml version="1.0" enc

18、oding="utf-8" ?><configuration> <connectionStrings> <add name="LwhDellSql2008" providerName="System.Data.SqlClient" connectionString="Data Source=.Sql2008;Integrated Security=True; Initial Catalog=DBS"/> </connectionStrings></conf

19、iguration>4.1.4 连接字符串加密后写在配置文件中在“ChA102_配置数据库连接”项目中,为了方便修改数据库连接字符串,我们将连接字符串暴露在xml格式的文件中,这样应用系统的安全不能保证。为了保证连接字符串的安全,采用将连接字符串加密的方式保存在配置文件中,即:将连接字符串加密后放到配置文件中,然后在应用程序中对读入的连接字符串解密。创建项目设计的窗口如下,上面的部分与前面两个项目一致,在下面添加了一个对连接字符串加密的功能。功能实现设置配置文件确保项目中有一个配置文件App.config,将连接字符串加密,得到加密后的字符串,将加密后的字符串写到App.config的连

20、接字符串中,如下。<?xml version="1.0" encoding="utf-8" ?><configuration> <connectionStrings> <add name="LwhDellSql2008" providerName="System.Data.SqlClient" connectionString="vU9qsBqUnRLoKos11dqPnIG53Ir3GKfHJkShTLJJqqDk8MEKMoBeN8m5HYvyEC+k9/0n

21、2H8oPym+k1qNMeH/kFeoDbluKTqj"/> </connectionStrings></configuration>为了能够在程序中使用配置文件,必须手动添加一个引用“System.configuration”。定义加密文件向项目中添加一个加解密的类文件Encrypt.cs,并添加如下代码。namespace ChA103_加密配置 public class Encrypt static string key = "441568140" static byte Keys = 0x12, 0x34, 0x56, 0x

22、78, 0x90, 0xAB, 0xCD, 0xEF ; public Encrypt() / 加密: public static string EncryptDES(string pass) try byte rgbKey = Encoding.UTF8.GetBytes(key.Substring(0, 8); byte rgbIV = Keys; byte inputByteArray = Encoding.UTF8.GetBytes(pass); DESCryptoServiceProvider provider = new DESCryptoServiceProvider(); Me

23、moryStream mStream = new MemoryStream(); CryptoStream cStream = new CryptoStream(mStream, provider.CreateEncryptor(rgbKey, rgbIV), CryptoStreamMode.Write); cStream.Write(inputByteArray, 0, inputByteArray.Length); cStream.FlushFinalBlock(); return Convert.ToBase64String(mStream.ToArray(); catch retur

24、n pass; / 解密: public static string DecryptDES(string pass) try byte rgbKey = Encoding.UTF8.GetBytes(key.Substring (0,8); byte rgbIV = Keys; byte inputByteArray = Convert.FromBase64String(pass); DESCryptoServiceProvider provider = new DESCryptoServiceProvider(); MemoryStream mStream = new MemoryStrea

25、m();/存储加后的数据 CryptoStream cStream = new CryptoStream(mStream, provider.CreateDecryptor(rgbKey, rgbIV), CryptoStreamMode.Write); cStream.Write(inputByteArray, 0, inputByteArray.Length); cStream.FlushFinalBlock(); return Encoding.UTF8.GetString(mStream.ToArray(); catch return pass; 响应“加密”按钮的代码如下: priv

26、ate void btnEncrypt_Click(object sender, EventArgs e) txtEncrypt.Text = Encrypt.EncryptDES(txtPrimary.Text); 响应SQL2008按钮响应按钮“SQL2008”的“Click”事件,输入以下代码。 private void button1_Click(object sender, EventArgs e) ConnectionStringSettings cfg = ConfigurationManager.ConnectionStrings"LwhDellSql2008&quo

27、t; string sConnEncrypt = cfg.ConnectionString; string sConn = Encrypt.DecryptDES(sConnEncrypt); SqlConnection conn = new SqlConnection(sConn); try SqlCommand cmd = new SqlCommand("SELECT * FROM Student", conn); conn.Open(); SqlDataReader reader = cmd.ExecuteReader(); listBox1.Items.Clear()

28、; while (reader.Read() string no = reader"Sno".ToString().Trim(); string name = reader"Sname".ToString().Trim(); string sex = reader"Ssex".ToString().Trim(); int age = Convert.ToInt32(reader"Sage"); string dept = reader"Sdept".ToString().Trim(); stri

29、ng s = string.Format("No:0, Name:1, Sex:2, Age:3, Dept:4", no, name, sex, age, dept); listBox1.Items.Add(s); reader.Close(); catch (Exception ex) MessageBox.Show(ex.Message); finally conn.Close(); 与“ChA102_配置数据库连接”项目相比,真正不一样的,只有黄色部分(一行代码)不同,也就是说,将从配置文件中得到的加密连接字符串进行解密后使用。测试运行启动程序,运行结果如下。测试运

30、行启动程序,运行结果如下。4.2 数据库查询在前面的三个示例中,我们已经看到了如何查询数据库中的数据,在界面窗体中要实现查询,实际上还是通过调用SQL语句来实现的,更复杂的查询实际上要通过更复杂的SQL语句来实现。在C#语言中,调用的SQL语句是以字符串的形式嵌入在语句中的,这些SQL语句在编译时没有语法检验功能,只有等运行该SQL语句时,由SQL服务器去检验和完成,如果不正确,就会出错。所以,一般在编写这类数据库应用程序时,通过都要使用SQL Server的管理工具调试SQL语句,将调试通过的语句再嵌入到C#等高级语言中。在前面的数据库程序中,虽然查询了数据,但都是查询所有学生的数据,SQL

31、语句是一个常量字符串,如:"SELECT * FROM Student",若要查询指定学号的学生信息呢?我们就需要给SQL语句添加一个WHERE查询条件。前面的例子中,查询结果都是显示在一个ListBox中,如何将查询信息显示到DataGridView中呢?本节的示例介绍这两个功能的实现,期望你能举一反三,编写出更多更复杂功能的SQL查询程序。4.2.1 创建项目设计的窗口仍然很简单,界面上有两个按钮,“查询到List”是将查询结果显示在ListBox框中,若“学号”编辑框为空,则显示全部学生信息,否则,显示指定学号的学生信息。“查询到Grid”查询的内容与“查询到List

32、”一样,只不过是将查询的内容显示到右下面的DataGridView中。4.2.2 功能实现添加学生类为了实现将查询结果显示到DataGridView中,需要给项目添加一个学生类(Student.cs),在类中输入如下代码。 public class Student public string Sno get; set; public string Sname get; set; public string Ssex get; set; public int Sage get; set; public string Sdept get; set; public Student (string s

33、no, string sname, string ssex, int sage, string sdept) Sno = sno; Sname = sname; Ssex = ssex; Sage = sage; Sdept = sdept; 响应“查询到List”按钮响应按钮“查询到List”的“Click”事件,输入以下代码。 private void button1_Click(object sender, EventArgs e) string sConn = "Data Source=.Sql2008;Integrated Security=True; Initial Ca

34、talog=DBS" SqlConnection conn = new SqlConnection(sConn); try string sql = "SELECT * FROM Student" if (!string.IsNullOrEmpty(txtSno.Text) sql += string.Format(" WHERE Sno='0'", txtSno.Text); SqlCommand cmd = new SqlCommand(sql, conn); conn.Open(); SqlDataReader reade

35、r = cmd.ExecuteReader(); listBox1.Items.Clear(); while (reader.Read() string no = reader"Sno".ToString().Trim(); string name = reader"Sname".ToString().Trim(); string sex = reader"Ssex".ToString().Trim(); int age = Convert.ToInt32(reader"Sage"); string dept =

36、reader"Sdept".ToString().Trim(); string s = string.Format("No:0, Name:1, Sex:2, Age:3, Dept:4", no, name, sex, age, dept); listBox1.Items.Add(s); reader.Close(); catch (Exception ex) MessageBox.Show(ex.Message); finally conn.Close(); 与“ChA101_数据库连接”项目中的代码对比,真正不一样的,只有黄色部分不同,也就是说,本

37、例中根据“学号”编辑框中的内容确定是否修改SQL语句,然后再执行SQL语句。响应“查询到Grid”按钮响应按钮“查询到Grid”的“Click”事件,输入以下代码。 private void button2_Click(object sender, EventArgs e) string sConn = "Data Source=.Sql2008;Integrated Security=True; Initial Catalog=DBS" SqlConnection conn = new SqlConnection(sConn); try string sql = &quo

38、t;SELECT * FROM Student" if (!string.IsNullOrEmpty(txtSno.Text) sql += string.Format(" WHERE Sno='0'", txtSno.Text); SqlCommand cmd = new SqlCommand(sql, conn); conn.Open(); SqlDataReader reader = cmd.ExecuteReader(); List<Student> students = new List<Student>(); w

39、hile (reader.Read() string no = reader"Sno".ToString().Trim(); string name = reader"Sname".ToString().Trim(); string sex = reader"Ssex".ToString().Trim(); int age = Convert.ToInt32(reader"Sage"); string dept = reader"Sdept".ToString().Trim(); student

40、s.Add(new Student(no, name, sex, age, dept); reader.Close(); dataGridView1.DataSource = students; catch (Exception ex) MessageBox.Show(ex.Message); finally conn.Close(); 与“输出到List”的响应代码对比,重点黄色部分代码。4.2.3 测试运行启动程序,运行结果如下,一个是没有指定任何学号,查询结果为所有学生信息,另一个是指定了学号95002,则查询结果为95002学生的信息。4.3 数据库操作在“ChA104_查询数据库”项

41、目中演示了如何进行有条件查询,本节示例演示如何对数据表进行数据操作(插入、修改、删除),三类操作对于C#编程来说,其实是一样,不一样的是SQL语句。数据表的插删改操作,只能对单表进行操作(至于为什么在数据库原理中有说明)。在本示例中演示了如何:插入学生数据、修改学生数据、删除学生数据。4.3.1 创建项目本设计的窗口分上下两部分:上部分是用于显示和编辑各个字段的编辑框和三个按钮,下部分是用于显示Student表的最新信息的DataGridView。默认情况下在Grid表中显示所有学生数据,当前记录为第1条记录,并将当前记录的字段内容显示在上部分的各个字段编辑框中。在上部分的编辑框中输入各个字段

42、的信息后,若按“添加”按钮,就会将编辑框中的内容添加到学生表中;若按“修改”按钮,就会修改学生表中指定学号的数据;若按“删除”按钮,就会指定学号的学生数据。执行完按钮的功能,都会重新刷新下部分的Grid显示。4.3.2 功能实现在实现具体功能前,同上一个示例一样,需要添加学生类Student.cs。响应窗体的“Load”事件响应窗体的“Load”事件,输入以下代码。 private void Form1_Load(object sender, EventArgs e) string sConn = "Data Source=.Sql2008;Integrated Security=T

43、rue; Initial Catalog=DBS" SqlConnection conn = new SqlConnection(sConn); try string sql = "SELECT * FROM Student" SqlCommand cmd = new SqlCommand(sql, conn); conn.Open(); SqlDataReader reader = cmd.ExecuteReader(); List<Student> students = new List<Student>(); while (reade

44、r.Read() string no = reader"Sno".ToString().Trim(); string name = reader"Sname".ToString().Trim(); string sex = reader"Ssex".ToString().Trim(); int age = Convert.ToInt32(reader"Sage"); string dept = reader"Sdept".ToString().Trim(); students.Add(new S

45、tudent(no, name, sex, age, dept); reader.Close(); dataGridView1.DataSource = students; catch (Exception ex) MessageBox.Show(ex.Message); finally conn.Close(); 响应“添加”按钮响应按钮“添加”的“Click”事件,输入以下代码。 private void btnInsert_Click(object sender, EventArgs e) string sConn = "Data Source=.Sql2008;Integrated Security=True; Initial Catalog=DBS" SqlConnection conn = new SqlConnection(sConn); try string sql = string.Format("INSERT INTO Student VALUES('0', '1', '2', 3, '4')", txtSno.Text, txtSname.Text, txtSsex.Text, txtSage.Text, txtSdept.Text); SqlCo

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论