1

有人可以告诉我为什么我得到以下错误,当我运行我的代码时,我不确定我的 sql 语句是否有问题,因为这似乎没问题,但我在下面添加了它,以便我可以得到一个第二个意见

“从字符串转换日期/时间时转换失败”

public static int GetConveyorProductionCount(string machineNameV, string StartTimeV, string EndTimeV)
    {

        try
        {
            int count;

            SqlParameter param01 = new SqlParameter("@param01", SqlDbType.VarChar, 5);
            param01.Value = machineNameV;

            SqlParameter param02 = new SqlParameter("@param02", SqlDbType.VarChar, 5);
            param02.Value = StartTimeV;

            SqlParameter param03 = new SqlParameter("@param03", SqlDbType.VarChar, 5);
            param03.Value = EndTimeV;

            SqlCommand getConveyorProductionSC = new SqlCommand("SELECT cast([" + machineNameV + "] as int) FROM VWCONVEYORPRODUCTION WHERE([DA_TE] BETWEEN @param02 AND @param03)", myConnection);

            getConveyorProductionSC.Parameters.Add(param01);
            getConveyorProductionSC.Parameters.Add(param02);
            getConveyorProductionSC.Parameters.Add(param03);

            myConnection.Open();
            object result = getConveyorProductionSC.ExecuteScalar();
            myConnection.Close();

            if (result == DBNull.Value)
            {
                count = 0;
            }
            else
            {
                count = Convert.ToInt32(result);
            }

            return count;
        }
        catch (Exception e)
        {
            throw new Exception("Error retrieving the Conveyor production count. Error: " + e.Message);
        }
4

3 回答 3

5

除了这段代码的大量其他问题之外

SqlParameter param02 = new SqlParameter("@param02", SqlDbType.DateTime);
param02.Value = StartTimeV;
SqlParameter param03 = new SqlParameter("@param03", SqlDbType.DateTime);
param03.Value = EndTimeV;

会是一个好的开始 假设表中的 DA_TE 列当然是日期时间?当然,您还需要将它们作为 DateTimes 传递

不过,我确实赞扬您使用参数化查询。

如果是我,我的代码看起来像

public static int GetConveyorProductionCount(string machineNameV, DateTime StartTimeV, DateTime EndTimeV)
{
  {
  using (SqlConnection connection = new SqlConnection(myConnectionString))
  {
    connection.Open();
    using(SqlCommand command = new SqlCommand(String.Format(CultureInfo.InvariantCulture, "SELECT cast([{0}] as int) FROM VWCONVEYORPRODUCTION WHERE([DA_TE] BETWEEN @StartDate AND @EndDate)", machineNameV), connection);            
    {
      command.Parameters.AddWithValue("StartDate",StartTimeV);
      command.Parameters.AddWithValue("EndDate",EndTimeV);
      object result = command.ExecuteScalar();
      if (result == DBNull.Value)
      {
        return 0;
      }
      else
      {
        return (Int32)result;
      }
    }
  }
}

您创建的任何实现 IDisposable 的苍蝇都放在 using 块中。

除非您正在执行显式事务,或者关闭连接缓存,否则不要保留 Ado.Net 数据库连接。

将 DateTimes 作为 DateTimes 传递

给你的变量起一个像样的名字,param02 没有任何意义,并且 count 具有误导性。

在需要之前不要创建东西

你对异常所做的事情我个人不会费心在这段代码中陷入困境,尤其是在扔掉有关异常的所有有用细节之后再次抛出它。

如果你想这样做,定义一个 CustomException,然后抛出 new MyCustomException("Error retrieving the Conveyor production count.",e);

这样,如果需要,您将能够捕获此特定异常,但您将拥有整个异常链和所有堆栈跟踪。

最后但并非最不重要的一点是,将包括我在内的所有编码示例都视为是由村里白痴的厚表弟构建的。:D

于 2012-10-05T09:01:41.240 回答
1

我认为您的问题是您的 VWCONVEYORPRODUCTION 表中的 DA_TE 列是 sql 日期类型。所以这意味着你的参数也应该是日期类型。

public static int GetConveyorProductionCount(string machineNameV, DateTime StartTimeV, DateTime EndTimeV)
    {
    enter code here
        try
        {
            int count;

            SqlParameter param01 = new SqlParameter("@param01", SqlDbType.VarChar, 5);
            param01.Value = machineNameV;

            SqlParameter param02 = new SqlParameter("@param02", SqlDbType.date);
            param02.Value = StartTimeV;

            SqlParameter param03 = new SqlParameter("@param03", SqlDbType.date);
            param03.Value = EndTimeV;

            SqlCommand getConveyorProductionSC = new SqlCommand("SELECT cast([" + machineNameV + "] as int) FROM VWCONVEYORPRODUCTION WHERE([DA_TE] BETWEEN @param02 AND @param03)", myConnection);

            getConveyorProductionSC.Parameters.Add(param01);
            getConveyorProductionSC.Parameters.Add(param02);
            getConveyorProductionSC.Parameters.Add(param03);

            myConnection.Open();
            object result = getConveyorProductionSC.ExecuteScalar();
            myConnection.Close();

            if (result == DBNull.Value)
            {
                count = 0;
            }
            else
            {
                count = Convert.ToInt32(result);
            }

            return count;
        }
        catch (Exception e)
        {
            throw new Exception("Error retrieving the Conveyor production count. Error: " + e.Message);
        }

DateTime.ParseExact()如果您需要在调用此函数之前将字符串转换为 DateTimes,请使用此选项。

于 2012-10-05T09:01:50.590 回答
1

我的理论是作为 DateTime 传递的字符串格式不正确。

看看下面的例子

工作价值的 SQL Fiddle DEMO

破值的 SQL Fiddle DEMO

使用01 Ja 2012的第二个示例(注意Ja而不是Jan)产生错误消息

从字符串转换日期和/或时间时转换失败

于 2012-10-05T08:57:00.150 回答