2014-01-11 180 views
1

我非常需要幫助,這:數據類型不匹配

說明:實現在一個按鈕(到達,離開)的形式的功能實現的情況下,與只有一個按鈕和自動。決定是否(根據數據庫中的記錄)」

我的目標 到達或離開 - 1.st點擊按鈕組到達時間,按鈕組第2點擊出發時間,它它保存到數據庫表 - 平日... 我得到的錯誤 - 到達時間被記錄下來,但是當我第二次單擊該按鈕時,出現「標準表達式中的數據類型不匹配」錯誤。

這是我的代碼,

int counter = 0; 
List<DateTime> dateList = new List<DateTime>(); 
public void button1_Click(object sender, EventArgs e) 
{ 
    counter++;    
    DateTime arrivalTime = DateTime.Now; 
    dateList.Add(arrivalTime); 
    if (counter == 1) 
    { 
     string write = "Insert into Weekdays (Arrival) values('" + dateList[0].ToString() + "');"; 
     OleDbCommand read = new OleDbCommand(write, sc); 
     OleDbDataReader reading; 
     try 
     { 
      sc.Open(); 
      reading = read.ExecuteReader(); 
      MessageBox.Show("Arrival time saved!."); 
     } 
     catch (Exception ex) 
     { 
      MessageBox.Show(ex.Message); 
     } 
     sc.Close(); 
    } 
    if(counter == 2) 
    { 
     string update = "UPDATE Weekdays SET Departure = '" + DateTime.Now + "' WHERE Arrival ='" +"';"; 
     OleDbCommand read1 = new OleDbCommand(update, sc); 
     OleDbDataReader reading1; 
     try 
     { 
      sc.Open(); 
      reading1 = read1.ExecuteReader(); 
      MessageBox.Show("Departure time saved!."); 
     } 
     catch (Exception ex) 
     { 
      MessageBox.Show(ex.Message); 
     } 
     sc.Close(); 
    } 
} 

謝謝!

+0

歡迎來到StackOverflow!如果你告訴我們什麼是錯的,它應該做什麼,你會得到更好的答案。儘量減少你的例子,只需要最少量的代碼來重現問題。這將幫助我們幫助你。 –

回答

1
string update = "UPDATE Weekdays SET Departure = '" + DateTime.Now + "' WHERE Arrival ='" +"';"; 

應該不是這是

string update = "UPDATE Weekdays SET Departure = '" + DateTime.Now + "' WHERE Arrival ='" + dateList[0] "';"; 

提示:我添加dateList[0]的條件

2

ichramm的answer將最有可能解決您的問題,但你在這裏有在玩一些其他問題可能不會導致你的錯誤信息,但是不好的做法。

首先,你的參數化查詢,這樣你就不會容易SQL injection漏洞(我毫不猶豫地承認,在特定的例子,似乎並不像一個真正的風險,但最好是經常做的事情以正確的方式):

string update = "UPDATE Weekdays SET Departure = @DepartureTime WHERE Arrival = @ArrivalDate;"; 
OleDbCommand read1 = new OleDbCommand(update, sc); 
read1.Parameters.AddWithValue("@DepartureTime", DateTime.Now); 
read1.Parameters.AddWithValue("@ArrivalDate", dateList[0]); 
... 

鑑於您的詳細信息,你可能並不需要擔心的時區,但我還是建議使用DateTime.UtcNowDateTime.Now,因爲再次,它只能存儲日期/時間值的最佳做法,所以UTC您不必擔心計算出您的存儲價值是什麼時區。

我假設sc是在你的示例代碼的OleDbConnection對象,因此,如果這是不是真的比你可以忽略這裏我引用它。 OleDbCommandOleDbConnection實現了IDisposable接口。這意味着,這些類建立後自己清理,如果你在一個using塊實例化他們,所以我建議你返工這樣的代碼:

try 
{ 
    using (var sc = new OleDbConnection("[YOUR_CONNECTION_STRING]")) 
    { 
     using (var read = new OleDbCommand()) 
     { 
      read.Connection = sc; 
      if (counter == 1) 
      { 
       //set up insert command 
       //parameterize it 
      } 
      if (counter == 2) 
      { 
       //set up update command 
       //see my suggestion above on how this should be parameterized 
      } 

      sc.Open(); 

      //your command doesn't return any results, so why use read.ExecuteReader()? 
      //read.ExecuteNonQuery() will work fine for your purposes and doesn't instantiate 
      //another object 
      var rowsAffected = read.ExecuteNonQuery(); 
     } 
     //at this point, regardless of whether you encounter an error, your command object is cleaned up 
    } 
    //now your connection is automatically closed/disposed of properly, again regardless of whether 
    //you encounter an error 
} 
catch(Exception ex) 
{ 
    MessageBox.Show(ex.Message); 
} 

通知我已經改變了你的read.ExecuteReader()read.ExecuteNonQuery():您不需要使用ExecuteReader(),因爲您的命令沒有返回結果集,所以這樣可以避免實例化OleDbDataReader

同樣,ichramm的答案應該讓你過去你的直接問題,但我會認真考慮我在這裏建議的更改。