顯示具有 DataTable Using 標籤的文章。 顯示所有文章
顯示具有 DataTable Using 標籤的文章。 顯示所有文章

2017/10/09

[ADO.NET] VB.net 資料庫連線 IV

接續前一篇 [ADO.NET] VB.net 資料庫連線 III
系列文章最後一篇,說明如何使用參數方式來避免隱碼攻擊


If VbConn.State = ConnectionState.Closed Then
   VbConn.ConnectionString = VbConnectionString
   VbConn.Open()
   Dim VbCommand As System.Data.SqlClient.SqlCommand = VbConn.CreateCommand

   VbCommand.CommandText="SELECT * FROM Test WHERE test1=@p1"
   VbCommand.Parameters.AddWithValue("@p1" , "a123")


   Dim ExecuteReturn As Integer = VbCommand.ExecuteNonQuery
   VbCommand.Cancel()
   VbConn.Close()
End If

接著說明DataAdapter如何使用參數
Dim MyDataTable As New DataTable
Dim GetData As String=""
Using VbConn As SqlClient.SqlConnection = New SqlClient.SqlConnection(VbConnectionString)

   Using Adp As New System.Data.SqlClient.SqlDataAdapter("SELECT * FROM Test WHERE test1=@p1", VbConn)
     Adp.SelectCommand.Parameters.AddWithValue("@p1" , "A123")


     Adp.Fill(MyDataTable)
   End Using

End Using

For i = 0 To MyDataTable.Rows.Count - 1 Step 1
   GetData = MyDataTable.Rows(i).Item("欄位名稱")
Next


使用參數化查詢並沒有特別困難,但是要特別注意!!
以SELECT * FROM Test WHERE test1=@p1 這個範例來說,無論test1這個欄位是不是文字格式,都只要輸入test1=@p1就好,千萬不要輸入test1='@p1',會造成系統錯誤。

補充:
如果使用的是OdbcParameter 參數的使用會比較不同
範例:
If VbConn.State = ConnectionState.Closed Then
   VbConn.ConnectionString = VbConnectionString
   VbConn.Open()
   Dim VbCommand As System.Data.Odbc.OdbcCommand = VbConn.CreateCommand

   VbCommand.CommandText="SELECT * FROM Test WHERE test1=? AND test2=?"
   VbCommand.Parameters.Add("test1" ,OdbcType.VarChar).Value="A1234"
   VbCommand.Parameters.Add("test2" ,OdbcType.Int).Value="1234"


   Dim ExecuteReturn As Integer = VbCommand.ExecuteNonQuery
   VbCommand.Cancel()
   VbConn.Close()
End If
詳細說明請參考:https://msdn.microsoft.com/zh-tw/library/zxdcah9t(v=vs.110).aspx

2017/09/30

[ADO.NET] VB.net 資料庫連線 III

接續前一篇 [ADO.NET] VB.net 資料庫連線 II 。 這一次要說明如何從資料庫取得資料


Dim VbConnectionString As String = "資料庫連線字串設定方式請參考 "VB.NET 資料庫連線語法 I

首先是使用DataReader來取得資料,DataReader適合在取得的資料量不多的情形下使用
Using VbConn As SqlClient.SqlConnection = New SqlClient.SqlConnection(VbConnectionString)

   VbConn.Open()

   Using VbCommand As SqlClient.SqlCommand = VbConn.CreateCommand
     VbCommand.CommandText="SELECT * FROM Test"

     Using VbReader As SqlClient.SqlDataReader=VbCommand.ExecuteReader
         Dim GetData As String=""
         Do While VbReader.Read
             GetData= VbReader.Item("欄位名稱")
         Loop
       End Using
       'DataReader 一次只取得一行資料庫的資料,所以必須自行整理取得的資料。

     VbCommand.Cancel()
   End Using

End Using

再來是使用DataSet來取得資料,DataSet適合在取得的大量資料的情形下使用。
Dim MyDataSet As New DataSet
Dim GetData As String=""
Using VbConn As SqlClient.SqlConnection = New SqlClient.SqlConnection(VbConnectionString)

   Using Adp As New System.Data.SqlClient.SqlDataAdapter("SELECT * FROM Test", VbConn)
     Adp.Fill(MyDataSet)
   End Using

End Using

For i = 0 To MyDataSet.Tables(0).Rows.Count - 1 Step 1
   GetData = MyDataSet.Tables(0).Rows(i).Item("欄位名稱")
Next
'實際上就是系統自動使用DataReader把資料放入DataSet裡,取得資料後在使用DataSet來操作資料。

DataSet是由多個DataTable所組成的資料集合,所以也可以直接使用DataTable來取的資料
Dim MyDataTable As New DataTable
Dim GetData As String=""
Using VbConn As SqlClient.SqlConnection = New SqlClient.SqlConnection(VbConnectionString)

   Using Adp As New System.Data.SqlClient.SqlDataAdapter("SELECT * FROM Test", VbConn)
     Adp.Fill(MyDataTable)
   End Using

End Using

For i = 0 To MyDataTable.Rows.Count - 1 Step 1
   GetData = MyDataTable.Rows(i).Item("欄位名稱")
Next