2017-08-09 11 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データベースにデータを挿入する

"のSystem.InvalidOperationException:「は、ExecuteNonQueryは:Connectionプロパティが初期化されていない" 私は、プログラムを起動したときにUPDATE

今、私はこのエラーを持っていますon cmd.ExecuteNonQuery();

+2

[SQLインジェクションアラート](http://msdn.microsoft.com/en-us/library/ms161953%28v=sql.105%29.aspx) - 決してSQLを連結しない** ****** *** SQLのインジェクションを回避するために、代わりに**パラメータ化されたクエリ**を使用する –

+0

@marc_s私はそれを念頭に置いておきます。 –

+0

@marc_sただ1つの質問、私はアクセスを使用しています。私に影響する? –

答えて

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); 
} 

説明のために。私は、テーブルを作成するためのすべての参照をコメントアウトしましたが、削除はしていません。テーブルの作成とテーブルの挿入は、2つの異なるルーチンで行う必要があります。通常、テーブルを作成するのは一度だけですが、insertはおそらく何度も呼び出されます。

ループを使用してOleDbConnectionとOleDbCommandを配置しました。彼らはどちらもIDisposableを実装しているので、これは良い方法です。このようにコードを書くことは、ガベージコレクタ(GC)が使用後にオブジェクトを安全に処分できることをすぐに知ることを意味します。

パラメータを取るようにinsert文を変更しました。これは、SQLインジェクションを守るために推奨されている方法です(これがGoogleのものなのかわからない場合)。実際、アクセスは複数のステートメントを含むコマンドを拒否するため、SQLインジェクションの最悪の形態から比較的免れますが、良い習慣を身につけてください。時間の経過とともに、この制限がない他のデータベースに進むことになります。

接続が必要になる直前まで、意図的に接続を開くのを待っています。接続はリソースを消費するため、可能な限り控えめに使用することをお勧めします。このため、私はあなたの成功メッセージをusingループの外に移しました。つまり、リソースのクリーンアップは、ユーザーがメッセージボックスで[OK]をクリックするのを待っているわけではありません。

最後にtry catchがうまくいっていますが、通常はエラーが発生した理由を知りたいと思っています。したがって、(Exception ex)を追加して、理由を見つけることができます。

PS忘れてしまったことは何ですか?元のINSERTでは、両方のVALUESを一重引用符で囲んでいました。文字列/テキストには単一引用符を使用してください。整数やその他の数値は引用符を必要としません。あなたがそれらを引用すると、データベースはそれを文字列として扱い、あなたはデータ型エラーを取得します。

関連する問題