2013-11-07 3 views
0

Я хочу вставить запись в базу данных SQL Server, но у меня возникло странное исключение в процессе ExecuteNonQuery(). У меня есть это исключение:SqlCommand ExecuteNonquery странное исключение

ExecuteNonQuery requires an open and available Connection. 
The connection's current state is closed. 

Однако моя проблема не связана с этим. Я определенно уверен, что текущее состояние моего соединения открыто. Моя проблема - один из моих параметров в моем запросе. Вот мой запрос:

    sql = "update EMAIL_CONNECTIONS " + 
          "set [email protected], " + 
          "[email protected], " + 
          "[email protected], " + 
          "[email protected], " + 
          "[email protected], " + 
          "[email protected] " + 
          "where [email protected] " + 
          "and STATUS = 'Inprocess'; "; 
       sql += "insert into ICS_EMAIL_CONNECTIONS_TRX(SESSIONID, AGENTID, STATUS, FIELD1) " + 
         "values(@SessionId, @AgentId, @Status, 'Sended this mail')"; 

Исключение из-за параметра @EmailOutSentDate. Он не принимает формат Datetime или что-то, что я не знаю. Когда я даю DateTime.Now этому параметру, запрос выполняется успешно. Я также попробовал DBNull.Value и запрос работает отлично. Проблема DateTime не связана с Исключением.

SqlConnection _cnn = new SqlConnection(); 
    _cnn.ConnectionString = connectionString; 
    _cnn.Open(); 
    SqlCommand cmd = new SqlCommand(sql, _cnn);      
    cmd.Parameters.Add(new SqlParameter("@EndDate", DateTime.Now)); 
    cmd.Parameters.Add(new SqlParameter("@Status", "Sent")); 
    DateTime result = DateTime.MinValue; 
    result = DateTime.ParseExact(result.ToString("yyyy-mm-dd HH:mm:ss.fff"), "yyyy-mm-dd HH:mm:ss.fff", null); 
       DateTime newdate = DateTime.SpecifyKind(result, DateTimeKind.Local); 
    cmd.Parameters.Add(new SqlParameter("@EmailOutSentDate", newdate));     
    cmd.Parameters.Add(new SqlParameter("@ToAddress", interaction.AllAttributes["To"])); 
    cmd.Parameters.Add(new SqlParameter("@StatusDate", DateTime.Now)); 
    cmd.Parameters.Add(new SqlParameter("@CategoryCode", long.Parse(CategoryCode))); 
    cmd.Parameters.Add(new SqlParameter("@SessionId", interaction.Id)); 
    cmd.Parameters.Add(new SqlParameter("@AgentId", Agent.AgentId)); 
    cmd.CommandType = System.Data.CommandType.Text; 
    cmd.ExecuteNonQuery(); 
    cmd.Dispose(); 

Как вы можете видеть, я также испробовал свойство DateTime.Kind, но все же исключил Исключение. В чем проблема? Любые предложения?

+0

ли стек из точки исключения обратно в ExecuteNonQuery, который показан здесь? или это исключение, возможно, исходит из какой-либо обработки исключений, которую вы не показываете? Также: 'использование'. Вы должны использовать '(var _cnn = ...)' и 'using (var cmd = ...)' –

+0

«Он не принимает формат Datetime или что-то еще» - datetime не отправляются на сервер sql в виде текста; это не вопрос форматирования –

+0

btw; не связанный - как вы построили значение 'sql' - знаете ли вы, что можете сделать это более просто, используя строковые литералы? т. е. 'sql = @" {ваш текст здесь, может включать строки и т. д., просто нажав return} ";' –

ответ

1

Что именно вы пытаетесь сделать? Похоже, вы пытаетесь вставить фиктивную дату вместо нулевого значения в db? Если это так, вы должны придерживаться вставки нулевого значения вместо даты, которая не имеет фактического значения.

Если вы на самом деле имеют значение DateTime, что вы wan't для вставки в локализованной значения, это может помочь вам: How to produce localized date string with CultureInfo

Вот метод обновления мы используем в нашем старом дб слое, когда он не работает с EF и это даст вам более безопасный код. Обратите внимание, что вам не нужно открывать соединение до тех пор, пока вам не понадобится выполнить запрос, и использование с использованием инструкции гарантирует, что вы удалите свой SqlCommand. Свойство _connection является закрытым и используется для всех методов этого класса и устанавливается в конструкторе DependencyInjection.

_connection = new SqlConnection(this._connectionString); 

public int Update(string query, Dictionary<string, string> commandParams) 
    { 
     int affectedRows = 0; 
     using (SqlCommand command = new SqlCommand(query, _connection)) 
     { 
      command.CommandType = CommandType.Text; 
      foreach (var param in commandParams) 
      { 
       if (param.Value == null) 
        command.Parameters.AddWithValue(param.Key, DBNull.Value); 
       else 
        command.Parameters.AddWithValue(param.Key, param.Value); 
      } 

      try 
      { 
       _connection.Open(); 
       affectedRows = command.ExecuteNonQuery(); 
      } 
      catch (Exception ex) 
      { 
       throw ex; 
      } 
      finally 
      { 
       _connection.Close(); 
       command.Parameters.Clear(); 
      } 
     } 

     return affectedRows; 
    } 
Смежные вопросы