Heim  >  Artikel  >  Datenbank  >  SQLServer数据访问

SQLServer数据访问

WBOY
WBOYOriginal
2016-06-07 15:40:141005Durchsuche

两大类数据访问方式: 1.轻量级:SqlConnection,SqlCommand,SqlDataReader 2.重量级:SqlConnection,SqlDataAdapter,DataTable 五大对象: 链接对象,命令对象,读取器对象,适配器对象,数据集(数据表) 对象介绍: 一、命名空间: 操作SQLServer数据库,一

两大类数据访问方式:
1.轻量级:SqlConnection,SqlCommand,SqlDataReader
2.重量级:SqlConnection,SqlDataAdapter,DataTable

五大对象:
链接对象,命令对象,读取器对象,适配器对象,数据集(数据表)

对象介绍:
一、命名空间:
操作SQLServer数据库,一般用两个命名空间:
using System.Data;
using System.Data.SqlClient;

二、连接对象(SqlServer):SqlConnection
(一)构造:
SqlConnection()
SqlConnection(连接字符串)

连接字符串:不止一种写法。
第一种:手写 "server=.;database=mydb;uid=sa;pwd=sa";
第二种:使用服务器资源管理器,通过添加链接用可视化界面生成链接对象,通过查看属性来获得连接字符串。

(二)属性:
ConnectionString:字符串,设置或获取链接对象的连接字符串。
State:ConnectionState枚举类型,返回当前连接状态。

(三)方法:
Open():void,打开连接
Close():void,关闭连接
CreateCommand():SqlCommand,创建命令对象。(好处是,不用对命令对象单独设置Connection属性)

(四)重要代码:
SqlConnection conn = new SqlConnection("server=.;database=mydb;uid=sa;pwd=sa");
try
{
conn.Open();
....
}
finally
{
conn.Close();
}

二、命令对象(SqlServer):SqlCommand
(一)构造:
SqlCommand()
SqlCommand(SqlConnection,SqlString)
conn.CreateCommand()

(二)属性:
CommandText:string,要执行的SQL命令——SQL语句,存储过程名。
CommandType:CommandType枚举类型,CommandType.Text-SQL-语句;CommandType.StoredProcedure-存储过程
Connection:SqlConnection对象。执行命令时,所使用连接对象。
Parameters:SqlParameterCollection,当CommandText中使用SqlServer局问变量时,需要通过该属性来对变量赋值。

(三)方法:
ExecuteNonQuery():int,执行SQL命令,返回影响的行数。一般用来执行增、删、改
ExecuteReader():SqlDataReader,执行SQL命令,返回数据读取器。一般用来执行查询
ExecuteScalar():object,执行SQL命令,返回首行首列,一般用来执行统计(count(),sum(),avg(),max(),min())查询的。

(四)重要代码:
SqlConnection conn = new SqlConnection("server=.;database=mydb;uid=sa;pwd=sa");
//SqlCommand cmd = new SqlCommand();
//cmd.Connection = conn;
SqlCommand cmd = conn.CreateCommand(); //创建命令对象
//设置命令的类型
cmd.CommandType = CommandType.Text; //cmd.CommandType = CommandType.StoredProcedure;
//指定SQL命令
cmd.CommandText = "insert into nation values(@code,@name);
//添加命令参数
cmd.Parameters.AddWithValue("@code","n005");
cmd.Parameters.AddWithValue("@name","壮族");
//SqlParameter paramCode = new SqlParameter("@code","n005");
//cmd.Parameters.Add(paramCode);
//SqlParameter paramName = new SqlParameter("@name","壮族");
//cmd.Parameters.Add(paramName);

try
{
conn.Open();
cmd.ExecuteNonQuery();
}
finally
{
conn.Close();
}

注意事情:
1.要会调用存储过程(举例)
2.登录:使用统计查询,使用ExecuteScalar()来判断是否登录成功?
3.SQL注入攻击,原理分析及对策(单引号替换,使用SQL局部变量)。
4.查询,增删改,统计查询各举一例。

三、读取器对象(SqlServer):SqlDataReader
只读,只向前的数据读取对象。
它不是结果集,它内存中只占一条数据的空间。每次读取下一条时,会把内存中当前条的内容给冲掉。

(一)构造:
不能直接new出来,构造函数是非public的。
只有唯一的生成方式:cmd.ExecuteReader([CommandBehavior.CloseConnection]);

(二)属性:
HasRows:bool,读取器中是否查出来数据

(三)方法:
Read():读取下一条数据到内存中来。
Close():关闭读取器。一般不会关闭链接,但如果读取器生成的时候Command对象的ExecuteReader()方法中带有CommandBehavior枚举型参数的话,可能把连接也给关掉。

(四)重要代码:

