第11章使用ADO.NET数据库
- 格式:ppt
- 大小:460.50 KB
- 文档页数:21
第十一周实验使用编程实现数据库应用程序(2)——“连接式”数据库访问一.实验目的1.了解主要对象的使用方法。
2.掌握的“连接式”数据库访问模式和程序流程。
3.掌握使用的类和对象以编程方式在动态生成Web窗体时实现数据库访问。
二.实验环境●Microsoft Visual Studio 2010●BookStore数据库三.实验内容说明:标记为▲的是必做题目,其他为选作题目。
4.完成图书订购信息的统计。
具体要求是:给定书号查询该图书的名称、该图书的销量总量以及购买了该图书的订单数。
页面设计及运行效果如图2.43所示。
(a)页面设计(b)页面运行效果图2.43页面运行效果提示:本题练习使用SqlCommand实现“连接式”数据访问。
在本题中,请使用ExecuteReader()执行SQL语句获取数据集“书号”填充DropDownList1;采用ExecuteReader()执行存储过程获得包括书名和销售总量的单行数据;采用ExecScalar()执行存储过程获得单一数值订单数。
5▲.采用SqlCommand的ExecuteNonQuery()实现第3题的数据维护功能,并通过窗体底部标签显示操作状态的提示信息。
页面设计及运行效果如图2.44所示。
(a)页面设计(b)页面运行选择记录效果(c)页面运行修改记录效果图2.44页面运行效果提示:本题练习使用SqlCommand的ExecuteNonQuery()方法实现添加、修改、删除等数据更新操作,并且利用客户端返回受影响的记录行数进行操作是否成功的提示。
6▲.利用SqlCommand的ExecuteNonQuery()实现客户评价类别信息的统计。
要求给定客户等级查询该等级人数,占总人数的比例(如图2.45)。
(a)页面设计(b)页面运行效果图2.45页面运行效果提示:本题练习使用SqlCommand的ExecuteNonQuery()方法通过存储过程的OUTPUT参数返回结果实现数据统计功能。
1第十周实验使用 编程实现数据库应用程序(1)——“断开式”数据库访问一.实验目的1.了解 主要对象的使用方法。
2.掌握 的“断开式”数据库访问模式和程序流程。
3.掌握使用 的类和对象以编程方式在动态生成Web 窗体时实现数据库访问。
二.实验环境● Microsoft Visual Studio 2010● BookStore 数据库三.实验内容说明: 标记为▲的是必做题目,其他为选作题目。
1▲.使用 对象编写程序,实现访问BookStore 数据库的Web 应用程序,使用GridView 显示Customer 表的信息。
页面运行效果如图2.40所示。
图2.40页面运行效果提示:① 本题练习利用“断开式”数据访问模式查询数据库,将数据集提取到客户端的DataSet ,然后利用界面控件GridView 显示。
本题使用到的 对象包括:SqlConnection 、SqlCommand 、SqlDataAdapter 、DataSet 。
② 新建Web.Config 文件,添加连接字符串“BookStoreConnectionString"。
<connectionStrings><add name="BookStoreConnectionString" connectionString="Data Source=.;Initial Catalog=BookStore; Integrated Security=SSPI" providerName="System.Data.SqlClient"/></connectionStrings>③ 注意要在.cs 文件中添加对SqlClient 命名空间的引用:using System.Data.SqlClient;2▲.创建一个Web 应用程序,程序启动时自动在DropDownList 显示图书类别列表;选择类别后点击“查看销量”按钮在GridView 中显示该类别图书中各本书的销售量;点击“平2 均销量”按钮计算该类图书的平均销量;点击“总销量”按钮调用存储过程查询该类图书的总销量。
数据库访问技术⼀. 的定义来源于COM组件库ADO(即ActiveX Data Objects),是微软公司新⼀代.NET数据库的访问模型,是⽬前数据库程序设计⼈员⽤来开发基于.NET的数据库应⽤程序的主要接⼝。
它利⽤.NET Data Provider(数据提供程序)进⾏数据库的连接和访问,通过数据库程序能够使⽤各种对象来访问符合条件的数据库内容,让提供数据库管理系统的各个⼚商可以根据此标准开放对应的.NET Data Provider,这样设计数据库应⽤程序⼈员不必了解各类数据库底层运作的细节,只要掌握所提供对象的模型,便可访问所有⽀持.NET Data Provider的数据库。
结构模型如下所⽰:图1. 结构模型是⼀个类库,这些类提供了很多的对象,可⽤于完成数据库连接和增删查改等操作。
其中包括如下五个对象: 1)Connection:⽤来连接数据库(SQL Server使⽤的是SqlConnection对象); 2)Command:⽤来对数据库执⾏SQL命令,如增删查改等操作; 3)DataReader:⽤来从数据库中返回只读数据,⽤数据源填充DataSet对象; 4)DataAdapter:与DataSet对象相结合使⽤,实现对数据库的控制; 5)DataSet:可看作离线时内存中的数据库;这五个对象提供了两种读取数据库的⽅式;第⼀种⽅式:使⽤Connection、Command、DataReader,其权限只能读取或查询数据库;第⼆种⽅式:使⽤Connection、Command、DataAdapter、DataSet,其权限能进⾏各种数据库的操作。
读取数据库操作⽰意图:图1. 结构模型⼆. 使⽤在线访问数据库的步骤(这⾥⽤的是SQL Server 数据库)1. 连接数据库直接上⼀段代码:using System.Data.SqlClient;string source = "server=(local); integrated security=SSPI; database=myDateabase;User ID=sa;pwd=sa";SqlConnection conn = new SqlConnection(source);conn.Open();// 对数据库数据进⾏操作conn.Close();(1). ⾸先添加命名空间System.Data.SqlClient;(2). 定义数据库连接字符串:第⼀种⽅法:直接把数据库连接字符串存放在字符串对象中,如上代码所⽰;第⼆种⽅法Web:将数据库连接信息存放在web.config配置⽂件中,然后通过使⽤ConfigurationStringSettings类进⾏调⽤。
实验报告题目:数据库操作技术院系:计算机科学与工程学院【实验题目】数据库操作技术【实验目的】1.掌握服务器验证控件的使用。
2.掌握对象的使用方法。
3.初步熟悉数据绑定控件GridView控件的使用方法。
【实验内容】使用DataReader对象设计一个用户登陆身份验证页面,页面打开时用户输入了正确的用户名和密码后,程序根据用户级别跳转到不同的页面。
建立Microsoft SQL Sever数据库manager.mdb的设计,并在其中创建存放用户信息的Admin表。
表中user字段表示用户名,pwd字段表示密码,level 字段表示用户级别,0表示管理员,1表示普通用户(游客)。
程序设计步骤:(1)设计Web页面Web页面的设计并不复杂,使用列表的形式,将Label和TextBox嵌入其中,如图4-1所示。
图 4-1 Web页面的设计(2)设置对象属性此处需要注意的是,密码部分需要做密文处理,并且不可进行复制粘贴。
(3)编写事件代码页面设计完成后,需要对登录按钮编写相应的时间。
其中包括与数据库的连接,获取输入的用户名和密码,之后与数据库进行匹配,并将匹配的结果返回给用户,同时程序根据用户级别跳转到不同的页面。
程序运行结果如图4-2所示。
图 4-2 程序运行结果【实验代码】Default:<%@Page Language="C#"AutoEventWireup="true"CodeFile="Default.aspx.cs"Inherits="_Default" %><!DOCTYPE html PUBLIC"-//W3C//DTD XHTML 1.0 Transitional//EN""/TR/xhtml1/DTD/xhtml1-transitional.dtd"><html xmlns="/1999/xhtml"><head runat="server"><title>无标题页</title></head><body><form id="form1"runat="server"><div><table border="1"><tr><td colspan="2"style="text-align: center"><strong><span style="font-size: 14pt">登 录</span></strong></td></tr><tr><td style="width: 100px; text-align: center">用户名</td><td style="width: 100px"><asp:TextBox ID="txtUsername"runat="server"Width="146px"></asp:TextBox></td></tr><tr><td style="width: 100px; text-align: center">密 码</td><td style="width: 100px"><asp:TextBox ID="txtPassword"runat="server"TextMode="Password" Width="145px"></asp:TextBox></td></tr><tr><td style="width: 100px"> </td><td style="width: 100px"><asp:Button ID="btnLogin"runat="server"OnClick="btnLogin_Click" Text="登录"/></td></tr></table></div></form></body></html>using System;using System.Data;using System.Configuration;using System.Web;using System.Web.Security;using System.Web.UI;using System.Web.UI.WebControls;using System.Web.UI.WebControls.WebParts;using System.Web.UI.HtmlControls;using System.Data.OleDb;public partial class_Default : System.Web.UI.Page{protected void Page_Load(object sender, EventArgs e){this.Title = "Reader对象应用示例";txtUsername.Focus();}protected void btnLogin_Click(object sender, EventArgs e){OleDbConnection conn = new OleDbConnection();conn.ConnectionString = "Provider=Microsoft.Jet.OleDb.4.0;" + "Data Source=" + Server.MapPath("App_Data/manager.mdb");conn.Open();string strSQL = "select * from Admin";OleDbCommand com = new OleDbCommand(strSQL, conn);OleDbDataReader dr = com.ExecuteReader();string strUsername="", strPassword="",strLevel="";while (dr.Read()){if (txtUsername.Text == dr["user"].ToString() && txtPassword.Text ==dr["pwd"].ToString()){strUsername = dr["user"].ToString();strPassword=dr["pwd"].ToString();strLevel = dr["level"].ToString();break;}}dr.Close();conn.Close();if (strUsername == ""){Response.Write("<script language=javascript>alert('用户名或密码错!');</script>");return;}if (strLevel == "0"){Session["pass"] = "admin";Response.Redirect("manager.aspx");}else{Session["pass"] = "guest";Response.Redirect("guest.aspx");}}}Guest:<%@Page Language="C#"AutoEventWireup="true"CodeFile="guest.aspx.cs"Inherits="guest"%><!DOCTYPE html PUBLIC"-//W3C//DTD XHTML 1.0 Transitional//EN""/TR/xhtml1/DTD/xhtml1-transitional.dtd"><html xmlns="/1999/xhtml"><head runat="server"><title>无标题页</title></head><body><form id="form1"runat="server"></form></body></html>using System;using System.Data;using System.Configuration;using System.Collections;using System.Web;using System.Web.Security;using System.Web.UI;using System.Web.UI.WebControls;using System.Web.UI.WebControls.WebParts;using System.Web.UI.HtmlControls;public partial class guest : System.Web.UI.Page{protected void Page_Load(object sender, EventArgs e){this.Title = "游客页面";string strPass = (string)Session["pass"];if (strPass != "guest"){Response.Redirect("default.aspx");}Response.Write("这是游客页面");}}Manager:<%@Page Language="C#"AutoEventWireup="true"CodeFile="manager.aspx.cs" Inherits="manager" %><!DOCTYPE html PUBLIC"-//W3C//DTD XHTML 1.0 Transitional//EN""/TR/xhtml1/DTD/xhtml1-transitional.dtd"><html xmlns="/1999/xhtml"><head runat="server"><title>无标题页</title></head><body><form id="form1"runat="server"></form></body></html>using System;using System.Data;using System.Configuration;using System.Collections;using System.Web;using System.Web.Security;using System.Web.UI;using System.Web.UI.WebControls;using System.Web.UI.WebControls.WebParts;using System.Web.UI.HtmlControls;public partial class manager : System.Web.UI.Page{protected void Page_Load(object sender, EventArgs e){this.Title = "管理页面";string strPass = (string)Session["pass"];if (strPass != "admin"){Response.Write("<script language=javascript>alert('请先登录!');</script>"); Response.Redirect("default.aspx");}Response.Write("这是管理员页面");}}【实验结果】【实验心得】通过本次实验,我的的掌握更加深入,我基本掌握的服务器控件的应用,也基本掌握了GridView控件,熟悉了如何设置这个控件的基本属性,同时也加强了对其他控件的掌握。
使用ADO_NET访问数据库连接对象(Connection)用于建立与数据库的连接。
使用时需要提供数据库的连接字符串,连接字符串包含了数据库的类型、服务器地址、用户名、密码等信息。
下面是一个连接字符串的示例:```Server=127.0.0.1;Database=myDatabase;UserID=myUsername;Password=myPassword;```可以使用 SqlConnection 类来创建连接对象,并通过 Open 方法打开连接,通过 Close 方法关闭连接。
连接对象还提供了一些其他的属性和方法,如 ConnectionString 属性用于设置连接字符串,State 属性用于获取连接的状态,等等。
数据读取器对象(DataReader)用于按顺序读取查询结果中的数据。
可以使用 SqlDataReader 类创建数据读取器。
在使用数据读取器读取数据时,需要使用 Read 方法获取下一条记录,并使用索引或列名访问具体的数据值。
读取完数据后需要调用 Close 方法关闭数据读取器。
首先,创建一个名为 Student 的数据库,包含一个名为 Students 的表,表中包含三个字段:ID、Name 和 Age。
```sqlCREATE DATABASE Student;USE Student;CREATE TABLE StudentsIDINTPRIMARYKEY,Name NVARCHAR(50),Age INT```然后,创建一个 C# 控制台应用程序,添加对System.Data.SqlClient 的引用。
```csharpusing System;using System.Data;using System.Data.SqlClient;namespace StudentManagementclass Programstatic void Main(string[] args)string connectionString ="Server=127.0.0.1;Database=Student;UserID=myUsername;Password=myPassword;";using (SqlConnection connection = new SqlConnection(connectionString))connection.Open(;//插入数据Console.WriteLine("插入数据成功");}//查询数据while (reader.Read()int id = reader.GetInt32(0);string name = reader.GetString(1);int age = reader.GetInt32(2);Console.WriteLine($"ID: {id}, Name: {name}, Age: {age}"); }}//更新数据Console.WriteLine("更新数据成功");}//删除数据Console.WriteLine("删除数据成功");}connection.Close(;}}}```编译运行该应用程序,将会得到以下输出:```插入数据成功ID: 1, Name: 张三, Age: 20更新数据成功删除数据成功```。
数据库实例教程数据库编程比较复杂,名目繁多的类、对象、属性、方法让每一个编程者都感觉恼火。
本文旨在介绍 Beta2数据库编程的主要内容,帮助编程者最快的了解数据库编程的精髓。
一、Managed Providers如果你是初学者,可能你会问,什么是"Managed Providers"?Managed Providers提供简单的方法连接和访问数据库,有点类似于数据库连接,当然又比它强的多。
Managed Providers提供OleDb和SQL Server两种编程接口。
因为SQL Server是微软自己的产品,因此,专门提供了一个针对SQL Server的接口,使用这个接口访问SQL Server的效率应该比使用OleDb强。
NameSpaces本文所有的例子程序都需要使用以下NameSpaces:<%@ Import Namespace="System.Data" %><%@ Import Namespace="System.Data.Oledb" %>Connection为了连接数据库,必须使用OleDbConnection:Dim objConn as New OleDBConnection("Provider=Microsoft.Jet.OLEDB.4.0; Data Source=e:\sff\site\db\users.mdb")当然,你也可以将具体的连接方法作为变量使用,在连接数据库以后,必须打开数据库:objConn.Open()这样,就可以使用数据库了,一般在最后,我们都要求关闭数据库连接:objConn.Close()objConn=NothingCommand连接数据库以后,就可以发送命令对数据库进行操作了,OleDbCommand允许发送命令对数据库进行操作。
根据发送的SQL语句,我们可以对数据库进行几乎所有操作。
C 中使用ADO—NET连接SQLServer数据库C#中使用连接SQL Server数据库,自动增长字段用作主键,处理事务时的基本方法问题描述:假设在数据库中存在以下两张数据表:User表,存放用户的基本信息,基本结构如下所示:类型说明ID_User int 自动增长字段,用作该表的主键UserName varcharUserDepart表,存放用户所拥有的部门(我们假设一个用户拥有多个部门,虽然听起来有点别扭,此处仅作示例,可以理解为一个用户拥有多个职位等等),该表的基本结构如下所示:类型说明ID_UserDepart int 自动增长字段,用作该表的主键用户编号 ID_User int部门编号 ID_Depart int向数据库中插入一条用户信息的时候,为了保证数据的一致性,必须使用事务的方式“同时”操作User表和UserDepart表。
先将用户姓名写入User表中,再将其所拥有的部门写入UserDepart表中,使用事务机制保证这两步操作要么同时成功,要么同时失败。
问题就出在:第一步操作完成后,我们并不知道该向第二步操作写入的ID_User的值是多少,因为这个值是SQL Server自动生成的。
解决思路:可以借助SELECT IDENT_CURRENT('User') AS …NewInsertID? 来查询最近一次插入User表的数据的自动编号的值。
程序实现:1 public struct Chaos_TranSQLCmd2 {3 /// <summary>4 /// 一条SQL语句5 /// </summary>6 public string strSQL;78 /// <summary>9 /// 标记该条SQL语句是否需要连接ID_User 10 /// </summary>11 public bool bNeedID;12 }131415 public void Chaos_ExecuteSqlTran(List<Chaos_TranSQLCmd>listTranSQLCmd,string strInsertID_SQL)16 {17 using (SqlConnection ChaosSqlConn = newSqlConnection(strSqlConnString))18 {19 SqlCommand ChaosSqlCmd = new SqlCommand(); 20ChaosSqlCmd.Connection = ChaosSqlConn; 21 ChaosSqlConn.Open();22 SqlTransaction ChaosSqlTran =ChaosSqlConn.BeginTransaction();23 ChaosSqlCmd.Transaction = ChaosSqlTran; 2425 try26 {27 string mID_User = ""; 2829 //先将数据插入User30 mandText = strInsertID_SQL; 31ChaosSqlCmd.ExecuteNonQuery(); 3233 //再获取ID_User34 DataSet ds = this.ExecAdapter("selectIDENT_CURRENT('PT_User') as 'ID'", "T"); 35 DataTable dt =ds.Tables["T"];36 if (dt.Rows.Count>0)37 {38 mID_User = dt.Rows[0]["ID"].ToString(); 39 }4041 for (int i = 0; i < listTranSQLCmd.Count; i++) 42 {43 //如果队列中的语句需要连接ID,则处理SQL语句后再执行 44 string strSQL = "";45 if (listTranSQLCmd[i].bNeedID==true) 46 {47 strSQL = string.Format(listTranSQLCmd[i].strSQL, mID_User); 48 }49 else50 {51 strSQL = listTranSQLCmd[i].strSQL; 52 }5354 mandText = strSQL; 55 ChaosSqlCmd.ExecuteNonQuery(); 56 }5758 //全部成功执行则提交59 mit();60 }61 catch (System.Data.SqlClient.SqlException Ex) 62 {63 //发生问题则回滚64 ChaosSqlTran.Rollback();65 throw new Exception(Ex.Message); 66 }67 }68 }测试代码如下:1 static void Main(string[] args)2 {3 try4 {5 List<DB_Operation.ChaosDbOprt.Chaos_TranSQLCmd>Chaos_SQLCmdList = newList<DB_Operation.ChaosDbOprt.Chaos_TranSQLCmd>();67 //构造SQL语句向User表中写入数据8 string strSQL = "insert into PT_User (UserName) values ('Lee')";910 //构造SQL语句向UserDepart表写入数据11 for (int i = 0; i < 10; i++) 12 {13 DB_Operation.ChaosDbOprt.Chaos_TranSQLCmd nCmd = newDB_Operation.ChaosDbOprt.Chaos_TranSQLCmd();14 if (i==6)15 {16 //构造错误SQL语句,使写入数据库的操作不能成功执行 17 nCmd.strSQL = "insert into PT_UserDepart (ID_User,ID_Depart) values ({0}," + "A String which can't be inserted as ID_Depart)";18 }19 else20 {21 //正常SQL语句22 nCmd.strSQL = "insert into PT_UserDepart (ID_User,ID_Depart) values ({0}," + i.ToString() + ")"; 23 }24 nCmd.bNeedID = true;25 Chaos_SQLCmdList.Add(nCmd);26 }2728 DB_Operation.ChaosDbOprt CDO = new DB_Operation.ChaosDbOprt();29 CDO.Chaos_ExecuteSqlTran(Chaos_SQLCmdList, strSQL); 3031 Console.WriteLine("数据写入成功~");32 Console.ReadLine();33 }34 catch (Exception ex)35 {36 Console.WriteLine("Error:\r\n"+ex.Message); 37 Console.ReadLine();38 }39 }规范化代码如下:1 #region 实现数据库事务的方法,实现以事务的方式将多条SQL语句同时写入数据库(其中某些语句依赖于第一条语句插入数据库后自动生成的ID)23 public struct Chaos_TranSQLCmd4 {5 /// <summary>6 /// 一条SQL语句,在需要添加ID的地方用"{0}"来代替7 /// 如:INSERT INTO PT_FeeItemDetails(ID_FeeItem,ID_ExamItem) VALUES ({0},005)等8 /// </summary>9 public string strSQL;1011 /// <summary>12 /// 标记该条SQL语句是否需要连接ID13 /// </summary>14 public bool bNeedID;15 }16 /// <summary>17 /// 该函数用于实现以事务的方式将多条SQL语句同时写入数据库(其中某些语句依赖于第一条语句插入数据库后自动生成的ID)18 /// </summary>19 /// <param name="strInsertID_SQL">需要先插入数据库中以产生ID的SQL语句</param>20 /// <param name="strTableName">需要首先插入数据库中以产生ID的数据表的名称,如"PT_FeeItem"等</param>21 /// <param name="listTranSQLCmd">需要连接ID的SQL语句的列表</param> 22 public void Chaos_ExecuteSqlTran_InsertID(string strInsertID_SQL,string strTableName, List<Chaos_TranSQLCmd> listTranSQLCmd) 23 {24 using (SqlConnection ChaosSqlConn = newSqlConnection(strSqlConnString))25 {26 SqlCommand ChaosSqlCmd = new SqlCommand(); 27ChaosSqlCmd.Connection = ChaosSqlConn;28 ChaosSqlConn.Open();29 SqlTransaction ChaosSqlTran = ChaosSqlConn.BeginTransaction();30 ChaosSqlCmd.Transaction = ChaosSqlTran;3132 try33 {34 string m_strID = "";3536 //先将数据插入User37 mandText = strInsertID_SQL; 38ChaosSqlCmd.ExecuteNonQuery(); 3940 string strSQL_Tmp = string.Format("SELECT IDENT_CURRENT('{0}') as 'ID'",strTableName);41 //再获取ID42 DataSet ds = this.ExecAdapter(strSQL_Tmp, "T"); 43 DataTable dt = ds.Tables["T"];44 if (dt.Rows.Count>0)45 {46 m_strID = dt.Rows[0]["ID"].ToString(); 4748 for (int i = 0; i < listTranSQLCmd.Count; i++) 49 {50 //如果队列中的语句需要连接ID,则处理SQL语句后再执行 51 string strSQL = "";52 if (listTranSQLCmd[i].bNeedID == true) 53 {54 strSQL = string.Format(listTranSQLCmd[i].strSQL, m_strID);55 }56 else57 {58 strSQL = listTranSQLCmd[i].strSQL; 59 }6061 mandText = strSQL; 62ChaosSqlCmd.ExecuteNonQuery(); 63 }64 }65 else66 {67 //如果没有正确获取首先插入语句的ID,则回滚 68ChaosSqlTran.Rollback();69 throw new Exception("产生ID语句没有成功执行,后续语句无法继续执行,已回滚~\r\n");70 } 717273 //全部成功执行则提交74 mit(); 75 }76 catch (System.Data.SqlClient.SqlException Ex)77 {78 //发生问题则回滚79 ChaosSqlTran.Rollback(); 80 throw new Exception(Ex.Message); 81 }82 }83 }84 #endregion。