c#连接sql server之面向数据编程
ADO.NET简介 | ADO.NET是.NET Framework中不可缺少的一部分,它是一组类。通过这些类,.NET应用程序就可以访问数据库了。ADO.NET的功能非常强大,它提供了对关系数据库、XML以及其他数据存储的访问。应用程序可以通过ADO.NET技术与这些数据源进行连接,对数据进行增、删、改、查等操作 | ||||||||||
ADO.NET的主要组件 | ADO.NET提供了两个组件,用来访问和处理数据: .NET Freamwork数据提供程序和DataSet(数据集) 1、.NET Framework数据提供程序是专门为数据处理以及快速地只进、只读访问数据而设计的组件。使用它可以连接数据源、执行命令和检索结果,直接对数据源进行操作。 2、DataSet是专门为独立于任何数据源的数据访问而设计的。使用它,可以不必直接和数据源打交道,可以大批量地操作数据,也可以将数据绑定在控件上。 |
||||||||||
Connection对象 | 常用属性和方法 |
属性:
|
|||||||||
定义连接字符串 | 不同的数据库连接字符串,其格式不同。 SQL Server数据库的连接字符串格式一般为: Data Source=服务器名;Initial Catalog = 数据库名,User ID =用户名;Pwd=密码 数据库连接字符串由多个参数组成,其中: Data Source:指定与应用程序连接的数据库服务器的名称或IP地址。如果将本机作为应用程序的数据库服务器,则该参数的值可以是"."、"(local)"或"127.0.0.1"。 Initial Catalog:指定应用程序将要访问的数据库名称。 User ID:SQL Server数据库的用户名。 Pwd:SQL Server数据库用户名的密码。 密码如果为空,可以省略Pwd一项。 |
||||||||||
创建Connection对象 | 命名控件:System.Data.SqlClient; SqlConnection con = new SqlConnection(connString); 可以将定义好的连接字符串当构造函数传给对象来创建Connection对象。 打开数据库连接,执行命令后,要确保关闭数据库连接。 |
||||||||||
Command 对象 |
创建Command对象 | SqlCommand com = new SqlCommand(SQL语句,Connection对象); | |||||||||
常用属性和方法 |
属性:
方法: |
||||||||||
ExecuteScalar()方法示例代码 |
SqlConnection con = new SqlConnection(strConn); try { string sql = "select count(*) from Admin" con.Open(); SqlCommand com = new SqlCommand(strSql,con); int iRet = (int)com.ExecuteScalar(); } catch(Exception) { Console.WriteLine("发生异常"); } finally { con.Close(); }
|
||||||||||
ExecuteReader()方法示例代码 |
1、调用Command对象的ExecuteReader方法创建DataReader对象
|
||||||||||
ExecuteNonQuery()方法示例代码 | Command对象的ExecuteQuery()方法用于执行指定的SQL语句,如UPDATE、INSERT、DELETE,它返回的是受SQL语句影响的记录行数。SqlConnection con = new SqlConnection(strConn); try { string sql = "insert into [Grade] values(S1)" con.Open(); SqlCommand com = new SqlCommand(strSql,con); int iRet = com.ExecuteNonQuery(); } catch(Exception) { Console.WriteLine("发生异常"); } finally { con.Close(); }
|
||||||||||
DataReader对象 | 常用属性和方法 |
属性:
|
|||||||||
DataAdapter对象 | 简介 | 数据适配器从数据库中读取数据,是通过一个Command命令来实现的,它是数据适配器的一个属性SelectCommand。把数据放在DataSet中,需要使用DataAdapter的Fill()方法。反过来,要把DataSet中修改过的数据保存到数据库,需要使用DataAdapter的Update()方法。 | |||||||||
常见属性和方法 |
属性
|
||||||||||
创建DataAdapter对象的三种方法 |
第一种方法: SqlDataAdapter adapterGrade = new SqlDataAdapter(sql.dbHelper.Connection); 第二种方法: SqlDataAdapter adapterGrade = new SqlDataAdapter(); SqlCommand command = new SqlCommand(sql,dbHelper.Connection); //第一个参数是SQL语句,第二个参数是Connection对象 adapterGrade.SelectCommand = command; 第三种方法: SqlDataAdapter adapterGrade = new SqlDataAdapter(); SqlCommand command = new SqlCommand(); adapterGrade.SelectCommand = command; adapterGrade.SelectCommand.Connection = dbHelper.Connection; adapterGrade.SelectCommand.CommandText = sql; 经验:仔细阅读、分析多种创建DataAdapter对象查询数据的代码,你会发现这些代码的共同点是:创建一个DataAdapter对象,都与Connection、Command对象有关,并且要编写SQL语句。 在不同的代码段中,Connection对象的出现位置可能不痛。 |
||||||||||
示例代码 |
//查询用的Sql语句 string sql = "select * from Grade"; //查询并填充数据集 DBHelper dbHelper = new DBHelper(); DataSet ds = new DataSet();//创建数据集对象 //创建DataAdapter SqlDataAdapter adapterGrade = new SqlDataAdapter(sql.dbHelper.Connection); //填充数据集 adapterGrade.Fill(ds,"Grade");//第一个参数是DataSet对象,第二个参数是数据表名称字符串 foreach(DataRow row in ds.Tables[0].Rows) { Console.WriteLine("{0}\t{1}",row["GradeId"],row["GradeName"]); } //我们使用foreach语句循环取出数据表中的每一行(DataRow),因为数据集中只填充了一个表,所以它在数据表集合中的索引是0,可以使用dataSet.Tables[0]找到它。
|
||||||||||
DataSet对象 | 简介 | 我们已经知道,当应用程序需要查询数据时,可以使用DataReader对象来读取数据,DataReader每次只读取一行数据到内存中。如果想查看100条数据,就要从数据库读100次。并且在这个过程中要一直保持和数据库的连接,而且是只读只进型的读取方法。这就给程序想再次获得读取过的数据带来了麻烦。ADO.NET提供了数据集对象来解决这个问题。利用数据集,我们可以在断开与数据库连接的情况下操作数据,可以操作来自多个相同或不同数据源的数据。 | |||||||||
创建DataSet | DataSet位于System.Data命名空间中,创建DataSet的语法如下。 DataSet 数据集对象 = new DataSet("数据集的名称字符串"); 方法中的参数是数据集的名称,可以有,也可以没有,如果没有写参数,创建的数据集的名称就默认为NewDataSet。例如 DataSet myDataSet = new DataSet(); DataSet myDataSet = new DataSet("MySchool"); |
||||||||||
异常处理 | try-catch语句 | 语法: try { //包含可能出现异常的代码 } catch(处理的异常类型) { //处理异常的代码 } try-catch语句是把可能出现异常的代码放在try块中。如果在程序运行过程中发生了异常,就会跳转到catch块中进行错误处理,这个过程叫做捕获了异常。如果程序执行没有发生异常,那么将会正常执行try块中的全部语句,但不会执行catch块中的语句。 |
|||||||||
try-catcch-finally语句 | 语法:try { con.Open(); } catch(Exception ex) { //错误处理代码 } finally { con.Close(); } 无论是否发生异常,出现在finally块中的语句都会执行。 程序在执行了try块或catch块之后总会将控制权传递给finally块,与try块的退出方式无关。 |
||||||||||
DataSet和DataReader的用途 | DataSet适用的情况:想把数据缓存在本地,供应用程序使用;想在断开数据库连接的情况下仍能使用数据;想为控件指定数据源。 DataReader适用的情况:只读取查询结果,节省内存,提高性能。 |