ADO.NET 访问数据库(二)

这篇主要是介绍:Miccrosoft SQLServer.NETFramework 数据提供程序(命名空间System.Data.SQLClient)

1、SqlConnection(连接对象)
1.1连接字符串
基本语法:数据源(Data Source)+数据库名称(InitialCatalog)+用户名(User ID)+密码(Password)。

说明:

(1)指定验证方法。

必须指定Sql Server支持的两种身份验证方法(即Windows身份验证和Sql Server身份验证)中的一种。要想使用Windows身份验证,必须在连接字符串中包括 Integrated Security 属性:DataSource=ServerName;Integrated Security=True;默认情况下,IntegratedSecurity属性为False。

(2)连接字符串中可用的选项:
  • ApplicationName(应用程序名称):应用程序的名称。如果没有被指定的话,它的值为.NET SqlClient DataProvider(数据提供程序)。
  • AttachDBFileName/extendedproperties(扩展属性)/Initial File Name(初始文件名): 可连接数据库的主要文件的名称,包括完整路径名称。数据库名称必须用关键字数据库指定。
  • ConnectTimeout(连接超时)/Connection Timeout(连接超时):一个到服务器的连接在终止之前等待的时间长度(以秒计),缺省值为15。
  • ConnectionLifetime(连接生存时间): 当一个连接被返回到连接池时,它的创建时间会与当前时间进行对比。如果这个时间跨度超过了连接的有效期的话,连接就被取消。其缺省值为0。
  • ConnectionReset(连接重置): 表示一个连接在从连接池中被移除时是否被重置。缺少值为真。
  • CurrentLanguage(当前语言): SQL Server语言记录的名称。
  • DataSource(数据源)/Server(服务器)/Address(地址)/Addr(地址)/Network Address(网络地址):SQL Server实例的名称或网络地址。
  • Encrypt(加密):当值为真时,如果服务器安装了授权证书,SQL Server就会对所有在客户和服务器之间传输的数据使用SSL加密。被接受的值有true(真)、false(伪)、yes(是)和no(否)。
  • Enlist(登记):表示连接池程序是否会自动登记创建线程的当前事务语境中的连接,其缺省值为真。
  • Database(数据库)/Initial Catalog(初始编目):数据库的名称。
  • IntegratedSecurity(集成安全)/Trusted Connection(受信连接):表示Windows认证是否被用来连接数据库。它可以被设置成真、伪或者是和真对等的sspi,其缺省值为伪。
  • Max PoolSize(连接池的最大容量): 连接池允许的连接数的最大值,其缺省值为100。
  • Min PoolSize(连接池的最小容量): 连接池允许的连接数的最小值,其缺省值为0。
  • Network Library(网络库)/Net(网络):用来建立到一个SQL Server实例的连接的网络库。支持的值包括: dbnmpntw (Named Pipes)、dbmsrpcn(Multiprotocol/RPC)、dbmsvinn(BanyanVines)、dbmsspxn (IPX/SPX)和dbmssocn (TCP/IP)。协议的动态链接库必须被安装到适当的连接,其缺省值为TCP/IP。
  • PacketSize(数据包大小):用来和数据库通信的网络数据包的大小。其缺省值为8192。
  • Password(密码)/Pwd:与帐户名相对应的密码。
  • PersistSecurity Info(保持安全信息):用来确定一旦连接建立了以后安全信息是否可用。如果值为真的话,说明像用户名和密码这样对安全性比较敏感的数据可用,而如果值为伪则不可用。重置连接字符串将重新配置包括密码在内的所有连接字符串的值。其缺省值为伪。
  • Pooling(池):确定是否使用连接池。如果值为真的话,连接就要从适当的连接池中获得,或者,如果需要的话,连接将被创建,然后被加入合适的连接池中。其缺省值为真。
  • User ID(用户ID):用来登陆数据库的帐户名。
  • WorkstationID(工作站ID):连接到SQL Server的工作站的名称。其缺省值为本地计算机的名称。
2、SqlCommand(命令对象)
2.1、实例化的时候默认初始化的四个属性:
CommandText:空字符串("")
 CommandTimeout:30
CommandType:CommandType.Tex
Connection:Null
2.2、创建命令对象:
SqlCommandcommand = connection.CreateCommand(); //这种方式比较好
SqlCommandcommand=new SqlCommand();
2.3、几个重要的属性:
(1)CommandText:获取或设置要对数据源执行的 Transact-SQL 语句、表名或存储过程!
(2)CommandType:设置你执行的SQL语句是存储过程还是T-SQL(是一个枚举)!
   ● Text:SQL文本命令(默认)
   ● StoredProcedure:存储过程名称
   ●TableDirect:表的名称
(3)Parameters:设置你T-SQL中你需要用到的参数。
2.4、几个重要的方法:

