C# 从字符串转换日期时间时转换失败
我尝试从SQLServer2005中读取数据,并将其填充到TableAdapter中。我也尝试使用DataReader,但我一直遇到此异常。 问题是,我在一些系统上遇到了这个错误,也就是说,我在一个系统上运行我的应用程序,但是在另一个系统上我遇到了这个异常 代码是:C# 从字符串转换日期时间时转换失败,c#,sql-server-2005,C#,Sql Server 2005,我尝试从SQLServer2005中读取数据,并将其填充到TableAdapter中。我也尝试使用DataReader,但我一直遇到此异常。 问题是,我在一些系统上遇到了这个错误,也就是说,我在一个系统上运行我的应用程序,但是在另一个系统上我遇到了这个异常 代码是: public DataSetRef GetReportPumpControl(PumpInfo pump, DateTime start, DateTime end) { if (!OpenConnectio
public DataSetRef GetReportPumpControl(PumpInfo pump, DateTime start, DateTime end)
{
if (!OpenConnection())
return null;
m_Command.CommandText = "SELECT ref_dig_pumpcontrol, ref_energy, ref_datetime FROM [molisoftSchema].[Refresh] WHERE ref_pump_id = " + pump.ID + " AND ref_datetime BETWEEN '" + start + "' AND '" + end + "' ORDER BY ref_datetime ASC";
SqlDataAdapter adapter = new SqlDataAdapter(m_Command);
DataSetRef ds = new DataSetRef();
adapter.Fill(ds, "RefreshPC");
return ds;
/*m_Reader = m_Command.ExecuteReader();
LinkedList<PumpControlInfo> returnValue = new LinkedList<PumpControlInfo>();
while (m_Reader.Read())
{
PumpControlInfo tempControl = new PumpControlInfo();
tempControl.DateTime = (DateTime)m_Reader["ref_datetime"];
tempControl.Energy = (double)m_Reader["ref_energy"];
tempControl.PumpControl = (bool)m_Reader["ref_dig_pumpcontrol"];
returnValue.AddLast(tempControl);
}
m_Reader.Close();
return returnValue.ToArray<PumpControlInfo>();*/
}
请帮我处理这件事。
提前谢谢 一石二鸟,参数化您的SQL将保护您免受SQL注入攻击:
m_Command.CommandText = "SELECT ref_dig_pumpcontrol, ref_energy, ref_datetime FROM [molisoftSchema].[Refresh] WHERE ref_pump_id = @pumpid AND ref_datetime BETWEEN @StartDate AND @EndDate ORDER BY ref_datetime ASC";
m_Command.Parameters.AddWithValue("@pumpid", pump.ID);
m_Command.Parameters.AddWithValue("@StartDate", start);
m_Command.Parameters.AddWithValue("@EndDate", end);
问题是因为.NET开始和结束日期时间值正在序列化为字符串,以便硬编码到您生成的SQL中。但是,无法将此字符串表示形式转换回SQL中的有效日期时间。您需要使用安全的日期格式,如yyyy MM ddTHH:MM:ss,因此在附加到SQL语句之前,请显式格式化这些日期时间。但是,参数化是解决这类问题的更好的解决方案。您应该将查询值设置为参数,而不仅仅是使用字符串连接和隐式转换。尝试:
m_Command.CommandText = "SELECT ref_dig_pumpcontrol, ref_energy, ref_datetime FROM [molisoftSchema].[Refresh] WHERE ref_pump_id = @id AND ref_datetime BETWEEN @start AND @end ORDER BY ref_datetime ASC";
m_Command.Parameters.AddWithValue("@id", pump.ID);
m_Command.Parameters.AddWithValue("@start", start);
m_Command.Parameters.AddWithValue("@end", end);
除了总体上更好的实践之外,这将使用参数中的转换属性,这些属性比隐式内联字符串转换更好地用于这类事情