用ADO.NET向数据库发送操作指令.ppt

上传人:za****8 文档编号:15924786 上传时间:2020-09-14 格式:PPT 页数:34 大小:411.50KB
返回 下载 相关 举报
用ADO.NET向数据库发送操作指令.ppt_第1页
第1页 / 共34页
用ADO.NET向数据库发送操作指令.ppt_第2页
第2页 / 共34页
用ADO.NET向数据库发送操作指令.ppt_第3页
第3页 / 共34页
点击查看更多>>
资源描述
数据库技术应用袁志,-1-,第4讲 用ADO.NET向数据库发送指令,事务,系统分析,数据库设计,UI设计,数据库连接,数据库查询,离线数据管理,安全性设计,XML数据交换,程序发布部署,-2-,课程回顾,上次课,介绍了ADO.NET组件和建立数据库连接的方法。 在BookStore系统中,我们使用SqlConnection对象连接SQL Server 数据库文件。为了能够在程序完成后可以修改连接字符串以适应数据库位置的改变,把连接字符串保存在配置文件中。把连接对象封装在一个公共类DAC中,供各所有功能模块共享。 现在我们知道了应用程序如何连接数据库,下面开始学习应用程序如何向数据库发送操作命令。,-3-,课程内容,本次课,讲述使用Command对象向数据库发送增删改查的操作指令。我们将了解Command对象的主要属性和方法。对于不同的操作目标,我们为Command对象选用不同的执行方式。最后通过BookStore系统中的和“新书登记”和“图书信息”两个模块的代码对本课的知识点进行综合演示。 目录: 1. Command对象的属性和方法 2. Command对象的执行方式 3. 在查询语句中使用变量 4. 案例分析,-4-,1.Command对象的属性和方法,数据库连接之后,可以向数据库发送操作指令了,此时用到Command对象。 在数据库中,增删查改数据的操作称为DML,创建、修改数据库、表、视图等操作称之为DDL。Command对象可以发送DML和DDL。 Command对象属于数据提供程序的一部分,有四个版本,分别有不同的前缀,比如SqlCommand, OleDbCommand。 这里只讲述SqlCommand。,-5-,1.Command对象的属性和方法,-6-,1.Command对象的属性和方法,创建Command对象有三种方式 1,使用new关键字,调用Command对象的无参构造函数,再进行属性设置,代码示例: SqlCommand cmd=new SqlCommand(); cmd.CommandText=“Select * From TBook”; cmd.CommandType=CommandType.Text; /缺省值可省略 cmd.Connection=conn; /conn是一个SqlConnection对象 2,使用new关键字,但使用构造参数来指定查询字符串和Connection对象,代码示例: SqlCommand cmd=new SqlCommand(“Select * From TBook”,conn); 3,通过Connection对象的CreateCommand方法。代码示例: SqlCommand cmd=cn.CreateCommand();,-7-,1.Command对象的属性和方法,讨论:关于ComandType CommandType说明CommandText的含义,它是一个枚举值,有三个可能: 1,CommandType.Text(默认值):表示CommandText是一条SQL语句,例如执行一条SQL命令,代码如下: SqlCommand cmd=new SqlCommand(“Delete TBook Where BookId=798,cn); cmd.CommandType=CommandType.Text; 2,CommandType.Procedure:表示CommandText是一个存储过程名,例如执行存储过程sp1,代码如下: SqlCommand cmd=new SqlCommand(“sp1”,cn); cmd.CommandType=CommandType.Procedure; 3,CommandType.TableDirect:表示CommandText是一个表名,例如,获取一个表的全部数据,代码如下: SqlCommand cmd=new SqlCommand(“TBook”,cn); cmd.CommandType=CommandType.TableDirect;,-8-,2. Command对象的执行方式,Command对象构造之后,就要选择它的执行方法了。Command对象有四种方法: ExecuteScalar() ExecuteNonQuery() ExecuteDataReader() ExecuteXMLDataReader(),-9-,2. Command对象的执行方式,2.1 ExecuteNonQuery()更改查询 有2种用途。 一是使用数据操纵语言(DML)查询 例:Update TBook SET Status=借出 WHERE BookId=798 例:INSERT INTO TLend(BookId,ReaderId,LendDate) Values (798,0111,2010-5-6) 例:DELETE FROM TBook WHERE BookId=798 二是数据定义语言(DDL)查询,此种类型常用于更改数据库结构 例:CREATE TABLE table1 (Field1 int NOT NULL CONSTRAINT PK_Table1 PRIMARY KEY, Field2 varchar(32) 例:ALTER VIEW View1 AS SELECT Field1,Field2 FROM table1 例:DROP PROCEDURE StoredProcedure1,-10-,2.Command对象的执行方式,2.1 ExecuteNonQuery() 代码演示 SqlConnection cn=new SqlConnection; cn.ConnectionString=; cn.Open(); SqlCommand cmd=cn.CreateCommand() cmd.CommandText= “DELETE FROM TBook WHERE BookId=798”; cmd.ExecuteNonQuery(); cn.Close();,-11-,2.Command对象的执行方式,2.1 ExecuteNonQuery() 讨论 不返回结果集,但是返回操作所影响的行数 SQL语法错误可能会导致方法执行失败。 更改查询并不总能执行,例:“Update TBook SET Status=借出 WHERE BookId=798”无法正确执行可能会因为表中没有满足条件的行,对于数据库来说,这样的结果并不表示失败. 如何辨别更改查询是否生效了呢?答案是通过获取受影响的行数来判断。,-12-,2.Command对象的执行方式,2.1 ExecuteNonQuery() 通过获取受影响的行数来判断更新查询是否做生效,代码演示: cmd.CommandText= “Update TBook SET Status=借出 WHERE BookId=798”; int recAffected=cmd.ExecuteNonQuery(); if(recAffected=1) Console.WriteLine(Update Succeeded); else Console.WriteLine(Update Failed); 特别注意:如果执行的是DDL查询,那么ExecuteNonQuery方法返回值是-1,-13-,2.2 Command.ExecuteReader()返回结果集的查询 返回值是DataReader对象,可以通过DataReader对象检查查询结果, 代码演示 .(省略-打开Connection对象cn的过程). SqlCommand cmd=new SqlCommand(SELECT Title,Author FROM TBook,cn) SqlDataReader dr=cmd.ExecuteReader(); while (dr.read() Console.WriteLine(drTitle“+ - + drAuthor“) dr.Close(); cn.Close();,2.Command对象的执行方式,-14-,2.Command对象的执行方式,2.2 Command.ExecuteReader() 讨论 关于DataReader对象的Read方法,只有在你调用Read()方法之后,数据的第一行才可用,所以循环中要在显示之前就调用Read方法,调用一次Read方法,DataReader会自动移动到下一行。Read()方法返回值为布尔类型,表示是否读到一行。 dr“Title”访问的是当前行的Title列的值。 要尽可能快速的关闭DataReader对象。一个带着开放的DataReader的Connection对象仍是锁定的,如果在关闭DataReader对象之前,试图打开第二个DataReader对象,会导致异常:”需要一个开放并可用的连接”,-15-,2.Command对象的执行方式,2.2 Command.ExecuteReader() 处理多结果集 某些数据库(比如SQL SERVER)支持执行返回多个结果的批查询.注意,Access不支持 假设有如下查询: SELECT CustomerID,CompanyName,ContactName FROM Customers; SELECT OrderID,CustomerID,EmployeeID,OrderData FROM Orders; SELECT OrderID,ProcedureID,Quantity,UnitPrice FROM Order Details 使用前面的方法,用DataReader对象在循环中Read()只能在批查询中循环第一个查询的结果。解决这个问题需要使用DataReader对象提供的NextResult方法。该方法可以使你移动到下一个返回行的查询结果上去。该方法返回一个布尔值,表示是否成功转移到下一结果集。,-16-,2.Command对象的执行方式,2.2 Command.ExecuteReader() 使用NextResult()处理多结果集,代码演示 cn.Open(); string strsql =” SELECT * From TBook;SELECT * FROM TReader” ; SqlCommand cmd=new SqlCommand(sql,cn); SqlDataReader dr=cmd.ExecuteReader(); do while (dr.Read() Console.WriteLine(dr0 + “_” + dr1); Console.WriteLine(); while dr.NextResult();,-17-,2.Command对象的执行方式,2.3 Command.ExecuteScalar()单值查询 查询举例: Select COUNT(*) from TBook Select Title from Customers where BookId=798 如上查询,用DataReader有点大材小用。ExecuteScalar()专门获取单值查询,本质上是返回查询结果的第一行第一列的值,由于值的类型实现不可知,因此其返回值类型设计为Object。 代码演示 cn.Open(); SqlCommand cmd=cn.CreateCommand(); cmd.CommandText=”select COUNT(*) from TBook”; int count=Covert.ToInt32(cmd.ExecuteScalar(); /获得查询值 cmd.CommandText=”select Title from TBook where BookId=798”; string title=Convert.ToString(cmd.ExecuteScalar(); /获得查询值,-18-,3. 在查询语句中使用变量,参数化查询关于Command对象的Parameters属性 我们注意到前面写的SQL语句中没有变量。比如:Delete From TBook Where BookId=798 在实际应用程序中,798是事先不可知的,它的值由一个变量提供。更复杂的操作可能涉及到多个变量。这些变量就成为SQL语句的参数。,-19-,3.在查询语句中使用变量,第一种方法:用字符串连接,来输入参数值。 举例:有一个整形变量bookId,从数据库的TBook表中删除BookId等于该bookId的行。 string sql=“Delete From TBook Where BookId=“+bookId; SqlCommand cmd=new SqlCommand(sql,cn) cn.Open(); cmd.ExecuteNonQuery(); cn.Close(),-20-,3. 在查询语句中使用变量,第二种方法:用string.Format输入参数值 举例,有3个变量,userId,userName,pwd,构成数据库的TUser的一行,要求插入这一行。代码如下 string sql=string.Format(“Insert Into TUser(UserId,UserName,Pwd) values (0,1,2)”,userId,userName,pwd); SqlCommand.cmd=new (sql,cn); cn.Open(); cmd.ExecuteNonQuery(); cn.Close(); 第一行当然也可以写成下面这样,只是显得不够规整 string sql=“Insert Into TUser(UserId,UserName,Pwd) values (”+userId+”,”+userName+”,”+pwd+”)”;,-21-,3. 在查询语句中使用变量,第三种方法:使用的Parameter对象 在查询字符串中预留参数符号,向Command的 Parameters集合属性中添加若干Parameter,并给它提供值。使用Parameter要比通过编程连接查询字符串更清晰。 代码演示 int bookId=798; cn.Open(); string strSql=”Select * From TBook where BookId=bookId”; SqlCommand cmd=new SqlCommand(strSql,cn); cmd.Parameters.Add(“bookId”, SqlDbType.int) cmd.Parameters0.Value=bookId; SqlDataReader dr =cmd.ExecuteReader(); cn.Close();,-22-,4,案例分析,结合BookStore系统的两个功能窗体FrmAddNewBook和FrmBookInfo的实现过程,对Command对象、DataReader对象进行应用分析。 FrmAddNewBook用于新书登记 FrmBookInfo用于查询修改图书的详细信息。,-23-,4. 案例分析,案例1 :新书登记窗体FrmAddNewBook,-24-,4. 案例分析,FrmAddNewBook的代码-1: private void FrmNewBook_Load(object sender, EventArgs e) SqlCommand cmd = D.CreateCommand(); cmd.CommandText = Select BookType From TBookType; Dac.Cn.Open(); SqlDataReader dr = cmd.ExecuteReader(); while (dr.Read() cbBookType.Items.Add(Convert.ToString(drBookType); Dac.Cn.Close(); private void btnCancel_Click(object sender, EventArgs e) this.Close(); ,-25-,FrmAddNewBook的代码-2: private void btnConfirm_Click(object sender, EventArgs e) if (checkInput() addNewBook(); private bool checkInput() if( txtISBN.Text=“”) return false; if (txtTitle.Text=“”) return false; if (txtAuthor.Text=“”) return false; if (txtPrice.Text=“”)return false; if (txtPublisher.Text=“”)return false; if (txtPublisherYear.Text=“”) return false; if (cbBookType.Text=“”) return false; return true; ,-26-,FrmAddNewBook的代码-3: private void addNewBook() Dac.Conn.Open(); SqlCommand cmd = Dac.Conn.CreateCommand(); /取得新的图书编号 cmd.CommandText = Select Max(BookId) From TBook; int bookId = Convert.ToInt32(cmd.ExecuteScalar() + 1; /增加图书 cmd.CommandText = string.Format(Insert Into TBook(ISBN,Title,Author,Publisher,PublishYear,Price,Status,BookType) Values(0,1,2,3,4,5,6,7),txtISBN.Text, txtBookTitle.Text, txtAuthor.Text, txtPublisher.Text, txtPublishYear.Text, Convert.ToDouble(txtPrice.Text), 在库, cbBookType.Text); cmd.ExecuteNonQuery(); Dac.Conn.Close(); ,-27-,4. 案例分析,案例2:修改图书信息窗体,-28-,4. 案例分析,FormBookInfo的代码-1: /私有变量 int bookId; /构造函数用于接收BookId public FrmBookInfo(int _bookId) bookId = _bookId; InitializeComponent(); /取消 private void btnCancel_Click(object sender, EventArgs e) this.Close(); ,-29-,4. 案例分析,FrmBookInfo的代码-2: /窗体启动 private void FrmUpdateBookInfo_Load(object sender, EventArgs e) SqlCommand cmd = Dac.Cn.CreateCommand(); cmd.CommandText = Select * From TBook Where BookId= + bookId; Dac.Cn.Open(); SqlDataReader dr = cmd.ExecuteReader(); dr.Read(); txtISBN.Text = Convert.ToString(drISBN); txtBookTitle.Text = Convert.ToString(drTitle); txtAuthor.Text = Convert.ToString(drAuthor); txtPublisher.Text = Convert.ToString(drPublisher); txtPublishYear.Text = Convert.ToString(drPublishYear); txtPrice.Text = Convert.ToString(drPrice); cbBookType.Text = Convert.ToString(drBookType); dr.Close(); Dac.Cn.Close(); ,-30-,4. 案例分析,FrmBookInfo的代码-3: /确认修改 private void btnConfirm_Click(object sender, EventArgs e) if (checkInput() modifyBookInfo(); /检查输入 private bool checkInput() if( txtISBN.Text=“”) return false; if (txtTitle.Text=“”) return false; if (txtAuthor.Text=“”) return false; if (txtPrice.Text=“”)return false; if (txtPublisher.Text=“”)return false; if (txtPublisherYear.Text=“”) return false; if (cbBookType.Text=“”) return false; return true; ,-31-,4. 案例分析,FrmBookInfo的代码-4: /修改图书信息 private void modifyBookInfo() Dac.Cn.Open(); SqlCommand cmd = Dac.Cn.CreateCommand(); cmd.CommandText = String.Format(Update TBook Set ISBN=0, Title=1, Author=2, Publisher=3, PublishYear=4, Price=5, BookType=6 Where BookId=7, txtISBN.Text, txtBookTitle.Text, txtAuthor.Text, txtPublisher.Text, txtPublishYear.Text, Convert.ToInt32(txtPrice.Text), cbBookType.Text,bookId); cmd.ExecuteNonQuery(); Dac.Cn.Close(); MessageBox.Show(修改成功); this.Close(); ,-32-,总结,Command对象向数据库发送操作指令。必须在数据库连接开放状态下才能工作,可以发送DML和DDL指令,可以执行查询语句或存储过程。根据不同的操作目的使用不同执行方式。 ExecuteNonQuery()是更改查询, ExecuteScalar()是单值查询, ExecuteReader()是结果集查询,得到DataReader对象。 DataReader只能在数据库连接开放状态下从前到后遍历,而且只能遍历一次。,-33-,总结,Questions?,-34-,作业2-2,写出Command对象的三种执行方式,并分别说明它们的应用场合。 Command对象的CommandType有哪几种?分别表示什么含义? SqlCommand对象用来执行一个存储过程sp1, 请写出该Sqlcommand对象的构造语句。 编写方法 int GetBookCount(),计算BookStore数据库中全部图书的册数。 编写方法bool logon(string userId, string pwd),用来判断用户能否登录,即判断用户名和密码是否与BookStore数据库中TUser表的某行相符。 编写方法 void AddAReader(string readerId, string name, string email),用来向BookStore数据库中的TReader表增加一行。,
展开阅读全文
相关资源
正为您匹配相似的精品文档
相关搜索

最新文档


当前位置:首页 > 图纸专区 > 课件教案


copyright@ 2023-2025  zhuangpeitu.com 装配图网版权所有   联系电话:18123376007

备案号:ICP2024067431-1 川公网安备51140202000466号


本站为文档C2C交易模式,即用户上传的文档直接被用户下载,本站只是中间服务平台,本站所有文档下载所得的收益归上传人(含作者)所有。装配图网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。若文档所含内容侵犯了您的版权或隐私,请立即通知装配图网,我们立即给予删除!