(1)ExecuteNonQuery:返回是影响的行数(int),主要执行更新,添加,删除等操作!
(2)ExecuteReader:执行SQL或存储过程,返回的是SqlDataReader类型,主要用来查询!
注意这个方法的重载CommandBehavior枚举,成员如下:
  ● Default:此查询可能返回多个结果集。执行查询可能会影响数据库状态。当不设置CommandBehavior标志时默认为Default。
  ● SingleResult:查询返回个结果集。
  ● SchemaOnly:查询仅返回列信息。当使用SchemaOnly时,用于SQL Server的.NET Framework数据提供程序将在要执行的语句前加上SET FMTONLYON。
  ● KeyInfo:此查询返回列和主键信息。
  ● SingleRow: 查询应返回一行。
  ● SequentialAccess:提供一种方法,以便DataReader处理包含带有 大量二进制值的列的行。SequentialAccess不是加载整行,而是使DataReader将数据作为流来加载。然后可以使用GetBytes或GetChars方法来指定开始读取操作的字节位置以及正在返回的数据的有限的缓冲区大小。
  ● CloseConnection:在执行该命令时,如果关闭关联的DataReader对象,则关联的Connection对象也将关闭。
(3)ExecuteScalar:返回执行结果集中的第一行第一列,如果没有数据,则返回NULL!

2.5、异步执行命令:

  执行Command对象命令时,需要等待命令完成才能执行其他操作。比如,执行ExcuteNonQuery()方法,应用程序将会保持阻塞,直到数据操作成功完成或者异常终止以及连接超时。异步执行的根本思想是,在执行命令操作时,无需等待命令操作完成,可以并发的处理其他操作。ADO.NET提供了丰富的方法来处理异步操作,BeginExecuteNonQuery和EndExcuteNonQuery就是一对典型的为异步操作服务的方法。BeginExecuteNonQuery方法返回System.IAsyncResult接口对象。我们可以根据IAsyncResult的IsCompleted属性来轮询(检测)命令是否执行完成。

3、SqlParameter(Sql参数)
3.1、几个重要的属性
   ParameterName:设置参数名
   Value:给参数设置值
   Size:设置参数字节最大大小
   SqlDbType:参数在SQL中的类型
3.2、命令对象添加参数集合的几种方法
(1)AddWithValue
(2)Add
(3)AddRange
4、SqlDataReader(数据流读取器)
4.1、基本用法
using (SqlConnection conn = new SqlConnection(""))
{
conn.Open();
SqlCommand command = conn.CreateCommand();
command.CommandText = "";
using (SqlDataReader dr = command.ExecuteReader(CommandBehavior.CloseConnection))
  {
    while (dr.Read())
    {
        //开始读取数据
        string str = dr.GetSqlString(0).ToString();
    }
  }
 } 
4.2、常用方法
  • (1)GetOrdinal:获取指定列名的列序号(索引号),使用这个方法可以把经常变动的列进行固定
    intname=dr.GetOrdinal(“name”); //通过列名来获取当前列的索引号
  • (2)GetName: 获取列名,参数为指定列名的序列号,返回string
    string columnName=dr.GetName(name);//通过列名所处的索引号来获取列名名称
  • (3)IsDBNull:判断当前读取的数据是否为Null,返回类型为Bool
    dr.IsDBNull(coContractID)?”NULL”:dr.GetInt32(coContractID).ToString();
  • (4)NextResult:当查询为批处理查询时,使用这个方法去读取下一个结果集,返回值为Bool,如果存在多个结果集,则为 true;否则为 false。
  • (5)Read:读取数据
4.3、常用属性
(1)HasRow:判断是否包含一行或多行,也就是判断有没有数据,返回类型为Bool。
(2)FieldCount:获取读取的列数,返回类型为Int。
(3)IsClosed:判断读取的数据流是否关闭。
4.4、性能剖析

  读取数据的时候会有很多种写法,如dr[0].ToString(),dr[“Name”].ToString(),dr.GetString(0),dr.GetSqlString(0)等等的读取方式的写法。

4.5读取数据性能总结:
SqlDataReader读取方法
(1)DataReader 索引+基于[序列号]->dr[0].ToString() |Index-basedaccess
(2)DataReader 索引+基于[列名]->dr["Name"].ToString()  |性能最差
(3)GetString 开头的+基于[序列号]->dr.GetString(0) |type-access
(4)GetSql 开头的+基于[序列号]->dr.GetSqlString(0) |Provider-specifictyped accessor 
(5)GetOrdinal() 通过列名获取这个列的序列号 |这个方法在提高性能上面有作用
性能(4)-->(3)-->(1)-->(2) 
4.6、补充

  SqlDataReader是连接相关的,SqlDataReader中的查询结果并不是放在程序中,而是放在数据库服务器中,SqlDataReader只是相当于一个指针(游标),只能读取当前游标指向的行,连接断开就不能再读取。这样无论查询结果有多少条,对程序占用的内存都几乎没有影响。但SqlDataReader对于小数据量的数据来说带来的只有麻烦。

