2017-09-26 46 views
0

我有一個使用訪問文件來存儲數據的一些代碼:P不能節省訪問數據庫的變化

我寫了一篇關於無代碼的訪問文件中的一些數據,以便我能讀它,並閱讀工作方法細,像這樣的:

class dbConection 
{ 
private static OleDbConnection conection = new OleDbConnection(@"Provider=Microsoft.Jet.OLEDB.4.0;Data Source=|DataDirectory|\teacher assistant.mdb"); 
private static OleDbCommand comand = new OleDbCommand(); 
private static OleDbDataAdapter adapter = new OleDbDataAdapter(); 

public static bool canConnect() 
    { 
     try 
     { 
      conection.Open(); 

      if (conection.State == ConnectionState.Open) 
      { 
       Console.WriteLine("conexion exitosa"); 
       conection.Close(); 
       return true; 
      } 
      else 
      { 
       Console.WriteLine("conexion fallida"); 
       return false; 
      } 
     } 
     catch (Exception ex) 
     { 
      Console.WriteLine("conexion fallida, error: "+ex.Message); 
      return false; 
     } 

    //more methods... 

    } 

而這一次

internal static Grupo[] GruposAsociadosCon(int idUsuario) 
    { 
     conection.Open(); 
     comand.Connection = conection; 
     comand.CommandText = "SELECT * FROM Salones WHERE maestro=" + idUsuario.ToString(); 
     OleDbDataReader reader = null; 
     reader = comand.ExecuteReader(); 

     List<Grupo> lGrupos = new List<Grupo>(); 

     while (reader.Read()) 
     { 
      int id = Convert.ToInt16(reader["idSalon"].ToString()); 
      int grado = Convert.ToInt16(reader["grado"].ToString()); 
      char grupo = reader["grupo"].ToString().First(); 
      string escuela = reader["escuela"].ToString(); 
      Grupo g = new Grupo(id, grado, grupo, escuela); 

      lGrupos.Add(g); 
     } 

     reader.Close(); 
     conection.Close(); 

     return lGrupos.ToArray(); 

    } 

問題是這寫數據的方法,像這樣的:

internal static bool RegistrarUsuario(string usuario, string contra) 
    { 
     conection.Open(); 
     comand.Connection = conection; 
     comand.CommandText = "SELECT * FROM Usuarios WHERE usuario='" + usuario + "'" ; 
     OleDbDataReader reader = comand.ExecuteReader(); 

     if (reader.HasRows) 
     { 
      //MessageBox.Show("EL usuario ya existe"); 
      conection.Close(); 
      throw new Exception("Ya existe este usuario"); 
     } 

     reader.Close(); 
     comand = new OleDbCommand(); 
     comand.CommandText = "INSERT INTO Usuarios (usuario, contrasena) VALUES('"+usuario+"', '"+contra+"')"; 
     comand.Connection = conection; 
     Console.WriteLine(comand.ExecuteNonQuery()+" lienas con cambios"); 
     conection.Close(); 
     return true; 
    } 
當我保存它不會對accessFile apear,我沒有得到一個異常文件的數據

,程序工作就好像數據在那裏,

comand.CommandText = "SELECT * FROM Usuarios WHERE usuario='" + usuario + "'" ; 
OleDbDataReader reader = comand.ExecuteReader(); 
if (reader.HasRows) 
{ 

reader.HasRows retuns真正

它的工作原理一樣,如果數據在那裏,直到我關閉程序,在我看來,它是建立一箇中的臨時文件或S並且它在關閉時不保存更改。 我怎樣才能使這些變化永久?

回答

0

根據我可以在您發佈的代碼中看到的變化應該是永久性的。我想指出的一件事是,創建INSERT語句的代碼容易受到SQL注入攻擊的影響。你可以研究,這是什麼,看看它是否適用於你(基本上這一切都取決於如果Access支持SQL命令,如DROP TABLE等。

有幾件事我會檢查。

  1. 在你的解決方案中找到MDB文件,並檢查它的屬性,其中一個屬性是「複製到輸出目錄」,這需要設置爲Copy If Newer而不是始終複製。運行該程序時,MDB文件的空副本將覆蓋您的DEBUG/RELEASE文件夾中包含數據的MDB。如果您更改了MDB的結構,則只有更新時纔會替換數據文件它的日期比調試文件夾中的更新。

  2. 如果上述不是問題,那麼你可能有一個損壞的MDB,你需要在Access中打開它並對其進行修復。

+0

已經嘗試過這些:/ 謝謝任何​​方式:) –

+0

我在我的研究過程中發現的另一個問題是您的連接字符串。逐行調試您的代碼並查看.NET正在轉換的數據| DataDirectory |成。我理解它應該是運行代碼的目錄(與EXE相同)。即使您已經在DEBUG期間啓用了ClickOnce部署,它仍然應該解析爲數據文件夾。如果沒有提供任何照明,我會有興趣查看整個源代碼包以查看是否可以追蹤錯誤,但是,可能存在隱私和代碼所有權問題,可能會阻止此類幫助。 – Wizengamot

+0

我這裏的連接字符串的原因是因爲你的代碼顯然是保存數據,這很清楚..所以要回答的問題是......數據在哪裏?如果你無法解析給出的位置(即.NET不告訴你),那麼我建議使用不受控制的MDB文件的全限定路徑。NET(調試文件夾外)...例如c:\ temp \ teacher assistant.mdb。我要做的最後一件事就是在文件名中創建一個沒有空格的MDB。我知道你應該能夠使用空格等,但只是爲了shiggles和gits .... :-) – Wizengamot