数据库说的普通一点就是一个里面存储数据的仓库,而我们对数据库的操作完全可以向平时我们往仓库中存放或取出东西一样。
如果我们需要从一个仓库中存取东西,首先要知道仓库在哪儿,仓库的钥匙,等,这样我们才有可能达到我们想要的目的。
所以,连接数据库,首先我们就需要sqlconnection(数据库连接,配置连接字符串等,用户名密码之类的,就相当于知道仓库的位置钥匙或其他)。
Dim connStr as string ="server=.;database=datatable;uid=sa;pwd=123"
Dim as conn SqlConnection = new SqlConnection(connStr);
conn.Open();
仓库打开了,但是我们需要有一个命令指引我们,告诉我们我们需要做什么,是往仓库中存储,还是从仓库中取出,只有命令,并且执行了这些命令,仓库对于我们才有意义。
同理,在数据库中,命令就相当于sql语句,要执行命令,于是就有了sqlcommand, 直接翻译成sql命令。每个sqlcommand都有commandtext跟parameters 文本跟参数。填写好这个命令,然后execute去执行。当然,要确保连接是open的才能执行。没连接啥都干不了。
接下来就是对仓库的操作,比如我们要再仓库中储存或改变仓库的东西。
这里一般我们都是用SQL语句传参,执行sql即可:
Dim cmd As SqlCommand = New SqlCommand(sql, conn)
cmd.ExecuteNonQuery()
注:此处是执行才操作影响的条数,也就是我们在SQL server中执行时出现的“(*行受影响)”也是鉴别是否执行成功的一个标志。
当然,如果我们要把仓库的东西取出来,有好多种取法,比如,一件一件取:
datareader:.可以一条一条的读取(read)直到最后一条。使用DataReader检索数据包括创建Command对象的实例,然后通过调用Command.ExecuteReader创建一个DataReader,以便从数据源检索行。
以下代码实例循环访问一个DataReader对象,并从每个航中返回两个列。
Private Sub HasRows(ByVal connection As SqlConnection)
Using connection
Dim command As SqlCommand = New SqlCommand( _
"SELECT CategoryID, CategoryName FROM Categories;", _
connection)
connection.Open()
Dim reader As SqlDataReader = command.ExecuteReader()
If reader.HasRows Then
Do While reader.Read()
Console.WriteLine(reader.GetInt32(0) _
& vbTab & reader.GetString(1))
Loop
Else
Console.WriteLine("No rows found.")
End If
reader.Close()
End Using
End Sub
使用NextReasult检索多个结果集
Private Sub RetrieveMultipleResults(ByVal connection As SqlConnection)
Using connection
Dim command As SqlCommand = New SqlCommand( _
"SELECT CategoryID, CategoryName FROM Categories;" & _
"SELECT EmployeeID, LastName FROM Employees", connection)
connection.Open()
Dim reader As SqlDataReader = command.ExecuteReader()
Do While reader.HasRows
Console.WriteLine(vbTab & reader.GetName(0) _
& vbTab & reader.GetName(1))
Do While reader.Read()
Console.WriteLine(vbTab & reader.GetInt32(0) _
& vbTab & reader.GetString(1))
Loop
reader.NextResult()
Loop
End Using
End Sub
DataReader的优点:DataReader 提供未缓冲的数据流,该数据流使过程逻辑可以有效地按顺序处理从数据源中返回的结果。 由于数据不在内存中缓存,所以在检索大量数据时,DataReader 是一种适合的选择。
关闭Datareader需要注意的
每次使用完 DataReader 对象后都应调用 Close 方法。
如果 Command 包含输出参数或返回值,那么在 DataReader 关闭之前,将无法访问这些输出参数或返回值。
请注意,当 DataReader 打开时,该 DataReader 将以独占方式使用 Connection。 在原始 DataReader 关闭之前,将无法对 Connection 执行任何命令(包括创建另一个 DataReader)。
当然,一件一件去最大的弊端就是这个门关不了,比如我们需要执行别的操作,可能就很难办到,于是,我们必须让仓库发挥最大作用,我们可以把需要的东西都存放起来,然后就该干嘛干嘛!
Dataset:基本上能存放各种数据跟关系,比datareader方便的多,里面有一个一个的dataview跟datatable.针对你的查询结果,当然,datatable又可以从datarow一个一个的循环取得。
当然,dataset是方便了,但是把它从数据库拿出来,然后在读取,效率上就无法比得过直接读取,各有利弊。
但是,不管是一件一件的取,还是把它放在一起取出都特别麻烦,怎么办呢,对,集成!
SqlDataAdapter:(翻译为SQL数据适配器,适配器模式) 它来封装简化了上述步骤。你只要new出来一个sqldataadapter,给他填上语句,直接fill到dataset就行了。这样你什么都有了,只需要两步!
SqlDataAdapter 是 DataSet 和 SQL Server 之间的桥接器,用于检索和保存数据。SqlDataAdapter 通过对数据源使用适当的 Transact-SQL 语句映射 Fill(它可更改 DataSet 中的数据以匹配数据源中的数据)和 Update(它可更改数据源中的数据以匹配 DataSet 中的数据)来提供这一桥接。
当 SqlDataAdapter填充 DataSet 时,它为返回的数据创建必需的表和列(如果这些表和列尚不存在)。但是,除非 MissingSchemaAction 属性设置为 AddWithKey,否则这个隐式创建的架构中不包括主键信息。也可以使用 FillSchema,让 SqlDataAdapter 创建 DataSet 的架构,并在用数据填充它之前就将主键信息包括进去。有关更多信息,请参见向 DataSet 添加现有约束。
SqlDataAdapter 与SqlConnection 和 SqlCommand 一起使用,以便在连接到 SQL Server 数据库时提高性能。
SqlDataAdapter还包括SelectCommand、InsertCommand、DeleteCommand、UpdateCommand 和 TableMappings 属性,以便于数据的加载和更新。
Public Function SelectRows( _
ByVal dataSet As DataSet, ByVal connectionString As String, _
ByVal queryString As String) As DataSet
Using connection As New SqlConnection(connectionString)
Dim adapter As New SqlDataAdapter()
adapter.SelectCommand = New SqlCommand( _
queryString, connection)
adapter.Fill(dataSet)
Return dataSet
End Using
End Function
最后,但是也是很重要的一步,就是关闭数据库.
Close(conn)
Close(cmd)
Close(dap)
大概对数据库的操作就是这样,写的比较简单,主要是对自己不太熟悉的 DataReader和 SqlDataAdapter的一个小小的总结吧,写的比较简略,主要代码时参考的CSDM,在找资料的过程中发现CSDM真是强大,总结的东西让自己都感到自卑,的确是个强大的巨人,一下是主要参考的资料: