【问题标题】:Use a Value from a textbox in Access to a stored procedure in sql server使用 Access 中文本框中的值访问 sql server 中的存储过程
【发布时间】:2020-06-24 23:12:01
【问题描述】:

我希望有人能帮我解决这个问题。

我使用 Access 作为前端系统,使用 ODBC 将表链接到 SQL Server Management Studio。 这使数据库运行缓慢,因此我尝试将 Access 查询转换为 SSMS 中的存储过程,然后在 Access 中将它们作为传递查询运行。到目前为止效果很好,而且我转换的查询运行得非常快。

但是,我只转换了不需要用户在 Access 中选择变量的查询。这些是我现在遇到的困难。

例如,假设我在 SSMS 中有一个名为 [Names] 的简单表,其中包含 [First Name]、[Surname]

我可以运行以下名为 [Search] 的存储过程来返回所有名称:

SELECT [First name], [Surname]
FROM [Names]

我可以在前端Access中执行这个存储过程作为直通查询,它确实返回了所有记录。

但是,在前端 Access 数据库中,我有一个名为 [Search] 的表单,其中包含一个名为“SearchFirstName”的文本框。当用户在文本框中手动输入“Anthony”时,我希望它从文本框中获取值,并将其用作存储过程的一部分来限制结果,如下所示:

SELECT [First name], [Surname]
FROM [Names]
WHERE [First Name] = [Forms]![Search]![SearchFirstName]

我已经寻求帮助,但我陷入困境。我想我需要 Access 将文本框值设置为参数,然后可以在 SSMS 中使用。

我从另一篇文章中找到的可能可行的途径如下,但我不确定我需要如何/在哪里实现它:

With CurrentDb.QueryDefs("qPass") .SQL = "exec SalesGeneralSearch " & strSearch Set Me.MyListBox.RowSource = .OpenRecordset End If

如果有人能帮忙,我将不胜感激

谢谢

【问题讨论】:

  • 您是否考虑过使用 ADODB.Recordsets 来执行您的 SP?
  • 感谢您的回复。如果您能提供更多指导,是否有可能,这样我就可以通过谷歌搜索其余部分?谢谢
  • 我添加了一个示例,说明从 MS Access VBA 访问 SQL SP 时的操作。我有一个与你非常相似的设置,一个 Access 前端和一个 SQL Server 后端。这对我来说是一种可靠的方法。

标签: sql-server ms-access pass-through


【解决方案1】:

这就是我在 MS Access (VBA) 中执行 SQL 存储过程的方式:

'ADODB connection (to SQL Server).
Dim cnn As ADODB.Connection
Set cnn = New ADODB.Connection
With cnn
    .ConnectionString = {your ODBC connection to SQL Server}
    .CommandTimeout = 30 '<-- optional, but speeds up connection problems.
    .Open
End With

'ADODB command (reference to SQL stored procedure)
Dim cmd As ADODB.Command
Set cmd = New ADODB.Command
With cmd
    .ActiveConnection = cnn
    .CommandText = {your_stored_procedure_name}
    .CommandType = adCmdStoredProc
    .CommandTimeout = 0
    .Parameters.Refresh
End With

'Add your SP parameter(s)...
cmd.Parameters("@param_name").value = {your_value}

'ADODB recordset to capture your SP results.
Dim rs As ADODB.Recordset
Set rs = New ADODB.Recordset
With RetVal
    .CursorLocation = adUseClient
    .CursorType = adOpenForwardOnly
    .CacheSize = 1
    .LockType = adLockReadOnly
    .Open cmd
End With

'Loop through the resultset...
Do While Not rs.EOF

    'Work with your resultset here...

rs.MoveNext '<-- don't forget this!
Loop

'Cleanup.
rs.Close
Set rs = Nothing

【讨论】:

  • 谢谢,我试试看
  • 可能比你要找的多一点,但它确实有效。
【解决方案2】:

你可以用这个:

Dim strName   as string
dim rst    as DAO.RecordSet
strName = [Forms]![Search]![SearchFirstName]
strSQL = "SELECT [First name], [Surname] FROM [Names] WHERE SurName = '" & strName & "'"

CurrentDb.QueryDefs("MyPTQuery").SQL = strSQL

' 现在根据上述打开报告。

或者对于一个记录集,去:

dim rst    as DAO.RecordSet
set rst = CurrentDB.OpenRecordset("MyPTQuery")

【讨论】:

  • 您好,非常感谢您回复我。我现在有几天的时间来研究您提供的解决方案,并且我还查看了您在其他地方提供的类似解决方案。我非常感谢你,因为我几乎解决了我的问题。我已将新代码作为答案,想知道您是否对如何添加多个变量有任何建议
【解决方案3】:

对我原来的问题的一点更新。通过使用此处的帮助,我设法使查询适用于一个变量。它的工作原理如下:

SQL 存储过程:

ALTER PROCEDURE [dbo].[ZSearch]

@First varchar(100)

AS
BEGIN

SELECT [First name], [Surname]
FROM [Names]
Where  ([First Name] LIKE '%' + @First + '%')
END

然后在 Access 中,我有一个直通查询:

exec [ZSearch]

最后,在我的表单上,我有一个按钮,点击时会运行以下 VB:

Private Sub Command4_Click()
Dim rst As DAO.Recordset

Dim First As String

First = [Forms]![Search]![SearchFirstName]

   
With CurrentDb.QueryDefs("qryPassR")
    .SQL = "exec ZSearch " & First
'Debug.Print .SQL
    Set rst = .OpenRecordset()
    DoCmd.OpenQuery "qryPassR"
End With
End Sub

正如我所说,这非常有效。它也得到了我想要的结果。但是,我还想添加额外的搜索变量,例如 SURNAME。如果 Access 中的任何文本框为空,或者以某种方式将其默认值设置为通配符,我也需要它工作。

我已经尝试了以下

SQL 存储过程

ALTER PROCEDURE [dbo].[ZSearch]

@First varchar(100),
@Second varchar(100)

AS
BEGIN

SELECT [First name], [Surname]
FROM [Names]
Where  ([First Name] LIKE '%' + @First + '%') and ([Surname] LIKE '%' + @Second + '%')
END

然后在 Access 中,我有一个直通查询:

exec [ZSearch]

最后,在我的表单上,我有一个按钮,点击时会运行以下 VB:

Private Sub Command4_Click()
Dim rst As DAO.Recordset

Dim First As String

First = [Forms]![Search]![SearchFirstName]
Second = [Forms]![Search]![SearchSurname]

   
With CurrentDb.QueryDefs("qryPassR")
    .SQL = "exec ZSearch " & First & Second
'Debug.Print .SQL
    Set rst = .OpenRecordset()
    DoCmd.OpenQuery "qryPassR"
End With
End Sub

但是,当我尝试添加第二个变量时,它不起作用,并且 vba 调试器显示“编译错误”

我希望这是我做错的简单事情

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-01-20
    • 2013-09-18
    • 2010-09-08
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多