Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/330.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/sql-server-2005/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 从字符串转换日期时间时转换失败_C#_Sql Server 2005 - Fatal编程技术网

C# 从字符串转换日期时间时转换失败

C# 从字符串转换日期时间时转换失败,c#,sql-server-2005,C#,Sql Server 2005,我尝试从SQLServer2005中读取数据,并将其填充到TableAdapter中。我也尝试使用DataReader,但我一直遇到此异常。 问题是,我在一些系统上遇到了这个错误,也就是说,我在一个系统上运行我的应用程序,但是在另一个系统上我遇到了这个异常 代码是: public DataSetRef GetReportPumpControl(PumpInfo pump, DateTime start, DateTime end) { if (!OpenConnectio

我尝试从SQLServer2005中读取数据,并将其填充到TableAdapter中。我也尝试使用DataReader,但我一直遇到此异常。 问题是,我在一些系统上遇到了这个错误,也就是说,我在一个系统上运行我的应用程序,但是在另一个系统上我遇到了这个异常

代码是:

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);
除了总体上更好的实践之外,这将使用参数中的转换属性,这些属性比隐式内联字符串转换更好地用于这类事情