2011-08-28 115 views
0

我正在向數據庫發送命令,它返回的是1行受到影響,但是當我查看數據庫內部時,沒有記錄。我沒有收到任何錯誤。我檢查了一下,確保字符串的構建正確無誤。有任何想法嗎?我知道,我沒有在這裏使用參數化查詢。我會遲一點。下面是從數據庫層代碼:數據庫表示它正在插入,但沒有記錄

public int InsertStartTime(certificate cert, DateTime startTime, string lineNumber) 
     { 
      string sql = "INSERT INTO checkLog(userID,lineNumber,startTime) VALUES(" + 
         cert.userID + ", '" + lineNumber + "', '" + startTime + "');"; 
      int result = 0; 

      try 
      { 
       conn.Open(); 
       comm.CommandText = sql; 
       result = comm.ExecuteNonQuery(); 
      } 
      catch (Exception ex) 
      { 
       MessageBox.Show(ex.Message); 
      } 
      finally 
      { 
       conn.Close(); 
      } 

      MessageBox.Show(result.ToString() + " rows affected"); 
      return result; 
     } 

使用一個Access 2000數據庫文件:

string connStr = @"Provider=Microsoft.Jet.OLEDB.4.0;Data Source=|DataDirectory|\assets\users.mdb;Persist Security Info=True"; 
+2

這是在交易中執行嗎? –

+0

nope。我沒有設置交易,我想這可能只是需要承諾。但是,唉,我沒有像這樣設置它 – Sinaesthetic

+0

有些DBMS默認情況下不會自動提交,iirc。你真的嘗試過嗎? – Medo42

回答

4

在VS中右鍵單擊您的數據庫文件並查看屬性。它是否設置爲「始終複製」?默認情況下,Visual Studio將複製數據庫以進行調試,並且只會對此副本進行任何更改,並且不會反映到原始內容中。如果您想在調試模式下處理「真實」數據庫文件,則可以將其設置爲複製「從不」。

+0

不能爲此感謝你。我拉着(剩下的)頭髮出去了一個小時或更長的時間,試圖找出爲什麼當VS在說他們的時候我的記錄沒有更新。 – dscarr

1

根據您所使用的數據庫/數據提供商,您的SQL命令可能不會在自動被執行 - 提交模式。

嘗試明確提交您的交易。就像這樣:

conn.Open(); 
using (var tran = conn.BeginTransaction()) { 
    comm.Transaction = tran; // Possibly redundant, depending on database. 
    comm.CommandText = sql; 
    result = comm.ExecuteNonQuery(); 
    tran.Commit(); 
} 
+0

。試過這個,結果相同。它說它插入/影響1行,沒有事務對象錯誤。仍然沒有真正添加的記錄 – Sinaesthetic

+0

@Sinaesthetic什麼是DBMS位於你的oledb提供者之下?另外,您確定您正在查看程序正在修改的同一個數據庫實例嗎? –

+0

它只是一個訪問2000分貝文件(mdb)。有點難以錯過;) – Sinaesthetic

1

沒有人指出這一點,所以我會。請不要以這種方式使用SQL。使用參數。否則,你將自己置身於sql攻擊之中。

string sql = "INSERT INTO checkLog(userID,lineNumber,startTime) VALUES(@ID, @line, @starttime); 
     try 
     { 
      conn.Open(); 
      comm.CommandText = sql; 
      comm.Parameters.Add("ID").Value = cert.userID; 
      comm.Parameters.Add("line").Value = lineNumber ; 
      comm.Parameters.Add("starttime").Value = startTime ; 
      result = comm.ExecuteNonQuery(); 
     } 
     catch (Exception ex) 
     { 
      MessageBox.Show(ex.Message); 
     } 
相關問題