2012-03-28 5 views
3

Ich mache eine .NET-Einheit als Teil meiner Studien. Ich habe gerade erst angefangen, mit einem Dozenten, der mir irgendwie nicht die beste Grundlage mit .NET gegeben hat, also entschuldige die Noobishness.Probleme bei der Abfrage von Access '07 Datenbank in C#

Ich mache eine ziemlich einfache und generische datenbankgestützte Anwendung. Ich verwende C# und ich greife auf eine Microsoft Access 2007-Datenbank zu.

Ich habe die Datenbank-ish Sachen in eine eigene Klasse mit den Methoden nur ausspucken OleDbDataAdapters, die ich für die commit verwenden. Ich füttere alle Methoden, die eine Abfrage ein DataSet-Objekt aus dem Hauptprogramm, in dem ich die Daten halte (mehrere Tabellen in der Datenbank).

Ich habe eine sehr generische private Methode gemacht, die ich verwende, um SQL SELECT-Abfragen durchzuführen und einige öffentliche Methoden haben, die diese Methode verpacken, um Produkte zu erhalten, orders.etc (es ist eine generische Verkaufsdatenbank).

Die generischen Verfahren verwenden eine separate Connect-Methode, um tatsächlich die Verbindung herzustellen, und es ist wie folgt:

private static OleDbConnection Connect() 
{ 
    OleDbConnection conn = new OleDbConnection(
     @"Provider=Microsoft.ACE.OLEDB.12.0; Data Source=C:\Temp\db.accdb"); 
    return conn; 
} 

Die generische Methode ist wie folgt:

private static OleDbDataAdapter GenericSelectQuery(
    DataSet ds, string namedTable, String selectString) 
{ 
    OleDbCommand oleCommand = new OleDbCommand(); 
    OleDbConnection conn = Connect(); 
    oleCommand.CommandText = selectString; 
    oleCommand.Connection = conn; 
    oleCommand.CommandType = CommandType.Text; 

    OleDbDataAdapter adapter = new OleDbDataAdapter(); 
    adapter.SelectCommand = oleCommand; 
    adapter.MissingSchemaAction = MissingSchemaAction.AddWithKey; 
    adapter.Fill(ds, namedTable); 

    return adapter; 
} 

Die Wrapper-Methoden nur passieren Entlang dem DataSet, das sie vom Hauptprogramm erhalten haben, ist die benannte Tabellenzeichenfolge der Name der Tabelle in der Datenmenge, und Sie geben die Abfrage weiter, die Sie vornehmen möchten.

Es spielt keine Rolle, welche Abfrage ich gebe es (auch etwas einfaches wie SELECT * FROM TableName) Ich bekomme immer noch eine OleDbException geworfen, dass es einen Fehler mit der FROM-Klausel der Abfrage gab. Ich habe gerade die Abfragen mit Access erstellt, aber es gibt immer noch keinen Nutzen. Offensichtlich stimmt etwas mit meinem Code nicht, was mich nicht wirklich überraschen würde.

Hier sind einige Wrapper-Methoden, die ich verwende.

public static OleDbDataAdapter GetOrderLines(DataSet ds) 
{ 
    OleDbDataAdapter adapter = GenericSelectQuery(
     ds, "orderlines", "SELECT OrderLine.* FROM OrderLine;"); 
    return adapter; 
} 

Sie sehen alle gleich aus, es ist nur die SQL ändert sich.

+1

Normalerweise stelle ich meine Verbindungen in einen 'using' Block, um das Schließen sicherzustellen. Scheint du sie nicht zu schließen?!? –

+4

Ein kurzer Gedanke ... Haben Sie versucht, die gleichen Abfragen für die Datenbank direkt in Access auszuführen? – TGH

+2

@Uwekeim Ich wusste nicht einmal über 'using' in C#. Das ist der Mangel an richtiger Grundlage, von der ich spreche. Wie für das Problem, stellt sich heraus, dass nur die eckigen Klammern um den Tabellennamen alles zu beheben. Alles funktioniert gut in Access, also habe ich keine Ahnung. Ich werde die Frage offiziell beantworten, wenn ich tatsächlich in der Lage bin; Angesichts meines guten Rufs kann ich es für weitere sechs Stunden nicht tun. –

Antwort

0

Eckige Klammern scheinen das Problem behoben zu haben. Es stellte sich heraus, dass ich ein Schlüsselwort verwendete. Hmpf.

0

Haben Sie versucht, etwas einfacher zu sehen, wenn Sie Konnektivität zu der Tabelle haben, die Sie suchen. So etwas wie

DataSet ds = new DataSet(); 
    using (OleDbConnection myConnection = new OleDbConnection 
     (@"Provider=Microsoft.ACE.OLEDB.12.0; Data Source=C:\Temp\db.accdb")) 
      { 
      myConnection.Open(); 
      OleDbDataAdapter myAdapter = new OleDbDataAdapter("SELECT OrderLine.* FROM OrderLine;, myConnection); 
      myAdapter.TableMappings.Add("Table", "TestTable"); 
      myAdapter.Fill(ds);    
      }      

dann von dort zu überprüfen, um zu sehen, ob Sachen in ds mit sind

ds.Tables[0].Rows.Count() 

Dies zeigen Ihnen eigentlich, wenn Sie die DB schlagen und das Erzielen von Ergebnissen. Von dort können Sie es eleganter machen

Verwandte Themen