2015-12-03 1 views
1

У меня есть довольно упрощенный API для добавления, а затем позднее обновление небольшой таблицы в SQL Server. Он будет вставлять (или обновлять, что проявляет такое же странное поведение), когда я вхожу в код доступа к данным в отладчике, но не тогда, когда я перехожу на этот же код. Конечно, я пропустил что-то очевидное ...C# и SQL Server: вставка/обновление действительно выполняется при отладке

int result = 0; 
const string sql = "INSERT into MyProgress (ImportJobId, SiteCode, ProcessedAmount, TotalToProcess, ErrorCount, CreatedDateTime, LastModifiedDateTime) " + 
        "VALUES (@importJobId, @siteCode, @currentProgress, @totalPieces, 0, getdate(), getdate())"; 

using (var connection = GetSqlConnection()) 
using (var sqlCmd = GetSqlCommand(connection, sql)) 
{ 
    sqlCmd.Parameters.AddWithValue("@importJobId", importJobId); 
    sqlCmd.Parameters.AddWithValue("@siteCode", siteCode); 
    sqlCmd.Parameters.AddWithValue("@currentProgress", currentProgress); 
    sqlCmd.Parameters.AddWithValue("@totalPieces", totalPieces); 

    //SqlParameter outputParameter = new SqlParameter("@ID", SqlDbType.Int, 4); 
    //outputParameter.Direction = ParameterDirection.InputOutput; 
    //sqlCmd.Parameters.Add(outputParameter); 

    sqlCmd.BeginExecuteNonQuery(); 
    //result = (int) (outputParameter.Value ?? -1); 
} 

return result; 

Для любопытных, GetSqlConnection() выглядит следующим образом:

SqlConnection connection = new SqlConnection(_ConnectionString); 
connection.Open(); 
return connection; 
+0

Нам нужно знать значение '_ConnectionString'. –

+0

Где вызов EndExecuteNonQuery? См. Пример для [BeginExecuteNonQuery] (https://msdn.microsoft.com/en-us/library/ca56w9se (v = vs.110) .aspx? Cs-save-lang = 1 & cs-lang = csharp # code-snippet -1) на MSDN – Steve

+0

Нет, _ConnectionString в порядке. Если в _ConnectionString что-то не так, это будет ~ никогда ~ вставлять данные. Пэдди решил проблему (см. Принятый ответ) – REW

ответ

2

BeginExecuteNonQuery() - асинхронный метод. Он немедленно вернется, прежде чем команда будет выполнена. Чтобы дождаться завершения, используйте метод EndExecuteNonQuery.

Когда вы вызываете BeginExecuteNonQuery для выполнения инструкции Transact-SQL, вы должны вызвать EndExecuteNonQuery для завершения операции. Если процесс выполнения команды еще не завершен, этот метод блокируется до завершения операции.

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

sqlCmd.ExecuteNonQuery(); 

Этот номер будет возвращен только после выполнения команды.

Если вы хотите выполнить команду асинхронно, гораздо проще использовать метод ExecuteNonQueryAsync.

await sqlCmd.ExecuteNonQueryAsync(); 

Обратите внимание, что вы должны сделать свой метод async использовать await. Для его использования также требуется .NET 4.5+.

4

Edited исправить ошибочно вызвать этот метод асинхронного - см комментариев.


Вы вызываете метод BeginExecuteNonQuery который инициирует запрос, но вы должны вызвать EndExecuteNonQuery для завершения операции (как правило, в асинхронном режиме). Когда вы отлаживаете, у этого есть шанс завершить, когда вы вручную переходите. Когда вы переходите, соединение устанавливается до завершения.

Вам необходимо либо обновить код, чтобы использовать шаблон асинхронной модели программирования (APM), либо вместо этого вызвать синхронный ExecuteNonQuery.

+1

Вы не можете ждать 'BeginExecuteNonQuery'. Он возвращает 'IAsyncResult', а не' Task'. Я думаю, вы имели в виду «ExecuteNonQueryAsync». –

+0

@JakubLortz - извинения, вы правы. Отвечая на вопросы из дома, когда они спят ... – Paddy

+0

@ Падди, чтобы вы подтвердили, что ваш вопрос содержит неверную информацию, но вы не исправите неверную информацию? –

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