1第八章数据库基本操作一、数据绑定简单数据绑定到前台html代码中用%#变量名%或%#控件名.属性%然后在.cs代码中,设置对应变量的属性为public,并给对应的变量赋值,最后用页面数据绑定方法Page.DataBind();也可以在html代码中用%=变量名%,在.cs代码中,设置对应变量的属性为public,并给对应的变量赋值例8.1例8.22二、复杂数据绑定四种数据提供程序(1)SQLServer.NETFramework数据提供程序。(2)OLEDB.NETFramework数据提供程序(3)ODBC.NETFramework数据提供程序(4)Oracle.NETFramework数据提供程序NETFramework数据提供程序3NETFramewor数据提供程序包含了Connection,Command,DataReader和DataAdapter4个核心对象,功能如下:1)Connection:建立与特定数据源的连接2)Command:对数据源执行数据库命令,用于返回数据、修改数据、运行存储过程以及发送或检索参数信息等。3)DataReader:从数据源中读取只进且只读的数据流。4)DataAdapter:执行SQL命令并用数据源填充DataSet。DataAdapter提供连接DataSet对象和数据源的桥梁。DataAdapter使用Command对象在数据源中执行SQL命令,以便将数据加载到DataSet中,并使对DataSet中数据的更改与数据源保持一致。4个连接数据库对象4在ASP.NET应用程序中访问数据库,如果直接在.aspx的HTML代码中使用,则需要在程序开始处引入相应的命名空间。例如在程序中访问SQLServer2000,需要使用以下语句:%@ImportNamespace=”System.Data”%%@ImportNamespace=”System.Data.SqlClient”%在html代码中直接引入命名空间:5Connection对象简介如果使用后台.CS编写代码,则需要使用以下语句:usingSystem.Data;usingSystem.Data.SqlClient;//用sql数据库,首先增加使用命名空间:usingSystem.Data.OleDb;//用ACCESS等数据库然后连接数据库,用SqlConnection和OleDbConnection类对象定义的语法格式SqlConnection类对象定义的语法格式为:SqlConnection对象名=newSqlConnection([ConnectionString])OleDbConnection类对象定义的语法格式为:OleDbConnection对象名=newOleDbConnection([ConnectionString])6如果连接OLEDB数据源,ConnectionString属性通常包含以下参数:1)Provider:设置数据源的OLEDB驱动程序,该参数不能省略。Access的驱动程序为“Microsoft.Jet.OLEDB.4.0”,SQLServer6.5或之前版本的驱动程序为“SQLOLEDB”,Oracle数据库的驱动程序为“MSDAORA”。2)DataSource:设置数据源的实际路径。3)UserID:设置登录数据库的账号。4)Password:设置登录数据库的密码。7VS2003与VS2005的sqlserver连接之比较1、连接数据库的配置文件Web.config中在Web.config文件中其中VS2003/2005用下列keyconfigurationappSettingsaddkey=dsnvalue=DataSource=(local);UID=sa;PWD=;DATABASE=S_Class//appSettings……./configuration8而VS2005也可用下列nameconfigurationappSettings/connectionStringsaddname=chatConnconnectionString=DataSource=.;InitialCatalog=chat;UserID=saproviderName=System.Data.SqlClient//connectionStrings……./configuration9当然,他们都可以使用集成安全方式的连接:connectionStringsaddname=dsnconnectionString=DataSource=.;InitialCatalog=member;IntegratedSecurity=TrueproviderName=System.Data.SqlClient//connectionStrings102.在应用程序(.cs代码)中进行连接VS2003/2005用:usingSystem.Configuration;//SqlConnectioncn;stringstrconn=ConfigurationSettings.AppSettings[dsn];//下面是vs2005用的stringstrconn=ConfigurationManager.AppSettings[“dsn];cn=newSqlConnection(strconn);cn.Open();11VS2005用:stringstrconn=ConfigurationManager.ConnectionStrings.[dsn].ToString();或stringstrconn=System.Configuration.ConfigurationSettings.AppSettings[dsn];12另外,VS2005对Sqlserver还提供了一种新的连接方式SqlDataSource控件:SqlDataSourcesds=newSqlDataSource();sds.ConnectionString=ConfigurationManager.ConnectionStrings[dsn].ToString();13操纵命令假设有要验证的,如下:14用VS2003实现:Stringstr_id=Tbx_userid.Text;stringstrconn=ConfigurationSettings.AppSettings[dsn];SqlConnectioncn=newSqlConnection(strconn);cn.Open();stringstrsql=select*fromuserswhereUser_id='+Tbx_userid.Text+'andUser_password='+Tbx_userpwd.Text+';15SqlCommandcm=newSqlCommand(strsql,cn);SqlDataReaderdr=cm.ExecuteReader();if(dr.Read())//如果找到了{Session[User_id]=dr[User_id];Session[user_power]=dr[User_power];//用户权限if((int)Session[“User_power”]==0)//用户权限为0,仅查询{Response.Redirect(“query.aspx”);//跳转查询页面}}else{Lbl_note.Text=对不起,登陆失败!;}cn.Close();16使用存储过程好处:1、性能方面:存储过程提供了许多标准sql语言中所没有的高级特性。其传递参数和执行逻辑表达式的功能,有助于应用程序设计者处理复杂任务。另外,存储过程存储在本地服务器上,减少了执行该过程所需的网络传输宽带和执行时间。(存储过程已经对sql语句进行了预编译,所以其执行速度比在程序里执行sql语句快很多)2、程序结构方面:从程序的可扩展性看,使用存储过程会对程序以后的修改带来方便。比如数据库的结构改变了,只需修改相对应的存储结构,和程序中的调用部分即可。3、程序安全性:使用存储过程可避免SQLInjection(注入)攻击。存储过程的使用171.假定银行有下列表格,要求进行转帐处理:实例:18首先,在数据库中存储查询过程CREATEPROCEDURETRANS(@outAccountchar(4),@inAccountchar(4),@amountint)ASDECLARE@outtotalDepositFLOAT;/*定义变量转出的用户余额*/DECLARE@intotalDepositFLOAT;/*定义变量转入的用户余额*/DECLARE@out_usernamechar(10);/*定义变量转出用户名*/DECLARE@in_usernamechar(10);/*定义变量转入用户名*/BEGINset@outtotalDeposit=(selecttop1user_totalFROMuser_countWHEREuser_id=@outAccountorderbysp_datedesc);/*检查转出账户的最后一条记录的余额,把余额保存到变量totalDeposit中*/select@intotalDeposit=(selecttop1user_totalFROMuser_countWHEREuser_id=@inAccountorderbysp_datedesc);/*检查转入账户的最后一条记录的余额,把余额保存到变量totalDeposit中*/19select@out_username=(selecttop1user_nameFROMuser_countWHEREuser_id=@outAccountorderbysp_datedesc);/*保存转出账户的姓名*/select@in_username=(selecttop1user_nameFROMuser_countWHEREuser_id=@inAccountorderbysp_datedesc);/*保存转入账户的姓名*/IF(@outtotalDeposit=0)begin/*账户不存在或账户中没有存款*/ROLLBACK;RETURN;END;IF(@outtotalDeposit@amount)begin/*账户账户存款不足*/ROLLBACK;RETURN;END;insertintouser_countvalues(@outAccount,@out_username,-@amount,getdate(),@outtotalDeposit-@amount)/*添加转出账户,减去转出额*/insertintouser_countvalues(@inAccount,@in_username,@amount,getdate(),@intotalDeposit+@amount)/*添加转入账户,增加转出额*/END;GO20protectedvoidButton1_Click(objectsender,System.EventArgse)//调用存储过程转帐{tranf=newSqlCommand();//生成命令集对象.转帐对象tranf.Connection=MyCon;//MyCon,tranf事先定义好了,并已经连接tranf.CommandType=CommandType.StoredProcedure;//使用存储过程tranf.CommandText=dbo.transfer;//存储过程名SqlParameterparinput=tranf.Parameters.Add(@inAccount,SqlDbType.C