当前位置:首页 > 数据库访问方法
性。若要控制对数据库的访问,一种较为安全的方法是使用 Windows 集成安全性,此时连接字符串可以修改为:
conn.ConnectionString =
\ Initial catalog=Northwind; Integrated Security=SSPI\
// 服务器名 // 数据库名
// 采用 Windows 集成安全性
表6.13列出了Connection对象的常用方法。
表6.13 Connection对象的常用方法
方 法 Open() Close() ChangeDatabase() CreateCommand() Dispose() 说 明 打开与数据库的连接。注意ConnectionString属性只对连接属性进行了设置,并不打开与数据库的连接,必须使用Open()方法打开连接 关闭数据库连接 在打开连接的状态下,更改当前数据库 创建并返回与Connection对象有关的Command对象 调用Close()方法关闭与数据库的连接,并释放所占用的系统资源 请注意,在完成连接后,及时关闭连接是必要的,因为大多数据源只支持有限数目的连接,何况打开的连接占用宝贵的系统资源。
(2)Command。
Command是对数据源操作命令的封装。对于数据库来说,这些命令既可以是内联的SQL语句,也可以是数据库的存储过程。由Command生成的对象建立在连接的基础上,对连接的数据源指定相应的操作。所有Command对象的基类均为DbCommand类。
每个NET Framework数据提供程序包括一个Command对象:OLEDB.NET Framework数据提供程序包括一个OleDbCommand对象;SQL Server .NET Framework数据提供程序包括一个SqlCommand对象;ODBC.NET Framework数据提供程序包括一个OdbcCommand对象;Oracle .NET Framework数据提供程序包括一个OracleCommand对象。
以下代码示例演示如何创建SqlCommand对象,以便从SQL Server中的Northwind示例数据库返回数据列表。
string sql = \SqlCommand command1 = new SqlCommand(sql, sqlConnection1);
参数sql为需执行的SQL命令,上述语句将生成一个命令对象command1,对由sqlConnection1连接的数据源指定检索(SELECT)操作。这两个参数在创建Command对象时也可以省略不写,而在创建了Command对象后,再通过设置Command对象的CommandText和CommandType属性来指定。
Command对象的主要属性和方法分别列于表6.14和表6.15中。
表6.14 Command对象的常用属性
属 性 CommandText 说 明 取得或设置要对数据源执行的SQL命令、存储过程或数据表名 ·216·
CommandTimeout 获取或设置Command对象的超时时间,单位为秒,为0表示不限制。默认为30秒,即若在这个时间之内Command对象无法执行SQL命令,则返回失败 获取或设置命令类别,可取的值:StoredProcedure,TableDirect,Text,代表的含义分别为:存储过CommandType 程、数据表名和SQL语句,默认为Text。数字、属性的值为CommandType.StoredProcedure、CommandType.Text等 Connection Parameters 获取或设置Command对象所使用的数据连接属性 SQL命令参数集合 表6.15 Command对象的常用方法
方 法 Cancel() CreateParameter ExecuteNonQuery() ExecuteReader() ExecuteScalar() ExecuteXmlReader() 取消Comand对象的执行 创建Parameter对象 执行CommandText属性指定的内容,返回数据表被影响行数。只有Update、Insert和Delete命令会影响的行数。该方法用于执行对数据库的更新操作 执行CommandText属性指定的内容,返回DataReader对象 执行CommandText属性指定的内容,返回结果表第一行第一列的值。该方法只能执行Select命令 执行CommandText属性指定的内容,返回XmlReader对象。只有SQL Server才能用此方法 说 明 Command对象的CommandType属性用于设置命令的类别:可以是存储过程、表名或SQL语句。当将该属性值设为CommandType.TableDirect时,要求CommandText的值必须是表名而不能是SQL语句。例如:
OleDbCommand cmd = new OleDbCommand(); cmd.CommandText = \
cmd.CommandType = CommandType.TableDirect; cmd.Connection = conn;
这段代码执行以后,将返回students表中的所有记录。它等价于以下代码:
OleDbCommand cmd = new OleDbCommand(); cmd.CommandText = \cmd.CommandType = CommandType.Text; cmd.Connection = conn;
可见,要实现同样功能,可选的方法有多种。
Command对象提供了4个执行SQL命令的方法:ExecuteNonQuery()、ExecuteReader()、ExecuteScalar()和ExecuteXmlReader(),要注意每个方法的特点。常用的是ExecuteNonQuery()和ExecuteReader()方法,它们分别用于数据库的更新和查询操作。注意ExecuteNonQuery()不返回结果集而仅仅返回受影响的行数,ExecuteReader()返回DataReader对象,下面介绍如何通过DataReader对象访问数据库。
(3)DataReader
使用DataReader可以实现对特定数据源中的数据进行高速、只读、只向前的数据访问。与数据集(DataSet)不同,DataReader是一个依赖于连接的对象。就是说,它只能在与
·217·
数据源保持连接的状态下工作。所有DataReader对象的基类均为DbDataReader类。 同Command类似,每个NET Framework数据提供程序包括一个DataReader对象:OLEDB .NET Framework数据提供程序包括一个OleDbDataReader对象;SQL Server .NET Framework数据提供程序包括一个SqlDataReader对象;ODBC .NET Framework数据提供程序包括一个OdbcDataReader对象;Oracle.NET Framework数据提供程序包括一个OracleDataReader对象。
使用DataReader检索数据首先必须创建Command对象的实例,然后通过调用Command的ExecuteReader方法创建一个DataReader,以便从数据源检索行。
以下示例说明如何使用SqlDataReader,其中command代表有效的SqlCommand对象。
SqlDataReader reader = command.ExecuteReader();
在创建了DataReader对象后,就可以使用 Read 方法从查询结果中获取行。通过传递列的名称或序号引用,可以访问返回行的每一列。为了实现最佳性能,DataReader也提供了一系列方法,使得能够访问其本机数据类型(GetDateTime、GetDouble、GetGuid、GetInt32 等)的列值。
以下代码示例循环访问一个 DataReader 对象,并从每个行中返回两个列。
if (reader.HasRows) while (reader.Read()) else
Console.WriteLine(\reader.Close();
//判断是否有结果返回 //依次读取行
Console.WriteLine(\
每次使用完DataReader对象后都应调用Close方法显式关闭。 DataReader对象的常用属性和方法分别列于表6.16和表6.17中。
表6.16 DataReader对象的常用属性
属 性 FieldCount IsClosed Item({name,col}) 获取DataReader对象包含的记录行数 获取DataReader对象的状态,为True表示关闭 获取或设置表字段值,name为字段名,col为列序号,序号从0开始。例如:objReader.Item(0)、objReader.Item(\获取在执行Insert、Update或Delete命令后受影响的行数。该属性只有在读取完所有行且DataReader对象关闭后才会被指定 说 明 ReacordsAffected 表6.17 DataReader对象的常用方法
方 法 Close() GetBoolean(Col) GetDataTypeName(Col) 关闭DataReader对象 获取序号为Col的列的值,所获取列的数据类型必须为Boolean类型;其他类似的方法还有:GetByte、GetChar、GetDateTime、GetDecimal、GetDouble、GetFloat、GetInt16、GetInt32、GetInt64、GetString等 获取序号为Col的列的来源数据类型名 说 明 ·218·
GetFieldType(Col) GetName(Col) GetOrdinal(Name) GetValue(Col) GetValues(values) IsDBNull(Col) Read() 获取序号为Col的列数据类型 获取序号为Col的列的字段名 获取字段名为Name的列的序号 获取序号为Col的列的值 获取所有字段的值,并将字段值存放在values数组中 若序号为Col的列为空值,则返回True,否则返回False 读取下一条记录,返回布尔值。返回True表示有下一条记录,返回False表示没有下一条记录
(4)DataAdapter
数据适配器(DataAdapter)利用连接对象(Connection)连接数据源,使用命令对象(Command)规定的操作从数据源中检索出数据送往数据集,或者将数据集中经过编辑后的数据送回数据源。所有DataAdapter对象的基类均为DbDataAdapter类。
如果所连接的是SQL Server数据库,则可以通过将SqlDataAdapter与关联的SqlCommand和SqlConnection对象一起使用,从而提高总体性能。对于支持OLEDB的数据源,可以使用OleDbDataAdapter及其关联的OleDbCommand和OleDbConnection对象。对于支持ODBC的数据源,使用OdbcataAdapter及其关联的OdbcCommand和OdbcConnection对象。对于Oracle数据库,使用OracleDataAdapter及其关联的OracleCommand和OracleConnection对象。
定义DataAdapter对象有4种语法格式:
OleDbDataAdapter 对象名 = new OleDbDataAdapter();
OleDbDataAdapter 对象名 = new OleDbDataAdapter(OleDbCommand对象);
OleDbDataAdapter 对象名 = new OleDbDataAdapter (SQL命令,OleDbConnection对象); OleDbDataAdapter 对象名 = new OleDbDataAdapter (SQL命令,OleDbConnection对象)
创建SqlDataAdapter对象语法格式与之类似,只要将所有的“OleDb”改为“Sql”即可。创建DataAdapter对象的这几种格式,读者可根据需要自行选择使用。
DataAdapter有一个重要的Fill方法,此方法将数据填入数据集,语句如下:
dataAdapter1.Fill (dataSet1, \
其中,dataAdapter1代表数据适配器名;dataSet1代表数据集名;Products代表数据表名。当dataAdapter1调用Fill()方法时将使用与之相关联的命令组件所指定的SELECT语句从数据源中检索行。然后将行中的数据添加到DataSet中的DataTable对象中,如果DataTable对象不存在,则自动创建该对象。
当执行上述SELECT语句时,与数据库的连接必须有效,但不需要用语句将连接对象打开。如果调用Fill()方法之前与数据库的连接已经关闭,则将自动打开它以检索数据,执行完毕后再自动将其关闭。如果调用Fill()方法之前连接对象已经打开,则检索后继续保持打开状态。
DataAdapter还有另一个重要的Update方法,当新增、修改或删除DataSet中的记录时,并需要更改数据源时,就要使用Update()方法。
注意:
·219·
共分享92篇相关文档