2015-09-01 43 views
1

很抱歉的,而蹩脚的问题......但这里是我的困境...为什么OleDbCommand和OleDbType.Date不能正常工作,并且没有错误?

我想在这里减少重复的代码尽可能的,因为我有几个类似的查询,只是在参数变化计数。

使用AccessDB(我在这里没有选择)。下面的代码适用于我,但是,当我有一个需要输入的日期时。它没有输入日期,也没有给我任何错误。

public bool DoUpdate(string query, string[] data) { 

     using (OleDbConnection conn = new OleDbConnection(this.ConnStr)) 
     { 
      try 
      { 
       OleDbCommand cmd = new OleDbCommand(query, conn); 
       DateTime tmp; 
       for (int i = 0; i < data.Length; i++) 
       { 
        if (DateTime.TryParse(data[i], out tmp)) // Checks if valid date... 
         cmd.Parameters.Add(new OleDbParameter("?", OleDbType.Date) { Value = tmp.ToString() }); 
        else 
         cmd.Parameters.AddWithValue("?", data[i]); 
       } 
       conn.Open(); 
       cmd.ExecuteNonQuery(); 
       conn.Close(); 
      } 
      catch (OleDbException ex) 
      { 
       MessageBox.Show(ex.ErrorCode.ToString() + "\n\n" + ex.Message + "\n\n" + query); 
       if (conn.State == ConnectionState.Open) 
       { 
        conn.Close(); 
        return false; 
       } 
      } 
     } 
     return true; 
    } 

在使用中:

// [ time string is DateTime.Now.ToString("M/dd/yyyy h:mm:ss tt") ] 
if (DB.DoUpdate("UPDATE Loads SET Customer='?', FinishTime=?, Carrier='?', Reference='?', Tags='?', Status='Received' WHERE LoadID = ?", 
     new string[] { Item["Customer"], Item["FinishTime"], Item["Carrier"], Item["Reference"], Item["TagIDs"], Item["LoadID"] })) { ... } 

日期栏是 “FinishTime”。请注意,我已经在SQL中尝试了几个变体。如:[FinishTime] =?/[Finishtime] =#?#/ [FinishTime] ='?'/FinishTime ='?' ... 此外,是什么让我放入DateTime.TryParse开始是它无法正常工作。 (虽然我最初收到一个错误...)即使我删除了解析代码,没有错误,并且SQL像正常一样传递,只有日期也没有输入。

请注意,我还生成了一个Excel电子表格,其中的日期和时间在那里没有问题,所以时间字符串传递得很好。

任何想法?注释?

回答

3

您已经在SQL中引用了大部分参数,这意味着其他参数不会在您期望的位置。你的SQL应该是:

UPDATE Loads 
SET Customer=?, FinishTime=?, Carrier=?, Reference=?, Tags=?, Status='Received' 
WHERE LoadID = ? 

此外,我强烈建议不要传递所有数据作为字符串。如果可以帮助它,并且肯定不在SQL语句中,请不要将DateTime的值转换为的字符串。目前你已经有了:

cmd.Parameters.Add(new OleDbParameter("?", OleDbType.Date) { Value = tmp.ToString() }); 

这将是更好的:

cmd.Parameters.Add("?", OleDbType.Date).Value = tmp; 

...但它会更好,如果你甚至不必解析字符串得到tmp启动用。 (真的不清楚日期来自哪里,以及是否有作为字符串存在。)

您拥有的日期/字符串转换次数越多,格式和文化的空间越多搞砸了 - 你只需要一个步骤来格式化日期的方式,下一步解析它并不期望整个事情失败。

+0

感谢您的提示。你的两个调整之一解决了这个问题。日期来自用户选择'DateTimePicker'或“今日”复选框,它在我的代码中默认为'DateTime.Today()'。我的代码仅用于工作中的房子,用于不会离开建筑物的小型项目。我不认为文化会把它搞乱。也许它只是我的业余编码,那么它仍然在做字符串。 再次感谢! –

+2

@TonyArnold:在这两种情况下,听起来你应该可以得到'DateTime',所以根本就不需要字符串表示。避免不必要的字符串转换是非常值得的。 –

+0

感谢您的建议。我会继续为我的未来努力。 :) –

相关问题