2017-02-21 7 views
1

Я использую MS Access VBA и хранимую процедуру SQL Server для своего приложения. У меня есть форма frmUsers, у которой есть текстовое поле UserName. Он связан с именем пользователя tblUsers. Если пользователь обновляет его с помощью «@» перед входным значением текстового поля, он должен очистить некоторые столбцы (Password и Hash) в таблице SQL tblUser.Как вызвать хранимую процедуру в выражении if, используя проход через запрос?

Я уже создал хранимую процедуру для него, а также написал код под 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 
+0

Я полагаю, что поле 'Password' зашифровано? Зачем вам это нужно, хотя, учитывая, что вы (по-видимому) храните «Хеш»? –

+0

@ Mat'sMug: Я просто дал несколько имен для столбцов таблицы. Мне нужно свести на нет два столбца. сохраняя «@» впереди, что означает деактивацию пользователя из системы/приложения. – toofaced

+0

Извините, но почему бы не сделать явную ** функцию удаления ** для удаления записей? –

ответ

2

Поскольку "@" не является целым числом, но ваш параметр

CREATE PROCEDURE [dbo].[sp_ClearWebsitePwd] 
    @userID INT 
AS 

Чтобы сделать его более ясным:

  • Пользователь вводит @123 в frm.UserID
  • Код присоединяет strFilter & [sp name] & @123
  • Оператор IF смотрит на первый символ frm.UserID, определяет, что это, и продолжается в True секции кода
  • Истинный участок проходит @123 в качестве параметра хранимой процедуры
  • Хранимая процедура ожидает, целое число, так что тихо barfs, когда он получает строку, не возвращая никаких признаков ошибка

Чтобы это исправить:

If frm.Tag Then 
    If Left(CustomerName, 1) = "@" Then   
     strFilter = strFilter & "sp_ClearWebsitePwd" 
     strFilter = strFilter & ", " & right(frm!UserID, len(frm!UserID) - 1) 

     DB.QueryDefs("qryClearWebsitePwd").Connect = SQLConnectString 
     DB.QueryDefs("qryClearWebsitePwd").sql = strFilter 
    End If 
End If 
'assumes something happens here to actually execute the query 

Это обрежет ведущую @ от UserID до того передавая его как int.

Если честно, я предлагаю вам попробовать найти другое значение триггера, чтобы указать, что учетная запись отключена.Возможно, подумайте над добавлением поля «Active» (установите для всех значение «Истина») и с помощью своего SP установите значение «False» или, наоборот, добавьте поле «Отключено» (установите для всех значение «False») и используйте SP, чтобы установить это поле в « Правда'.

+0

Кажется, что OP объединяет значение 'UserId' в вызов SP (' strFilter & "," & frm! UserID') и что '@' является частью поля CustomerName. –

+0

Верно, но 'frm! UserID' содержит' @ 123', поэтому исходный символ '@' можно использовать в качестве триггера для входа в 'IF', который выполняет SP. '@', является частью строки, которая передается в SP, который ожидает целочисленный параметр. '@ 123' - _not_ целое число. – FreeMan

+0

ОК, наконец-то увидел, о чем говорил Мать-Маг - это был долгий день. Пока у OP нет большей ясности, это, вероятно, ничего не исправит. – FreeMan

3

По существу, вы не делаете .Execute свой запрос, чтобы он ничего не делал. Вы изменяете только его свойства SQL и строки подключения.

Кроме того, при вызове хранимой процедуры вам не требуется разделение запятой или префикс '@'. Удалите команду '@' пользователя из формы и просто передайте целое число. И если свойство соединения никогда не изменяется, нет необходимости обновлять его, чтобы можно было удалить строку.

If frm.Tag Then 
    strFilter = "sp_ClearWebsitePwd " & frm!UserID  

    DB.QueryDefs("qryClearWebsitePwd").Connect = SQLConnectString 
    DB.QueryDefs("qryClearWebsitePwd").SQL = strFilter 
    DB.QueryDefs("qryClearWebsitePwd").Execute dbFailOnError 
End If 
2

Спасибо, что постарались мне помочь. Я узнал, чего я пропустил. Все правильно, кроме меня не хватало, чтобы установить DB.QueryDefs("qryClearWebsitePwd").ReturnsRecords = False Таким образом, правильная версия будет:

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").ReturnsRecords = False 
      DB.QueryDefs("qryClearWebsitePwd").sql = strFilter 
      DB.QueryDefs("qryClearWebsitePwd").Execute dbFailOnError 
     End If 
    End If 
End Sub 

После того, как я добавил эту строку кода, он работал нормально. Кажется, что SQL ожидал некоторых возвращаемых значений, но доступ ничего не возвращал.

Смежные вопросы