VBA中用ADO訪問SQL SERVER資料庫:資料查詢
阿新 • • 發佈:2019-01-11
本程式的作用是:使用資料物件ADO訪問SQL資料庫,從而進行資料查詢,並將查詢的資料返回到EXCEL中,由於此程式需用到SQL資料庫,所以只供大家參考,不便執行,但大家可以看出其精華!
Private Sub CommandButton1_Click()
Dim cn As New ADODB.Connection
Dim rst As New ADODB.Recordset
Dim R, C, F, I As Integer
Dim Sql_text, day1, linenumber, box As String
Const cnnstr = "Provider = SQLOLEDB;" & _
"Data Source = apsgszml04;" & _
"Initial Catalog = bhl2ken;User ID =sa;Password =;"
‘連線資料庫
day1 = UserForm1.TextBox1.Text
linenumber = UserForm1.ComboBox1.Text
box = UserForm1.ComboBox2.Text
cn.Open cnnstr
Sql_text = Sql_text & "SELECT CONVERT(Char,dbo.TRY123.[day],101) as date1,"
Sql_text = Sql_text & " dbo.TRY123.linenumber,dbo.TRY123.box_no,dbo.TRY123.serialnumber,dbo.TRY123.lotnumber"
Sql_text = Sql_text & " FROM dbo.TRY123"
Sql_text = Sql_text & " WHERE (CONVERT(Char,dbo.TRY123.[day],101)= '" & day1 & "' and dbo.TRY123.linenumber= '" & linenumber & "' and dbo.TRY123.box_no= '" & box & "')"
Sql_text = Sql_text & " ORDER BY dbo.TRY123.serialnumber "
‘使用SQL資料庫查詢語言查詢
'SELECT CONVERT(Char,dbo.TRY123.[day],101) as date1,dbo.TRY123.linenumber,dbo.TRY123.box_no,dbo.TRY123.serialnumber,dbo.TRY123.lotnumber
'
'FROM dbo.TRY123
'WHERE (CONVERT(Char,dbo.TRY123.[day],101)= " & day1 & " and dbo.TRY123.linenumber= " & linenumber & " and dbo.TRY123.box_no= '" & box & "'
'ORDER BY dbo.TRY123.serialnumber
rst.Open Sql_text, cn, adOpenStatic, adLockBatchOptimistic '用adOpenStatic + adLockBatchOptimistic開啟較快,且佔用資源小
R = 5 'Excel表的行序號
C = 3 'Excel表的列序號
I = 0 'SQL表的欄位序號
F = rst.Fields.Count - 1
Worksheets("sheet1").Unprotect
Worksheets("sheet1").Cells.ClearContents
While Not rst.EOF
For I = 0 To F
Sheet1.Cells(R, I + 3).Rows.Value = rst.Fields(I).Value
Next I
R = R + 1
rst.MoveNext ’將資料庫的資料返回到EXCEL表中
Wend
Worksheets("sheet1").Protect
UserForm1.Hide
'MsgBox ("讀取完畢")
rst.Close '完成後要關閉
cn.Close '完成後要關閉
'注意:以上為直接連線SQL Server 的方法,不用建ODBC資料來源
Worksheets("sheet1").Activate
End Sub
Private Sub CommandButton1_Click()
Dim cn As New ADODB.Connection
Dim rst As New ADODB.Recordset
Dim R, C, F, I As Integer
Dim Sql_text, day1, linenumber, box As String
Const cnnstr = "Provider = SQLOLEDB;" & _
"Data Source = apsgszml04;" & _
"Initial Catalog = bhl2ken;User ID =sa;Password =;"
‘連線資料庫
day1 = UserForm1.TextBox1.Text
linenumber = UserForm1.ComboBox1.Text
box = UserForm1.ComboBox2.Text
cn.Open cnnstr
Sql_text = Sql_text & "SELECT CONVERT(Char,dbo.TRY123.[day],101) as date1,"
Sql_text = Sql_text & " dbo.TRY123.linenumber,dbo.TRY123.box_no,dbo.TRY123.serialnumber,dbo.TRY123.lotnumber"
Sql_text = Sql_text & " FROM dbo.TRY123"
Sql_text = Sql_text & " WHERE (CONVERT(Char,dbo.TRY123.[day],101)= '" & day1 & "' and dbo.TRY123.linenumber= '" & linenumber & "' and dbo.TRY123.box_no= '" & box & "')"
Sql_text = Sql_text & " ORDER BY dbo.TRY123.serialnumber "
‘使用SQL資料庫查詢語言查詢
'SELECT CONVERT(Char,dbo.TRY123.[day],101) as date1,dbo.TRY123.linenumber,dbo.TRY123.box_no,dbo.TRY123.serialnumber,dbo.TRY123.lotnumber
'
'FROM dbo.TRY123
'WHERE (CONVERT(Char,dbo.TRY123.[day],101)= " & day1 & " and dbo.TRY123.linenumber= " & linenumber & " and dbo.TRY123.box_no= '" & box & "'
'ORDER BY dbo.TRY123.serialnumber
rst.Open Sql_text, cn, adOpenStatic, adLockBatchOptimistic '用adOpenStatic + adLockBatchOptimistic開啟較快,且佔用資源小
R = 5 'Excel表的行序號
C = 3 'Excel表的列序號
I = 0 'SQL表的欄位序號
F = rst.Fields.Count - 1
Worksheets("sheet1").Unprotect
Worksheets("sheet1").Cells.ClearContents
While Not rst.EOF
For I = 0 To F
Sheet1.Cells(R, I + 3).Rows.Value = rst.Fields(I).Value
Next I
R = R + 1
rst.MoveNext ’將資料庫的資料返回到EXCEL表中
Wend
Worksheets("sheet1").Protect
UserForm1.Hide
'MsgBox ("讀取完畢")
rst.Close '完成後要關閉
cn.Close '完成後要關閉
'注意:以上為直接連線SQL Server 的方法,不用建ODBC資料來源
Worksheets("sheet1").Activate
End Sub