2016-04-12 83 views
2

我有2 table在訪問database如何插入一個DataTable到Access數據庫在C#

現在我想從一個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[])"; 

但是你可以簡單地建立一個SELECT .... INTO聲明,會爲你做的一切,而無需使用數據表和適配器

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

在這裏,我們有兩個不同的查詢,第一個是之前創建SelectedFeeds表,第二個追加到該表。
要發現目標表是否已經創建,我呼叫Connection.GetSchema檢索一個數據表(模式),如果表SelectedFeeds存在表中存在一行,或者如果沒有這樣的表,則沒有行。
在這一點上,我設置OleDbCommand與正確的語句執行。

+1

謝謝,我從具有特定ID的FeedLibrary中選擇,那該怎麼辦? – SaraniO

+1

所有權利添加了WHERE部分丟失和使用參數,而不是字符串連接(當然,我假設ID字段是數據庫上的整數類型) – Steve

+1

tnx再次我試着你的鱈魚,第一次它的工作(它crated表格),但在此之後,提要不會添加到此表格,例外情況是:{「Table'SelectedFeeds'已存在。」} – SaraniO

相關問題