0

我有一个用户表单,允许用户选择开始和停止日期(分别使用 DateTimePicker 对象dtStartdtEnd)。然后将这些日期用作针对数据库的 sql 查询中的条件。

当我最初编写程序时,我在我的应用程序中硬编码了 SQL 查询,它运行良好。下面的简化示例:

Private Sub RunSQL_Click(sender As Object, e As EventArgs) Handles RunSQL.Click

    Dim mySQLString As String

    'Create SQL Query String
    mySQLString = "Select * " & vbLf &
                  " From " & vbLf &
                  "  some.table " & vbLf &
                  " Where a.start_dttm > (' & dtStart.Text & ' - INTERVAL '1' DAY) and a.end_dttm <= ' & dtEnd.Text & '"

   'Run SQL against database
   ...

End Sub

但是,鉴于真正的 SQL 语句非常复杂,我想改为调用My.Resources包含 SQL 语句的文件,以便在我想对提取进行更改时更容易更新它。因此,在上面的示例中,我会将 SQL 语句的写出更改为mySQLString = My.Resources.Extract. 我的问题是如何传递My.Resources.Extract用户输入的开始日期和结束日期。

如果我的资源文件包含对dtStart.Text并且dtEnd.Text这些显然只是被视为文本的引用,因此运行 SQL 将失败。

有没有办法将值传递到资源文件中,或者告诉 vb.netdtStart.Text在我的提取文件中不是文本,而是对 DateTimePicker 值的引用。

提前感谢您的建议。

4

1 回答 1

1

因此,对于任何根据“Pro Grammer”的评论感兴趣的人,我有 2 个解决方案:

1)查找和替换相关字符串:

mySQLString = My.Resources.Extract.Replace("dtStart.Text", dtStart.Text).Replace("dtEnd.Text", dtEnd.Text)

2)使用参数化SQL:

资源文件中的我的 SQL 已更改为如下所示

Select *
From
 some.table
Where a.start_dttm > (@startdate - INTERVAL 1 DAY) and a.end_dttm <= @enddate

然后在代码中设置@startdateand@enddate参数,如下所示:

Dim mySQLCommnad as IngresCommand 
'NB I am using Ingres, but this will need to relate to whichever database flavor you are using.

mySQLCommand = myVector.myIngresConnection.CreateCommand()
mySQLCommand.CommandText = My.Resources.Extract
mySQLCommand.Parameters.Add("@startdate", SqlDbType.Date).Value = dtStart.Text
mySQLCommand.Parameters.Add("@enddate", SqlDbType.Date).Value = dtEnd.Text

'RunSQL
...
于 2016-12-07T18:19:46.610 回答