5、SqlTransaction(事务)
5.1、事务中的命名存储点
一旦你定义了命名存储点,只能回滚命名存储点之后的操作,这是要看情况而使用!
using (SqlConnection conn = new SqlConnection(str))
{
conn.Open();
SqlTransaction transaction = conn.BeginTransaction();
SqlCommand cmd = conn.CreateCommand();
cmd.CommandText = "";
cmd.Transaction = transaction;
//使用命名存储点
transaction.Save("this is point");  //定义命名存储点,使用Save方法先保存存储点,定义回滚数据的开始位置                
//这边是你要回滚的操作代码,TO DO... 
//把从命名存储点到这里的操作进行回滚
transaction.Rollback("this is point");  //回滚命名存储点              

} 
5.2、SQL语句中的事务
BEGIN TRANSACTION
 --你需要执行的更新,删除,插入的语句
IF(@@ERROR > 0) //这是系统变量,存储你在执行更新,删除,插入操作时发生错误的记录编号
 ROLLBACK
ELSE

  COMMIT 
5.3、TransactionScope
using (TransactionScope transactionScope = new TransactionScope())
{
try
{
    using (SqlConnection connection = new SqlConnection())
    {
        // TO DO
        //提交事务,如果有异常,他会自动回滚的
        transactionScope.Complete();
    }
}
catch (Exception)
{
    //捕获异常
    throw;
}

} 
6、SqlDataAdapter(数据适配器)
6.1、构造函数
四个重载:
   (1)无参
   (2)SqlDataAdapter(SqlCommand) 执行命令对象实例
   (3)SqlDataAdapter(String,SqlConnection)     只能指定查询语句,连接对象实例
   (4)SqlDataAdapter(String,ConnectionString)
6.2、填充数据(Fill)
DataSet dataSet = new DataSet();
using (SqlConnection conn = new SqlConnection(""))
{
conn.Open();
SqlCommand command = conn.CreateCommand();
command.CommandText = "select name,age,address from T_Student";
SqlDataAdapter dataAdapter = new SqlDataAdapter(command);
dataAdapter.Fill(dataSet);  //填充数据
}
6.3、使用“SqlCommandBuilder”对数据进行增删改查
(1)添加数据
using (SqlConnection conn = new SqlConnection(ConnectionString()))
{
conn.Open();
//构建查询语句,也可以指定SqlCommand,其中变换的方法有很多
SqlDataAdapter da = new SqlDataAdapter("select LastName,FirstName from dbo.Employees", conn);
DataSet ds = new DataSet();
da.Fill(ds);
//这句话很重要,它会把你在DataSet增加的数据转化为SQL语句用来更新数据库
SqlCommandBuilder cmdBuilder = new SqlCommandBuilder(da);
//添加行,实例化一个行对象,注意是用NewRow来创建行
DataRow row = ds.Tables[0].NewRow();
row[0] = "zhang";
row[1] = "xioaming";
ds.Tables[0].Rows.Add(row);  //添加到表中
da.Update(ds);             //把DataSet中表和数据库进行对比,更新

} 
(2)修改数据
using (SqlConnection conn = new SqlConnection(""))
{
SqlDataAdapter da = new SqlDataAdapter("SQL语句或你自己定义的命令对象", conn);
DataSet ds = new DataSet();
da.Fill(ds);
SqlCommandBuilder cmdBuilder = new SqlCommandBuilder(da);
ds.Tables[0].Rows[12][1] = ""; //修改数据
da.Update(ds);
//调用Update方法其中隐式的调用了AcceptChanges方法,更新数据集中的数据
//如果你继续使用这个数据集而没有调用这个方法,在后面的使用会出现异常
ds.AcceptChanges();  //这句话可以不写的

} 
 (3)删除数据
using (SqlConnection conn = new SqlConnection(""))
{
SqlDataAdapter da = new SqlDataAdapter("SQL语句或你自己定义的命令对象", conn);
DataSet ds = new DataSet();
da.Fill(ds);
SqlCommandBuilder cmdBuilder = new SqlCommandBuilder(da);
//删除数据
ds.Tables[0].Rows[12].Delete();
da.Update(ds);  //这边会隐式调用DataTable的AcceptChanges方法
}
6.4、关于“SqlDataAdapter”中Fill方法
ds.Fill(ds,5,10,"MyTable"); 
7、DataSet、DataTable、DataRow、DataColumn

  表示数据存放在缓存中,DataSet里面可以包含多个DataTable,DataTable中有多个DataColumn和多个DataRow,包括对各种对DataTable的操作,以及对列和行的操作,在进行DataSet,DataTable进行操作的时候,应该先判断它们是否为Null。
小结:本节内容非常重要,一定熟练掌握。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 28
    评论
评论 28
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值