实验六访问数据库一、实验目的1、熟悉通过嵌入式SQL(主语言为C++语言)编程访问数据库,及掌握游标的使用方法2、熟悉通过ODBC接口访问异构数据库并对异构数据库进行操作3、学会配置ODBC数据源4、学会各种数据库的访问方法二、实验要求1、编写一个嵌入式C++程序,实现对SQL Server2005数据库中的“学生课程数据库”的Student表中的年龄进行更新,即系统每输出一个学生记录,询问用户是否更新。
如果要更新,就输入新的年龄。
要求:提交源程序并标识必要的注释。
答:create table provider(Sno char(5)primary key,Sname char(20)not null,Ssex char(4),Sage int);insert into provider values('S1','李刚',’男’,20);insert into provider values('S2','李红',’男’,21);insert into provider values('S3','李飞',’男’,25);insert into provider values('S4','李春',’男’,21);#include<stddef.h>#include<stdio.h>#include<conio.h>#include<stdlib.h>#include<windows.h>#include<sql.h>#include<sqlext.h>#include<sqltypes.h>EXEC SQL BEGIN DECLARE SECTION;char deptname[20];char HSno[9];char HSname[20];char HSsex[2];int HSage;int NEWAGE;EXEC SQL END DECLARE SECTION;long SQLCODE;EXEC SQL INCLUDE sqlca;int main(){void ErrorHandler(void);int count=0;char yn;printf("Please choose the department name(CS/MA/IS):");scanf("%s",&deptname);EXEC SQL CONNECT TO学生课程数据库@localhost:54321USER "SYSTEM"/"MANAGER";EXEC SQL DECLARE SX CURSOR FOR SELECT Sno,Sname,Ssex,Sage FROM Student WHERE SDept=:deptname;EXEC SQL OPEN SX;for(;;){EXEC SQL FETCH SX INTO:HSno,:HSname,:HSsex,:HSage;if(sqlca.sqlcode!=0)break;if(count++==0)printf("\n%-10s%-20s%-10s%-10s\n","Sno","Sname","Ssex", "Sage");printf("%-10s%-20s%-10s%-10d\n",HSno,HSname,HSsex,HSage);printf("UPDATE AGE(y/n)?");do{scanf("%c",&yn);}while(yn!='N'&&yn!='n'&&yn!='Y'&&yn!='y');if(yn=='y'||yn=='Y'){printf("INPUT NEW AGE:");scanf("%d",&NEWAGE);EXEC SQL UPDATE Student SET Sage=:NEWAGE WHERE CURRENT OF SX;}}EXEC SQL CLOSE SX;EXEC SQL COMMIT WORK;EXEC SQL DISCONNECT学生课程数据库;return1;}2、查有关C++、Java、C#中有关资料,分别写出C++、Java、C#访问SQL Server2005数据库数据的方法及步骤。
(只写你学的那门语言即可)答:C#访问SQL Server2005数据库数据的方法及步骤如下所示:一.数据库连接字符串典型的数据库连接字符串包括:集成验证和混合验证两种模式集成验证连接字符:Data Source=locolhost;Initial Catalog=数据库名称;Integrated Security=True混合验证模式字符:Server=localhost;Initial Catalog=数据库名称;Persist Security Info=False;User ID=****; Password=****;注:1.这里的Data Source或Server表示数据源所在的计算机名称或IP地址,可以互换。
2.Initial Catalog表示连接的数据库名称,可写为database3.Integrated Security表示是否要为集成身份验证4.如果使用的是混合验证,需要提供用户名User ID和密码Password字段。
二.类和对象如下图为中的基本类,注意不是一个继承表,而是关系表 Data提供者对象客户对象DataSetDataTableDataRowDataColumn DataRelation Connection Command Command Builder DataReader DataAdapter·提供者对象:专用于每一种类型的数据源;专用于提供者的对象完成数据源中实际的读取和写入工作。
·用户对象:将数据读入到内存中后用来访问和操作的数据的对象。
提供者对象需要一个活动的连接,可以使用它们预先读取数据,然后根据需要通过用户对象使用内存中的数据,也可以使用提供者对象更新数据源中的数据,并将改动写回到数据源中。
用户对象以非连接方式使用,甚至在数据库连接关闭之后,也可使用内存中的数据。
1.提供者对象在每一个.NET数据提供者中定义的对象,其名前带有特定提供者的名称。
因此,用于OLE DB提供者的连接对象就是OleDbConnection;用于提供者的类是SqlConnection。
使用时要分别使用using System.Datat.OleDb;和using System.Data.SqlClient;(1)连接对象连接对象是我们使用的第一个对象,用于任何其它对象之前。
它提供了到数据源的基本连接(2)命令对象可以使用此对象给数据源发出命令,如“Select*from customers”。
对于不同的提供者,该对象的名称是用于SQL Server的SqlCommand,用于ODBC的OdbcCommand,用于OLE DB的OleDbCommand。
(3)CommandBuilder对象此对象用于构建SQL命令,在基于单一表查询的对象中进行数据修改。
主要用来更新数据。
对象的名称根据不同的提供者分为:SqlCommandBuilder、OdbcCommandBuilder、OleDbCommandBuilder(4)DataReader可以从数据源中读取仅能向前和只读的数据流。
对于简单的读取数据来说,此对象的性能最好。
对于不同的提供者,对象名称为:SqlDataReader、OdbcDataReader、OleDbDataReader (5)DataAdapter对象这是一个通用类,可执行针对数据源的各种操作,包括更新变动的数据,填充DataSet 对象以及其它操作。
对于不同的提供者对象名称为:SqlDataAdapter、OdbcDataAdapter、OleDbAdapter。
2.用户对象用于定义的断开、客户端的对象,它们与.NET数据提供者无关,存在于System.Data命名空间中。
(1)DataSet对象DataSet对象是用户对象的首要对象,此对象表示一组关系表,在应用程序中这些表为一个单元来引用。
例:Customer、Orders、Products是DataSet中的表,它们表示每一位顾客和它们从公司中定购的产品。
使用该对象可快速从每个表中获取所需要的数据,当与服务器断开时检查并修改数据,然后在另一个操作中使用这些修改的数据更新服务器。
DataSet运行访问低级对象,这些对象代表单独的表和关系。
这些对象是DataTable对象和DataRelation对象(2)DataTable对象此对象代表DataSet中的一个表,如Customers、Orders、或ProductsDataTable对象允许访问其中的行和列:·DataColumn对象:代表表中的一列,比如OrderID或CustomerName·DataRow对象:代表来自表的关联数据的一行,如某位客户的CustomerID、姓名、地址等。
(5)DataRelation对象此对象代表通过共享列而发生关系的两个表之间的关系。
例:Orders表中的CustomerID 列标识发出订单的客户。
可以创建DataRelation对象,通过共享列CustomerID建立Customers 和Orders表之间的关系。
3.使用System.Data命名空间在C#中使用的第一步是引用System.Data命名空间,其中含有所有的类。
将using System.Data;置于开端接下来为所使用的特定数据源引用.NET数据提供者(1)SQL 数据提供者使用的是SQL server数据库(版本7及以上),包括桌面引擎(SQL Express或MSDE),使用SQL Server专用内置.NET数据提供者Using System.Data.SqlClient;(2)数据提供者使用Oracle数据库时,使用其专用内置.NET提供者Using System.Data.OracleClient;(3)提供者使用Microsoft Access时,可以使用哪个OLE 数据提供者Using System.Data.OleDb;(4)数据提供者如果数据源没有内置的或OLEDB提供者,可使用数据提供者,因为大多数数据库都提供了ODBC接口Using System.Data.Odbc;4.用DataReader读取数据例:using System;using System.Data;using System.Data.SqlClient;using System.Collections.Generic;using System.Text;namespace ConsoleApplication1{class Program{static void Main(string[]args){SqlConnection thisConnectin=newSqlConnection(@"server=(local)\Sqlexpress;Integrated“)+“Security=true;database=test");thisConnectin.Open();SqlCommand thisCommand=thisConnectin.CreateCommand();mandText="Select*from table1";SqlDataReader thisReader=thisCommand.ExecuteReader();while(thisReader.Read()){Console.WriteLine("\t{0}\t{1}",thisReader["a"],thisReader["b"]);}thisReader.Close();thisConnectin.Close();Console.Write("Program finished,Press Enter/Retrurn to continue:");Console.ReadLine();}}}程序中提取数据的5步:(1)连接数据源;(2)打开连接;(3)发出一个Sql查询命令(4)使用DataReader读并显示数据(5)DataReader和连接(1)连接数据源:需要使用连接字符串创建一个连接对象。