【发布时间】:2017-07-11 14:18:27
【问题描述】:
我正在为我的应用程序使用 MS Access VBA 和 SQL Server 存储过程。我有一个表单 frmUsers,它有一个文本框 UserName。它绑定到 tblUsers 的用户名。如果用户在文本框输入值前使用“@”更新它,则必须清除 SQL 表tblUser 中的某些列(Password 和Hash)。
我已经为它创建了一个存储过程,并且还在 UserName_AfterUpdate 下编写了一些代码。我觉得我需要创建一个传递查询来调用If 语句中的存储过程,如下所示;但它不起作用(没有删除表中的值,也没有给出任何错误)。
存储过程本身可以工作,但是当我尝试使用应用程序测试它时,即在文本框前面插入“@”,它不会删除表中的两列。我错过了在传递查询和文本框之间绑定的东西。请帮忙。
MS Access VBA
Private Sub UserName_AfterUpdate()
On Error Resume Next
Dim frm As Form
Dim strFilter As String
Dim DB As Database
Set DB = CodeDb
DoCmd.OpenForm "frmUsers", , , , , acDialog
Set frm = Forms!frmUsers
If frm.Tag Then
strFilter = strFilter & "sp_ClearWebsitePwd"
strFilter = strFilter & ", " & frm!UserID
If Left(UserName, 1) = "@" Then
DB.QueryDefs("qryClearWebsitePwd").Connect = SQLConnectString
DB.QueryDefs("qryClearWebsitePwd").sql = strFilter
End If
End If
End Sub
SQL Server存储过程
CREATE PROCEDURE [dbo].[sp_ClearWebsitePwd]
@userID INT
AS
BEGIN
SET NOCOUNT ON;
UPDATE tblUser
SET tblUser.Password = NULL, tblUser.Hash = NULL
WHERE UserID = @userID
END
MS Access 直通查询(qryClearWebsitePwd)
sp_ClearWebsitePwd, 20226
【问题讨论】:
-
我想
Password字段是加密的?考虑到您(显然)存储了Hash,为什么您甚至需要它? -
@Mat'sMug:我只是为表格列命名。我需要取消两列。保持'@'在前面意味着从系统/应用程序中停用用户。
-
抱歉,为什么不明确delete功能来删除记录?
-
您的过程被命名为
UserName_AfterUpdate(),表示它附加到表单上某个名为UserName的文本框。在您的代码中,您正在查看一个名为CustomerName的变量,以查看第一个字符是否为@。如果您将Option Explicit作为代码模块的第一行并尝试编译,我愿意这样做,VBE 会告诉您CustomerName是一个未声明的变量。 ... -
旁注:您应该不为您的存储过程使用
sp_前缀。微软有reserved that prefix for its own use (see Naming Stored Procedures),你确实会在未来某个时候冒着名称冲突的风险。 It's also bad for your stored procedure performance。最好只是简单地避免sp_并使用其他东西作为前缀 - 或者根本不使用前缀!
标签: sql vba ms-access stored-procedures pass-through