2016-04-12 7 views
2

にアクセスデータベースへのデータテーブルを挿入するにはどうすればdatabaseは、C#

は今、私は1つtableから選択し、別の1にそれらを挿入するアクセスで2 tableを持っています。

これは私のコードであるが、それはラインCmd.ExecuteNonQuery();

に例外を示し{ "クエリ式 'のSystem.Object []' の構文エラー(欠落演算子)。"}

コードは

public static void SetSelectedFeedIntoDB(Form2 frm2) 
{ 
    string StrCon = System.Configuration.ConfigurationManager.ConnectionStrings["FeedLibraryConnectionString"].ConnectionString; 
    OleDbConnection Connection = new OleDbConnection(StrCon); 
    OleDbDataAdapter DataA = new OleDbDataAdapter("Select * from FeedLibrary where ID=" + frm2.FeedSelectListBox.SelectedValue, Connection); 
    DataTable DTable = new DataTable(); 
    DataA.Fill(DTable); 

    OleDbCommand Cmd = new OleDbCommand(); 
    Cmd.Connection = Connection; 

    Connection.Open(); 

    foreach (DataRow DR in DTable.Rows) 
    { 
     Cmd.CommandText = "insert into SelectedFeeds Values(" + DR.ItemArray + ")"; 
     Cmd.ExecuteNonQuery(); 
    } 

    Connection.Close(); 
} 

これを解決するにはどうすればよいですか?

答えて

5

エラーは、DataRowのItemArrayプロパティを文字列に連結しているために発生します。この場合、ItemArray(つまり、オブジェクト[])のインスタンスは、その値から文字列を自動的に生成し、クラス名を文字列 "object []"として返すメソッドを持ちませんが、無意味なSQL文字列を生成します

"insert into SelectedFeeds Values(object[])"; 

しかし、あなたは、単にのDataTableとアダプタ

string cmdText = @"SELECT FeedLibrary.* INTO [SelectedFeeds] 
        FROM FeedLibrary 
        where [email protected]"; 
using(OleDbConnection Connection = new OleDbConnection(StrCon)) 
using(OleDbCommand cmd = new OleDbCommand(cmdText, Connection))  
{ 
    Connection.Open(); 
    cmd.Parameters.Add("@id", OleDbType.Integer).Value = Convert.ToInt32(frm2.FeedSelectListBox.SelectedValue); 
    cmd.ExecuteNonQuery(); 
} 

を使用せずに、あなたのために全力を尽くしますSELECT .... INTOステートメントを構築できるしかし、SELECT ... INTOステートメントは、ターゲット表を作成しますが、すでにターゲット表場合はエラーになります存在する。この問題を解決するには、ターゲットが存在するかどうかを発見する必要があります。それが存在しない場合、我々はそうでない場合、我々は二つの異なるクエリを持っている。ここINSERT INTO ..... SELECT

// First query, this creates the target SelectedFeeds but fail if it exists 
string createText = @"SELECT FeedLibrary.* INTO [SelectedFeeds] 
         FROM FeedLibrary 
         where [email protected]"; 
// Second query, it appends to SelectedFeeds but it should exists 
string appendText = @"INSERT INTO SelectedFeeds 
         SELECT * FROM FeedLibrary 
         WHERE [email protected]"; 

using(OleDbConnection Connection = new OleDbConnection(StrCon)) 
using(OleDbCommand cmd = new OleDbCommand("", Connection))  
{ 
    Connection.Open(); 

    // Get info about the SelectedFeeds table.... 
    var schema = Connection.GetSchema("Tables", 
        new string[] { null, null, "SelectedFeeds", null}); 

    // Choose which command to execute.... 
    cmd.CommandText = schema.Rows.Count > 0 ? appendText : createText; 

    // Parameter @id is the same for both queries 
    cmd.Parameters.Add("@id", OleDbType.Integer).Value = Convert.ToInt32(frm2.FeedSelectListBox.SelectedValue); 

    cmd.ExecuteNonQuery(); 
} 

を使用し、最初のSELECT ... INTOクエリを使用し、最初のものは以前のようにSelectedFeedsテーブルを作成し、もう一つはそのテーブルに追加します。
ターゲットテーブルが既に作成されているかどうかを確認するには、Connection.GetSchemaを呼び出して、テーブルSelectedFeedsが存在する場合は行が存在するデータテーブル(スキーマ)を取得し、テーブルがない場合はテーブルを検索しません。
この時点で、実行する正しいステートメントでOleDbCommandを設定しました。

+1

ありがとう、私は特定のIDを持つFeedLibraryから選択します、それについてはどうですか? – SaraniO

+1

すべての権利が失われ、文字列連結の代わりにパラメータを使用することを追加しました(もちろん、IDフィールドはデータベース上の整数型であると仮定します) – Steve

+1

tnxもう一度私はあなたのコードを試しました。このテーブルにフィードは追加されず、例外は次のとおりです。{"テーブル 'SelectedFeeds'は既に存在します。} – SaraniO