0

SQL Server データベースにレコードを挿入したいのですが、ExecuteNonQuery() の処理中に奇妙な例外が発生しました。私はこの例外を得ました:

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

しかし、私の問題はこれとは関係ありません。接続の現在の状態が Open であることは間違いありません。私の問題は、クエリのパラメーターの 1 つです。これが私のクエリです:

                  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.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 プロパティも試しましたが、同じ例外がスローされました。問題はどこだ?何か提案はありますか?

4

1 に答える 1

1

正確に何をしようとしていますか?データベースに null 値を入れる代わりに、ダミーの日付を挿入しようとしているように見えますか? このような場合は、実際には意味のない日付ではなく、null 値を挿入することに固執する必要があります。

ローカライズされた値として挿入したくない DateTime 値が実際にある場合は、これが役立つ場合があります: CultureInfo を使用してローカライズされた日付文字列を生成する方法

これは、EF を使用していないときに古いデータベース レイヤーで使用する更新メソッドであり、より安全なコードを提供します。実際にクエリを実行する必要があるまで接続を開く必要はないことに注意してください。using ステートメントを使用すると、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;
    }
于 2013-11-07T08:37:26.747 に答える