注意事情:
1.登录判断。
查询返回SqlDataReader,使用HasRows属性来判断是否查出记录来,登录是否成功。
SqlDataReader dr = cmd.ExecuteReader();
if(dr.HasRows)
{
}
2.查询多行数据出来,演示多行显示
SqlDataReader dr = cmd.ExecuteReader();
while(dr.Read())
{
Console.WriteLine(dr["列名"].ToString()+(bool)dr[1]); //dr[常用的两种方式];dr[0],dr["列名"]返回的都是object
}


四、DataTable/DataSet
DataSet相当于内存中的数据库,其中包括多个DataTable。
DataTable相当于内存中的数据表。其中包括两个最重要的属性:Rows(DataRowCollection),Columns(DataColumnCollection)。分表代表表的行集合和列集合。
(一)手动造DataTable
//造表
DataTable table = new DataTable();
//造列
DataColumn col1 = new DataColumn("列名","类型","长度");
DataColumn col2 = new DataColumn("列名","类型","长度");
DataColumn col3 = new DataColumn("列名","类型","长度");
table.Columns.Add(col1);
table.Columns.Add(col2);
table.Columns.Add(col3);
//造行
DataRow row1 = table.NewRow(); //用表对象来生成行结象
row1[0] = "";
row1["列名"] = "";
row1[2] = "";
table.Rows.Add(row1);
DataRow row2 = table.NewRow(); //用表对象来生成行结象
row2[0] = "";
row2["列名"] = "";
row2[2] = "";
table.Rows.Add(row2);
DataRow row3 = table.NewRow(); //用表对象来生成行结象
row3[0] = "";
row3["列名"] = "";
row3[2] = "";
table.Rows.Add(row3);


//假设表中已经查出数据来了,我要取某个数据,怎么取法?
例如:假设查出一个数据表table的数据来。
1.我要操作第3行第5列的数据。(假设我从1开始数的列号和行号)
string s = table.Rows[2][4].ToString(); //取值
table.Rows[2][4] = "hello world";//赋值

2.我要操作所有的数据
for(int i=0;i

{
for(int j=0;j {
Console.Write(table.Rows[i][j].ToString());
}
}

3.控件绑定:
xxx.DataSource = table;

(二)使用可视化界面造
抓图说明。

五、数据适配器对象:SqlDataAdapter
适本器对象中包含四大SqlCommand属性:
SelectCommand
InsertCommand
DeleteCommand
UpdateCommand

两大方法:
Fill(DataTable/DataSet)
Update(DataTable/DataSet)

(一)手写代码操作(简单了解)

(二)可视化界面操作。(抓图显示)


***事务及异常处理,大部份开发人员都会疏忽这两个内容。
什么是事务?举例说明。
事务的四大特性:(A——原子性,C——一致性,I——隔离性,D——持久性)

两大类事务:
一、连接内事务
连接打开,在关闭之前,对数据库操作时所加的事务。
SqlTransaction对象
using System.Transaction;
1.事务对象的创建:
conn.Open();
SqlTransaction trans = conn.BeginTransaction();

2.把事务挂到命令对象上去
cmd.Transaction = trans;

3.执行命令对象.
cmd.CommandText="";
cmd.ExecuteNoneQuery();
.....

4.提交事务
trans.Commit();

5.回滚事务:放在catch里面
trans.Rollback();

加代码,举例,抓图说明。成功,不成功


二、分布式事务
在连接打开关闭之外设置事务。可以控制所有操作。
1.启用DTC服务
2.导入System.Transaction引入。
3.使用using System.Transaction导入命名空间
4.编写事务代码。

TransactionScope类


using(TransactionScope ts = new TransactionScope())
{
数据库操作。

ts.Complete();
}

加代码,举例,抓图说明。成功,不成功


异常处理:try...[catch...][finally..]
一、捕获异常
不加try..catch...一旦程序执出错,程序会立马终止。如果加上try...catch...,代表程序中已经把异常给处理了,程序只是终止try部份的运行,转入catch,整个程序不终止运行。

1、try部份:执行的部份,一旦出错就会终止try部份的执行,走catch。程序不会终止。
2、catch部份:异常处理,一旦出错就会走catch,在catch部份进行处理(写日志,界面显示,异常的包装替换)
如果catch(Exception ex)。常用ex.Message获取错误信息。
一个try可以跟多个catch,每个catch获得不同类型的异常对象。

3、finally部份:最终收尾部份,不管程序执行是否出错,总会执行finally,即使在try部份遇到return,break等关键词时,仍然会执行finally

二、抛出异常
(一)造异常对象:
Exception ex = new Exception("异常的错误信息");
throw ex;

(二)派生自己的异常:(少)
class MyException:Exception
{
}

其它数据访

 


(一)构造:

(二)属性:
(三)方法:
(四)重要代码:

Stellungnahme:
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn