2010-08-13 4 views
1

У меня возникла странная проблема при попытке выполнить запрос DELETE снова в таблице SQL Server с помощью VB.NET, SQL Command и Parameters.Sqlcommand Параметры не выполняются

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

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 [email protected] AND GROUPNUM [email protected]" 

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

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

EDIT: У меня есть следующие позже в коде, чтобы проверить, если выполнить все это успешно обработано:

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 

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

+0

Вы подтвердили, что Transaction.Commit называется? –

ответ

4

Вы пропускаете Transaction.Commit

Update в respone для получения дополнительной информации добавляется вопрос:

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

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

ADO.NET and System.Transactions

Transaction Processing in ADO.NET 2.0

+0

Они были представлены позже в коде, они заключены в IF ... ELSE, чтобы убедиться в том, что транзакции совершаются только в том случае, если ВСЕ транзакции будут успешными. – Lima

+0

@Lima - не смешивайте несколько подобных транзакций. Вы можете и должны использовать одну и ту же транзакцию для нескольких команд. –

+0

Можете ли вы предоставить информацию/ссылки на то, как я могу выполнить одну транзакцию для четырех запросов? Я бы предпочел это, поскольку это более аккуратный код, но не знаю, как этого добиться. – Lima

1

Я мог бы догадаться, что ваше призвание прок имеет значения идентификатора пользователя и groupid назад. Если DELETE не найдет подходящую запись, она завершится успешно, но ничего не сделает. Я предлагаю обернуть удаление в хранимой процедуре. Затем вы можете добавить код для проверки правильности прохождения значений параметров.

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

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

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

Dim pUID as New Parameter("@userid", SqlDbType.Int) 
pUID.Value = userid 
cmd.Parameters.Add(pUID) 
+0

@userID и @groupID оба являются правильными значениями, а запрос выполняется отлично при использовании студии управления. Я бы предпочел не создавать новый SP для этих запросов, так как у меня получилось бы большое количество SP (я считаю не менее 16 для этого проекта). – Lima

0

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

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

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

Matt

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