Параметры Sqlcommand не выполняются - PullRequest
1 голос
/ 13 августа 2010

Я сталкиваюсь со странной проблемой при попытке выполнить запрос DELETE снова с таблицей SQL Server, используя VB.NET, команду SQL и параметры.

У меня есть следующий код:

Try    
    sqlCommand.Transaction = transaction1
    sqlCommand.Connection = conn
    sqlCommand.CommandText = sqlQuery
    sqlCommand.Parameters.Add("@userID", SqlDbType.Int).Value = Convert.ToInt32(userID)
    sqlCommand.Parameters.Add("@groupID", SqlDbType.Int).Value = Convert.ToInt32(groupID)
    ''#Delete the user from the group.
    MessageBox.Show("User: " + Convert.ToString(userID) + "    Group: " + Convert.ToString(groupID))
    MessageBox.Show("Param, UserID: " + sqlCommand.Parameters.Item(0).Value.ToString)
    MessageBox.Show("Param, GroupID: " + sqlCommand.Parameters.Item(1).Value.ToString)
    return_deleteUser = sqlCommand.ExecuteNonQuery()
Catch ex As Exception
    transaction1.Rollback()
    Dim hr As Integer = Marshal.GetHRForException(ex)
    MsgBox("Removal of user from group has failed: " + ex.Message() & hr)
End Try

, который выполняет следующий SQL-запрос:

Dim sqlQuery As String = "DELETE FROM MHGROUP.GROUPMEMS WHERE USERNUM =@userID AND GROUPNUM =@groupID"

Моя проблема заключается в том, что при выполнении кода вообще не сообщается об ошибке.Я запустил SQL Profiler, и запрос не отображается в списке трассировки.Все три окна сообщений, которые я добавил, возвращают правильные значения, и если я должен был выполнить SQL-запрос к таблице со значениями, запрос выполняется успешно.И userID, и groupID являются трехзначными целыми числами.

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

РЕДАКТИРОВАТЬ: У меня есть следующее позже в коде, чтобыпроверьте, все ли успешно выполнено выполнение:

If return_insertEvent > 0 And return_updateUser > 0 And return_nextSID > 0 And return_deleteUser > 0 Then
    MessageBox.Show("Success")
    return_removeADGroup = RemoveUserFromGroup(userID, groupName)
    MessageBox.Show("Remove FS User from AD Group: " + return_removeADGroup)
    transaction1.Commit()
    transaction2.Commit()
    transaction3.Commit()
    transaction4.Commit()
    returnResult = 1
Else
    transaction1.Rollback()
    transaction2.Rollback()
    transaction3.Rollback()
    transaction4.Rollback()
    returnResult = 0
End If

Если вам требуется дополнительная информация, пожалуйста, не стесняйтесь обращаться ко мне.

Ответы [ 3 ]

4 голосов
/ 13 августа 2010

Вам не хватает Transaction.Commit

Обновление в ответ на дополнительную информацию, добавленную к вопросу:

Почему у вас 4 транзакции? Поскольку их фиксация и откат выполняются вместе, вам нужна только одна транзакция. Я предлагаю вам использовать TransactionScope

Вы можете назначить текущую транзакцию объектам команд ADO.NET:

ADO.NET и System.Transactions

Обработка транзакций в ADO.NET 2.0

1 голос
/ 14 августа 2010

Я могу догадаться, что ваш вызывающий процесс имеет значения userid и groupid в обратном направлении. Если УДАЛИТЬ не найдет подходящую запись, она будет успешно завершена, но ничего не сделает. Я предлагаю обернуть ваше удаление в хранимую процедуру. Затем вы можете добавить код для проверки правильности ввода значений параметров.

Create Procedure UserDelete
@userid int, @groupID int
As
BEGIN
    Select @userid as UID, @groupID as GID INTO TESTTABLE;
    DELETE FROM MHGROUP.GROUPMEMS WHERE USERNUM =@userID AND GROUPNUM =@groupID;
END

Запустите ваш код, затем проверьте содержимое TESTTABLE.

FWIW: мне не нравится пытаться получить полное объявление параметра в одной строке. Слишком много всего происходит для меня. Мне нравится это ...

Dim pUID as New Parameter("@userid", SqlDbType.Int)
pUID.Value = userid
cmd.Parameters.Add(pUID)
0 голосов
/ 15 августа 2010

После некоторого времени отладки и трассировки sql я обнаружил, что глупое приложение, к которому относится БД, по-разному относится к членам группы, группы находятся в административной базе данных, но членство пользователей в группе находится в другой базе данных.

Спасибо всем выше, кто предоставил время и мысли, чтобы помочь с кодом.Я изменил код, как рекомендуется, чтобы использовать только две транзакции и два соединения (1 для администратора и суб-базы данных).Код теперь намного лучше и его легче читать.

Еще раз спасибо,

Мэтт

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...