我想在SQL Server数据库中插入一条记录,但是在ExecuteNonQuery()过程中我遇到了一个奇怪的异常。我有这个例外:
ExecuteNonQuery requires an open and available Connection.
The connection's current state is closed.
但是我的问题与此无关。我绝对相信我的连接的当前状态是Open。我的问题是我的查询中的一个参数。这是我的疑问:
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问题与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属性,但仍抛出同样的异常。问题出在哪儿?任何建议?
答案 0 :(得分:1)
你到底想要做什么?看起来您正在尝试插入虚拟日期而不是在数据库中具有空值?如果是这种情况,您应该坚持插入空值而不是没有实际意义的日期。
如果您实际上有一个DateTime值,您不想将其作为本地化值插入,这可能会对您有所帮助:How to produce localized date string with 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;
}