最近使用开辟的过程中出现了一个小问题,顺便记载一下原因和方法--对象数据库
ADO.NET是.Net FrameWork SDK中用以操作数据库的类库的总称。它供给了一些核心的对象实现对数据库的操作,这些核心对象在前篇博客中已经大致引述了一下,该篇博客重要对重要对象停止说明。
Connection对象是数据库连接对象,重要负责对数据源的连接,全部Connection对象的基类都是DbConnection类。
Connection对象有两个重要的属性:
ConnectionString:存储打开数据库的字符串;
State:表示Connection的状态,有Closed和Open两种状态。
Connection对象有两个重要的方法:
Open方法:用于打开数据库;
Close方法:用于关闭数据库;
Using sqlCon As New SqlConnection("Server=longan-pc\mssqlserver2008;Database=Student;uid=sa;pwd=long") sqlCon.Open() Console.WriteLine(sqlCon.State.ToString) End Using
在使用Connection对象连接数据库时我们常在Using语句中定义该对象,在使用完该对象后即关闭和释放对象,减少内存占用。如果不使用Using语句的话应在使用完该对象后调用Close方法关闭数据库,并在随后使用Dispose方法释放对象。
连接到数据库可以用上面的方法:
(1)如果要连接的数据库服务器与开辟者的呆板在统一个局域网里,可以使用局域网IP地址或者局域网中的电脑主机名;
(2)如果要连接的数据库服务器与开辟者的呆板不在统一个局域网内,那么就要求数据库服务器必须有一个公网IP,我们可以使用公网IP来连接,如果数据库服务器还有互联网域名,那么用互联网域名也是可以的。
(3)如果要连接的数据库服务器与开辟者所使用的呆板是统一台呆板,那么可以使用以下几种方法之一:”(local)”或者”.”或者”127.0.0.1”。须要注意的是,如果在一台呆板上运行着统一种数据库的不同版本,比如说在”xxxxx”这台主机上同时运行着SQL 2000、SQL 2005和SQL Express三种版本,并且它们所使用的Windows服务名分别为”SQL2000”、”SQL2005”和”SQLExpress”,那么我们要连接到SQL 2000这个数据库上所使用的服务器名就应该填写”xxxxx\SQL2000”这种“主机名\实例名”的方法或者“主机IP\实例名”,这种情况在同时安装了Visual Studio 和SQL 的友人那里很常见,因为SQL Express是针对先生的功能有限的收费版本,这个版本的数据库在安装Visual Studio 时默认是一起安装的。
Command对象也称为数据库命令对象,Command对象重要执行对数据库停止增删改查操作的命令。用于执行存储过程时须要将Command对象的CommandType 属性设置为CommandType.StoredProcedure,默认情况下CommandType 属性为CommandType.Text,表示执行的是普通SQL语句。
Command对象经常使用属性:
Connection:定义连接对象,如果使用该对象须要与数据库的连接对象绑定否则不能对数据库停止操作;
Parameters:重要用于存储对数据库停止参数化查询时所需的参数;
CommandType:用于设置操作命令的类型;
CommandText:存储对数据库的操作命令语句。
Public Sub CreateCommand(ByVal queryString As String,ByVal connectionString As String) Using connection As New SqlConnection(connectionString) Dim command As New SqlCommand() command.Connection = connection command.CommandTimeout = 15 command.CommandType = CommandType.Text command.CommandText = queryString connection.Open() Dim reader As SqlDataReader = command.ExecuteReader() While reader.Read() Console.WriteLine(String.Format("{0}, {1}",reader(0), reader(1))) End While End Using End Sub
Command对象的重要方法:
ExecuteNonQuery():执行一个非查询情势的SQL语句,返回受影响的行数,重要用于执行对数据库的增加、更新、删除操作,查询的时候不能调用该方法。
Using sqlCon As New SqlConnection("Server=longan-pc\mssqlserver2008;Database=Student;uid=sa;pwd=long") sqlCon.Open() Console.WriteLine(sqlCon.State.ToString) Dim sqlCom As New SqlCommand Dim strSQL As String = "insert into Student_info values(12,'女','小张',78,86,98)" sqlCom.CommandText = strSQL sqlCom.Connection = sqlCon sqlCom.ExecuteNonQuery() End Using
ExecuteReader():执行一个查询语句,返回一个DataReader对象。
Using sqlCon As New SqlConnection("Server=longan-pc\mssqlserver2008;Database=Student;uid=sa;pwd=long") Dim Username As String = "张晨" Dim i As Integer Console.WriteLine(sqlCon.State.ToString) Dim sqlCom As New SqlCommand Dim strQry As String = "select * from tblOnWork where on_username=@username" sqlCom.Parameters.Add(New SqlParameter("@username", Username)) sqlCom.CommandText = strQry sqlCom.Connection = sqlCon sqlCon.Open() Dim sqlReader As SqlDataReader = sqlCom.ExecuteReader While (sqlReader.Read()) Console.WriteLine(sqlReader.GetString(i)) i = ++i End While End Using
ExecuteScalar ():从数据库检索单个值。该方法重要用于统计操作,针对SQL语句执行的结果是一行或一列的结果集,该方法只返回查询结果集的第一行第一列。
Using sqlCon As New SqlConnection("Server=longan-pc\mssqlserver2008;Database=Student;uid=sa;pwd=long") Console.WriteLine(sqlCon.State.ToString) Dim sqlCom As New SqlCommand Dim strQry As String = "select * from student_info" sqlCom.CommandText = strQry sqlCom.Connection = sqlCon sqlCon.Open() TextBox1.Text = sqlCom.ExecuteScalar(2) End Using
DataReader对象是一个读取行的只读流的方法,它只能对数据库停止读取不能停止变动。
DataReader在使用时不能直接停止实例化,必须借助与之相关的Command对象来创建实例,例如用SqlCommand的实例的ExecuteReader()方法可以创建SqlDataReader实例。因为DataReader对象读取数据时须要与数据库保持连接,所以在使用完DataReader对象读取完数据之后应该先调用它的Close()方法关闭,然后才能关闭与之相关Connection对象。
DataReader对象读取数据的三种方法:
一种是按查询的时候列的索引用指定的方法来读取列值,无需做响应转换,如GetString(int i)就是读取第i列的值并且转换成String类型的值。第这种方法的长处是指定列后直接将该列的直接读取出来了,无需再转换,缺陷是一旦指定的列不能按照指定的方法转换时就会抛出异常,比如数据库里字段的类型是Double类型或者该字段的值为空时按照GetString(i)这种方法读取会抛出异常。
第二种方法就是按照列索引的方法读取,在读取的时候并不停止值转换,如:reader[5]就是读取第5列的值(这里reader是一个Reader对象的实例),这样得到的值是一个object类型的值,这也很好懂得,因为在数据库可能存储各种类型的值,而object是全部类的基类,所以这个方法不会抛出异常。如果要得到它的正确类型,还须要根据数据库里的字段停止停止响应转换。
最后一种是按照列名的方法去读,并且在读的时候也不停止响应转换,得到的是object类型的值。
综合后面三种方法各有特点,第一种方法最直接,但是有可能抛出异常,第二种方法比第一种略微灵活一些,我们可以根据读取到值为空(在.net里用DBNull类来表示,可以表示数据库中恣意数据类型的空值),我们就不停止响应的类型转换,避免出现异常。第三种方法按照列的名字来读取数据,也须要按照第二种方法停止一定的转换。就性能来讲第一种最高,第二种稍低,第三种最低(这很好懂得,假设要在一个旅馆里找人直通过房间号找确定比通过名字找快),就灵活性来讲第三种最灵活,第二种次之,第一种最不灵活(假如在后来编写SQL语句中变动了列的索引,第一种和第二种都可能出现问题)。现实开辟中根据现实情况选择适合的方法。
使用 DataReader 检索数据的步骤:
1、创建 Command 对象
2、调用 ExecuteReader() 创建 DataReader 对象
3、使用 DataReader 的 Read() 方法逐行读取数据
4、读取某列的数据,(type)dataReader[ ]
5、关闭 DataReader 对象
Using sqlCon As New SqlConnection("Server=longan-pc\mssqlserver2008;Database=Student;uid=sa;pwd=long") Dim Username As String = "张晨" Dim i As Integer Console.WriteLine(sqlCon.State.ToString) Dim sqlCom As New SqlCommand Dim strQry As String = "select * from tblOnWork where on_username=@username" sqlCom.Parameters.Add(New SqlParameter("@username", Username)) sqlCom.CommandText = strQry sqlCom.Connection = sqlCon sqlCon.Open() Dim sqlReader As SqlDataReader = sqlCom.ExecuteReader While (sqlReader.Read()) Console.WriteLine(sqlReader.GetString(i)) i = ++i End While
End Using
Dataadapter对象也称为数据适配器对象,它重要是协调作用,在数据库和内存中的数据集间架设起了桥梁,将数据集中经过编辑后的数据送回数据源,或者使用数据库命令对象(Command)划定的操作从数据源中检索出数据送往数据集对象(DataSet)。
数据适配器将数据填入数据集时调用方法Fill(),语句如下:
'直接填充表 dataAdapter1.Fill (dataTable) 或者 '填充dataSet11数据集中的"Student"表 dataAdapter1.Fill (dataSet11, "Student")
当dataAdapter1调用Fill() 方法时将使用与之相关联的命令组件所指定的 SELECT 语句从数据源中检索行。然后将行中的数据添加到 DataSet 中的DataTable 对象中或者直接填充到DataTable的实例中,如果 DataTable 对象不存在,则主动创建该对象。 当执行上述SELECT语句时,与数据库的连接必须有效,但不须要用语句将连接对象打开。如果调用Fill()方法之前与数据库的连接已经关闭,则将主动打开它以检索数据,执行终了后再主动将其关闭。如果调用Fill()方法之前连接对象已经打开,则检索后继续保持打开状态。
注意:一个数据集中可以放置多张数据表。但是每一个数据适配器只能够对应于一张数据表。
DataAdapter经常使用属性:
SelectCommand :获取或设置一个 SQL 语句或存储过程,用于在数据源中选择记载;
InsertCommand :获取或设置一个 SQL 语句或存储过程,以在数据源中插入新记载;
UpdateCommand :获取或设置一个 SQL 语句或存储过程,用于更新数据源中的记载。
DataAdapter对象经常使用方法:
Fill:想Dataset中填充数据;
Update:将对数据集的操作反应到数据库中。
注意:DbDataAdapter 拥有四个用于从数据源检索数据和更新数据源中数据的属性: SelectCommand 属性返回数据源中的数据; InsertCommand、 UpdateCommand 和 DeleteCommand 属性用于管理数据源中的变动。 调用 DataAdapter 的 Fill 方法之前必须设置 SelectCommand 属性。 在调用 DataAdapter 的 Update 方法之前必须设置 InsertCommand、UpdateCommand 或 DeleteCommand 属性,具体取决于对 DataTable 中的数据做了哪些变动。 例如,如果已添加行,在调用 Update 之前必须设置 InsertCommand。 当 Update 正在处置已插入、已更新或已删除的行时,DataAdapter 将使用响应的 Command 属性来处置该操作。 有关已修改行的当前信息将通过 Parameters 集合传递到 Command 对象。
Public Function CreateSqlDataAdapter(ByVal connection As SqlConnection) As SqlDataAdapter Dim adapter As SqlDataAdapter = New SqlDataAdapter adapter.MissingSchemaAction = MissingSchemaAction.AddWithKey ' 创建执行命令语句 adapter.SelectCommand = New SqlCommand( "SELECT CustomerID, CompanyName FROM CUSTOMERS", connection) adapter.InsertCommand = New SqlCommand( "INSERT INTO Customers (CustomerID, CompanyName) " & _ "VALUES (@CustomerID, @CompanyName)", connection) adapter.UpdateCommand = New SqlCommand( "UPDATE Customers SET CustomerID = @CustomerID, CompanyName = " & _ "@CompanyName WHERE CustomerID = @oldCustomerID", connection) adapter.DeleteCommand = New SqlCommand( "DELETE FROM Customers WHERE CustomerID = @CustomerID", connection) '增加属性 adapter.InsertCommand.Parameters.Add("@CustomerID", _ SqlDbType.Char, 5, "CustomerID") adapter.InsertCommand.Parameters.Add("@CompanyName", _ SqlDbType.VarChar, 40, "CompanyName") adapter.UpdateCommand.Parameters.Add("@CustomerID", _ SqlDbType.Char, 5, "CustomerID") adapter.UpdateCommand.Parameters.Add("@CompanyName", _ SqlDbType.VarChar, 40, "CompanyName") adapter.UpdateCommand.Parameters.Add("@oldCustomerID", _ SqlDbType.Char, 5, "CustomerID").SourceVersion = _ DataRowVersion.Original adapter.DeleteCommand.Parameters.Add("@CustomerID", _ SqlDbType.Char, 5, "CustomerID").SourceVersion = _ DataRowVersion.Original Return adapter End Function
DataSet对象也称为数据集对象,DataSet对象用于表示那些储存在内存中的数据,它相当于一个内存中的数据库。它可以包括多个DataTable对象及DataView对象。DataSet重要用于管理存储在内存中的数据以及对数据的断开操作。 由于DataSet对象供给了一个离线的数据源,这样减轻了数据库以及网络的负担,在计划程序的时候可以将DataSet对象作为程序的数据源。
Using sqlCon As New SqlConnection("Server=longan-pc\mssqlserver2008;Database=Student;uid=sa;pwd=long") Console.WriteLine(sqlCon.State.ToString) Dim sqlCom As New SqlCommand Dim strQry As String = "select * from student_info" sqlCom.CommandText = strQry sqlCom.Connection = sqlCon sqlCon.Open() Dim sqlAdapater As New SqlDataAdapter sqlAdapater.SelectCommand = sqlCom Dim da As New DataSet sqlAdapater.Fill(da, "student_info") Dim scb As SqlCommandBuilder = New SqlCommandBuilder(sqlAdapater) Dim dr As DataRow = da.Tables("student_info").NewRow dr(0) = 100 dr(1) = "张冉" dr(2) = "女" dr(3) = Format(Now, "short date") da.Tables("student_info").Rows.Add(dr) sqlAdapater.Update(da, "student_info") End Using
文章结束给大家分享下程序员的一些笑话语录: 这年头的互联网真是娱乐了中国,网民们从各种各样的“门”里钻来钻去,又有好多“哥”好多“帝”,值得大家品味不已……网络经典语录,关于IT与互联网,经典与您分享!