Excel 单元格值作为动态查询值
Excel cell values as dynamic query values
在我的 Excel sheet 中,我有一个按钮运行 SQL 查询和 returns 时钟交互结果。我有两个名为 StartDate
和 EndDate
的单元格,它们被格式化为输入单元格。我希望该语句查看 ActionDate 列,并且仅查看这些单元格范围内的 return 结果。
Private Sub CommandButton1_Click()
Dim cnn As New ADODB.Connection
Dim rst As New ADODB.Recordset
Dim ConnectionString As String
Dim StrQuery As String
Dim StartDate As Date
Dim EndDate As Date
StartDate = Sheets("Sheet1").Range("B5").Value
EndDate = Sheets("Sheet1").Range("B6").Value
cnn.Open ConnectionString
cnn.CommandTimeout = 900
StrQuery = "SELECT Employees.EmployeeID, Employees.First_Name,
Employees.Last_Name, EmployeeTimeCardActions.ActionTime,
EmployeeTimeCardActions.ActionDate, EmployeeTimeCardActions.ShiftStart,
EmployeeTimeCardActions.ActionType FROM Employees LEFT OUTER JOIN
EmployeeTimeCardActions ON
Employees.EmployeeID=EmployeeTimeCardActions.EmployeeID WHERE ActionDate
>StartDate AND ActionDate < EndDate ;"
rst.Open StrQuery, cnn****
Sheets(1).Range("D3").CopyFromRecordset rst
End Sub
我在 rst.Open StrQuery, cnn
上有一个语法错误,我用 **** 标记了。
更改您的查询字符串,以便您实际引用您的变量:
StrQuery = "SELECT Employees.EmployeeID, Employees.First_Name,
Employees.Last_Name, EmployeeTimeCardActions.ActionTime,
EmployeeTimeCardActions.ActionDate, EmployeeTimeCardActions.ShiftStart,
EmployeeTimeCardActions.ActionType FROM Employees LEFT OUTER JOIN
EmployeeTimeCardActions ON
Employees.EmployeeID=EmployeeTimeCardActions.EmployeeID WHERE ActionDate
> '" & StartDate & "' AND ActionDate < '" & EndDate & "';"
您可能还需要将日期包装在 '
或 #
中,具体取决于您查询的数据库。
顺便说一下,通常最好参数化您的查询字符串以避免 sql 注入的可能性;特别是因为您的输入机制是 Excel 范围。 Example
通过 ADO Command 对象简单地使用参数化,这避免了连接或标点数据的需要。具体来说,将 qmarks ?
放在准备好的 data-less SQL 语句中,然后将其与包含 StartDate 和 EndDate 的参数绑定 值。请注意,使用这种方法,记录集是从 Command.Execute
(而不是 Recordset.Open
)调用创建的。
Private Sub CommandButton1_Click()
Dim cnn As New ADODB.Connection
Dim rst As New ADODB.Recordset
Dim cmd As New ADODB.Command ' NEW VARIABLE
Dim ConnectionString As String, StrQuery As String
Dim StartDate As Date, EndDate As Date
StartDate = Sheets("Sheet1").Range("B5").Value
EndDate = Sheets("Sheet1").Range("B6").Value
cnn.Open ConnectionString
cnn.CommandTimeout = 900
StrQuery = "SELECT e.EmployeeID, e.First_Name, e.Last_Name, " _
& " t.ActionTime, t.ActionDate, t.ShiftStart, t.ActionType " _
& " FROM Employees e " _
& " LEFT OUTER JOIN EmployeeTimeCardActions t " _
& " ON e.EmployeeID = t.EmployeeID " _
& " WHERE ActionDate > ? AND ActionDate < ?;"
With cmd
.ActiveConnection = cnn
.CommandText = StrQuery
.CommandType = adCmdText
.Parameters.Append .CreateParameter("str_param", adDate, adParamInput, , StartDate)
.Parameters.Append .CreateParameter("end_param", adDate, adParamInput, , EndDate)
Set rst = .Execute ' CREATES RECORDSET
End With
Sheets(1).Range("D3").CopyFromRecordset rst
rst.Close: cnn.Close
Set rst = Nothing: Set cmd = Nothing: Set cnn = Nothing
End Sub
在我的 Excel sheet 中,我有一个按钮运行 SQL 查询和 returns 时钟交互结果。我有两个名为 StartDate
和 EndDate
的单元格,它们被格式化为输入单元格。我希望该语句查看 ActionDate 列,并且仅查看这些单元格范围内的 return 结果。
Private Sub CommandButton1_Click()
Dim cnn As New ADODB.Connection
Dim rst As New ADODB.Recordset
Dim ConnectionString As String
Dim StrQuery As String
Dim StartDate As Date
Dim EndDate As Date
StartDate = Sheets("Sheet1").Range("B5").Value
EndDate = Sheets("Sheet1").Range("B6").Value
cnn.Open ConnectionString
cnn.CommandTimeout = 900
StrQuery = "SELECT Employees.EmployeeID, Employees.First_Name,
Employees.Last_Name, EmployeeTimeCardActions.ActionTime,
EmployeeTimeCardActions.ActionDate, EmployeeTimeCardActions.ShiftStart,
EmployeeTimeCardActions.ActionType FROM Employees LEFT OUTER JOIN
EmployeeTimeCardActions ON
Employees.EmployeeID=EmployeeTimeCardActions.EmployeeID WHERE ActionDate
>StartDate AND ActionDate < EndDate ;"
rst.Open StrQuery, cnn****
Sheets(1).Range("D3").CopyFromRecordset rst
End Sub
我在 rst.Open StrQuery, cnn
上有一个语法错误,我用 **** 标记了。
更改您的查询字符串,以便您实际引用您的变量:
StrQuery = "SELECT Employees.EmployeeID, Employees.First_Name,
Employees.Last_Name, EmployeeTimeCardActions.ActionTime,
EmployeeTimeCardActions.ActionDate, EmployeeTimeCardActions.ShiftStart,
EmployeeTimeCardActions.ActionType FROM Employees LEFT OUTER JOIN
EmployeeTimeCardActions ON
Employees.EmployeeID=EmployeeTimeCardActions.EmployeeID WHERE ActionDate
> '" & StartDate & "' AND ActionDate < '" & EndDate & "';"
您可能还需要将日期包装在 '
或 #
中,具体取决于您查询的数据库。
顺便说一下,通常最好参数化您的查询字符串以避免 sql 注入的可能性;特别是因为您的输入机制是 Excel 范围。 Example
通过 ADO Command 对象简单地使用参数化,这避免了连接或标点数据的需要。具体来说,将 qmarks ?
放在准备好的 data-less SQL 语句中,然后将其与包含 StartDate 和 EndDate 的参数绑定 值。请注意,使用这种方法,记录集是从 Command.Execute
(而不是 Recordset.Open
)调用创建的。
Private Sub CommandButton1_Click()
Dim cnn As New ADODB.Connection
Dim rst As New ADODB.Recordset
Dim cmd As New ADODB.Command ' NEW VARIABLE
Dim ConnectionString As String, StrQuery As String
Dim StartDate As Date, EndDate As Date
StartDate = Sheets("Sheet1").Range("B5").Value
EndDate = Sheets("Sheet1").Range("B6").Value
cnn.Open ConnectionString
cnn.CommandTimeout = 900
StrQuery = "SELECT e.EmployeeID, e.First_Name, e.Last_Name, " _
& " t.ActionTime, t.ActionDate, t.ShiftStart, t.ActionType " _
& " FROM Employees e " _
& " LEFT OUTER JOIN EmployeeTimeCardActions t " _
& " ON e.EmployeeID = t.EmployeeID " _
& " WHERE ActionDate > ? AND ActionDate < ?;"
With cmd
.ActiveConnection = cnn
.CommandText = StrQuery
.CommandType = adCmdText
.Parameters.Append .CreateParameter("str_param", adDate, adParamInput, , StartDate)
.Parameters.Append .CreateParameter("end_param", adDate, adParamInput, , EndDate)
Set rst = .Execute ' CREATES RECORDSET
End With
Sheets(1).Range("D3").CopyFromRecordset rst
rst.Close: cnn.Close
Set rst = Nothing: Set cmd = Nothing: Set cnn = Nothing
End Sub