Я хочу вставить запись в базу данных SQL Server, но получаю странное исключение в процессе ExecuteNonQuery(). Я получил это исключение:
ExecuteNonQuery requires an open and available Connection.
The connection's current state is closed.
Однако моя проблема не связана с этим. Я определенно уверен, что текущее состояние моего соединения - Открыто. Моя проблема - один из моих параметров в моем запросе. Вот мой запрос:
sql = "update EMAIL_CONNECTIONS " +
"set END_DATE=@EndDate, " +
"STATUS=@Status, " +
"STATUS_DATE=@StatusDate, " +
"CATEGORY_CODE=@CategoryCode, " +
"EMAILOUT_SENTDATE=@EmailOutSentDate, " +
"TO_ADDRESS=@ToAddress " +
"where SESSIONID=@SessionId " +
"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 не связана с Exception.
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, но все равно было выбрано то же исключение. В чем проблема? Есть предложения?
using
. Вам должно бытьusing(var _cnn = ...)
иusing(var cmd = ...)
- person Marc Gravell   schedule 07.11.2013sql
- знаете ли вы, что можно сделать это проще, используя дословные строковые литералы? то естьsql = @"{your text here; can include line feeds etc just by pressing return}";
- person Marc Gravell   schedule 07.11.2013using
для соединения и команды. В противном случае соединение остается открытым при ошибке. - person Tim Schmelter   schedule 07.11.2013DateTime.MinValue
вstring
, затем обратно вDateTime
сDateTime.ParseExact
, наконец, вы используетеDateTime.SpecifyKind
. Результат тот же:DateTime.MinValue
который не поддерживается в sql-сервере (начинается с 1 января 1753 года). - person Tim Schmelter   schedule 07.11.2013