2017-08-09 194 views
-2
try 
{ 
    OleDbConnection myConnection = new OleDbConnection("Provider=Microsoft.ACE.OLEDB.12.0;Data Source=C:\\Users\\HP8200\\Desktop\\ELISA2014Data.mdb ;Persist Security Info=False;"); 
    myConnection.Open(); 

    // Create Oledb command to execute particular query 
    OleDbCommand myCommand = new OleDbCommand(); 
    myCommand.Connection = myConnection; 

    // Query to create table with specified data columne 
    myCommand.CommandText = "CREATE TABLE UXZona([IDZona] int, [Morada] text)"; 
    //myCommand.ExecuteNonQuery(); 
    MessageBox.Show("Tabela criada"); 
} 
catch 
{ 
    OleDbConnection myConnection = new OleDbConnection("Provider=Microsoft.ACE.OLEDB.12.0;Data Source=C:\\Users\\HP8200\\Desktop\\ELISA2014Data.mdb ;Persist Security Info=False;"); 
    myConnection.Open(); 

    OleDbCommand cmd = new OleDbCommand(); 
    cmd.CommandType = CommandType.Text; 
    cmd.CommandText = "INSERT INTO UXZona (IDZona, Morada) VALUES ('" + 
         transaction.UnloadPlaceAddress.AddressID + "','" + 
         transaction.UnloadPlaceAddress.AddressLine2 + "')"; 
    cmd.ExecuteNonQuery(); 

    MessageBox.Show("Dados inseridos"); 
} 

我需要插入數據到數據庫,但它不工作。我啓動程序並且沒有錯誤,我做了所有事情,但是當我檢查數據庫時表格是空的。插入數據到MS Access數據庫

UPDATE

現在,當我啓動程序我有這樣的錯誤:

「System.InvalidOperationException:「的ExecuteNonQuery:Connection屬性尚未初始化」上cmd.ExecuteNonQuery();

+2

[SQL注入警報](http://msdn.microsoft.com/en-us/library/ms161953%28v=sql.105%29.aspx) - 你應該**永遠不會EVER **連接在一起你的SQL聲明 - ***總是***使用**參數化查詢**,而不是爲了避免SQL注入 –

+0

@marc_s我會記住這一點,謝謝 –

+0

@marc_s只是一個問題,我正在使用訪問,那SQL注入警報影響我? –

回答

2

有一些東西錯了!我給出下面更正的代碼:

try 
{ 
    bool success = false; 
    using (var myConnection = new OleDbConnection("Provider=Microsoft.ACE.OLEDB.12.0;Data Source=C:\\Users\\HP8200\\Desktop\\ELISA2014Data.mdb ;Persist Security Info=False;")) 
    { 
     // Create Oledb command to execute particular query 
     using (var myCommand = new OleDbCommand()) 
     { 
      myCommand.Connection = myConnection; 

      // Query to create table with specified data columne 
      //myCommand.CommandText = "CREATE TABLE UXZona([IDZona] int, [Morada] text)"; 
      //myCommand.ExecuteNonQuery(); 
      //MessageBox.Show("Tabela criada"); 

      cmd.CommandType = CommandType.Text; 
      cmd.CommandText = "INSERT INTO UXZona (IDZona, Morada) VALUES (@id, @morada)"; 
      var param = cmd.CreateParameter(); 
      param.ParameterName = "@id"; 
      param.OleDbType = OleDbType.Integer; 
      param.Value = transaction.UnloadPlaceAddress.AddressID; 
      cmd.Parameters.Add(param); 

      param = cmd.CreateParameter(); 
      param.ParameterName = "@morada"; 
      param.OleDbType = OleDbType.VarChar; 
      param.Value = transaction.UnloadPlaceAddress.AddressLine2; 
      cmd.Parameters.Add(param); 

      myConnection.Open(); 

      if (cmd.ExecuteNonQuery() == 1) 
      { 
       success = true; 
      } 
     } 
    } 
    if (success) 
    {  
     MessageBox.Show("Dados inseridos"); 
    } 
} 
catch (Exception ex) 
{ 
    MessageBox.Show(ex.Message); 
} 

作爲解釋的方式。我已註釋掉(但未刪除)所有對創建表的引用。表創建和表插入應該在兩個不同的例程中。通常你只能創建一次表,但插入可能會被調用很多次。

我已經將OleDbConnection和OleDbCommand放入使用循環中。這是很好的做法,因爲它們都實現了IDisposable。像這樣編寫代碼意味着垃圾收集器(GC)立即知道它可以在使用後安全地處理對象。

我已經改變了插入語句,以便它帶有參數。這是強烈建議的做法,以防止SQL注入(如果你不知道這是什麼,請Google)。實際上Access對於最糟糕的SQL注入來說是相對免疫的,因爲它拒絕包含多個語句的任何命令,但是請注意保持良好的習慣。隨着時間的推移,你將會進入其他沒有這個限制的數據庫。

我在打開連接之前有意等待,直到需要之前。連接會消耗資源,所以最好儘可能少地使用它們。也是因爲這個原因,我把你的成功消息移到了使用循環之外。這意味着清理資源不會等待用戶在消息框中單擊「確定」。

最後嘗試抓住一切都很好,但通常你想知道錯誤發生的原因。因此,你可以添加(Exception ex)來捕獲,以便找到原因。

PS我忘了提及。在你原來的INSERT中,你用單引號括住了兩個VALUES。僅爲字符串/文本使用單引號。整數和其他數字不需要引號。如果引用它們,數據庫會將其視爲一個字符串,並且會得到一個數據類型錯誤。