C#

2016-04-12 6 views
2

bir erişim veritabanına bir datatable eklemek nasıl databaseC#

şimdi birinden table seçim ve başka biri ile eklemek istediğiniz bir erişim 2 table var.

bu benim kod ama doğrultusunda bir istisna gösterir Cmd.ExecuteNonQuery();

{ "sözdizimi hatası (eksik işleç) sorgu ifadesinde 'System.Object []'."}

Kod:

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

Bunu düzeltmek için ne yapmalıyım?

cevap

5

Hatanız, bir DataRow öğesinin ItemArray özelliğini bir dizeyle birleştirdiğinizden kaynaklanıyor. Bu durumda ItemArray (bir nesnenin [] örneğinin bir örneğidir), kendi değerlerinden otomatik olarak bir dize üreten ve böylece sınıf adını "object []" dizgesi olarak döndüren bir yönteme sahip değildir, ancak elbette bu, anlamsız sql dizesini üretir.

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

ama sadece datatables ve adaptörler ancak

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

kullanmadan sizin için her şeyi yapacağız bir SELECT .... INTO deyimi inşa edebileceğini, SELECT ... INTO deyimi hedef tablo oluşturur ama zaten hedef tablo halinde hata veriyor bulunmaktadır. Bu sorunu çözmek için hedefin mevcut olup olmadığını bulmamız gerekiyor. o yoksa aksi takdirde biz iki farklı sorgu var Burada 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]d"; 
// 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(); 
} 

kullanın ilk SELECT ... INTO sorguyu kullanmak, ilki daha önce olduğu gibi SelectedFeeds tablo oluşturmak, ikincisi ise bu tabloya ekler.
Hedef tablonun önceden oluşturulup oluşturulmadığını öğrenmek için Connection.GetSchema numaralı telefonu arayarak, tablo SelectedFeeds varsa bir satır varsa ve böyle bir tablo yoksa satır bulunmuyorsa bir datatable (şema) çağırın.
Bu noktada OleDbCommand'ı yürütmek için doğru ifadeyle ayarladım.

+1

Teşekkürler, belirli bir kimliğe sahip FeedLibrary içinden seçim yaptım, ne hakkında? – SaraniO

+1

Tamam, WHERE parçasını eksik ve dize birleştirme yerine bir parametre kullanarak ekledim (tablonun kimliğin veritabanında bir Tamsayı türü olduğunu varsayalım) – Steve

+1

tnx yine cod'ını denedim, ilk kez çalıştı (tablodan sonra ancak bu tabloya besleme eklenmez ve istisna şudur: {"Tablo 'SelectedFeeds' zaten var."} – SaraniO