資料庫說的普通一點就是一個裡面儲存資料的倉庫,而我們對資料庫的操作完全可以向平時我們往倉庫中存放或取出東西一樣。
如果我們需要從一個倉庫中存取東西,首先要知道倉庫在哪兒,倉庫的鑰匙,等,這樣我們才有可能達到我們想要的目的。
所以,串連資料庫,首先我們就需要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 Ifreader.Close() End UsingEnd 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)) Loopreader.NextResult() Loop End UsingEnd 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 DataSetUsing connection As New SqlConnection(connectionString) Dim adapter As New SqlDataAdapter() adapter.SelectCommand = New SqlCommand( _ queryString, connection) adapter.Fill(dataSet) Return dataSet End UsingEnd Function
最後,但是也是很重要的一步,就是關閉資料庫.
Close(conn) Close(cmd) Close(dap)
大概對資料庫的操作就是這樣,寫的比較簡單,主要是對自己不太熟悉的DataReader和SqlDataAdapter的一個小小的總結吧,寫的比較簡略,主要代碼時參考的CSDM,在找資料的過程中發現CSDM真是強大,總結的東西讓自己都感到自卑,的確是個強大的巨人,一下是主要參考的資料:
DataReader
DataSet
SqlDataAdapter