2015-09-01 42 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

感謝您的建議。我會繼續爲我的未來努力。 :) –

相關問題