2012-03-27 7 views
4

Gefunden sehr seltsames Verhalten der MS Access-Datenbank beim Ausführen von Abfragen von C#. Es scheint, dass, wenn die Abfrage in MS Access eine "like" -Anweisung enthält, das Ergebnis nicht an Oledb zurückgegeben wird. Wenn jemand weiß, wie das zu lösen ist, werde ich sehr dankbar sein. C# -Code:Ausführen von MS Access gespeicherten Abfrage von C#

DataTable GetAccessData(string FileName, string Password) 
    { 
     Query = "select * from [qry_1]"; 
     DataTable DT = access2dt 
      (
      FileName,Password,Query); 

     MessageBox.Show(Query); 
     if (DT == null || DT.Rows.Count <= 1) throw new Exception("Data not found"); 
     else return DT; 
    } 

public static DataTable access2dt(string filename, string password, string query) 
{ 
    string conString = @"Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" + filename + ";Jet OLEDB:Database Password=" + password; 
    OleDbConnection mycon; 
    mycon = new OleDbConnection(conString); 

    if (mycon.State == ConnectionState.Closed) 
    { 
     mycon.Open(); 
    } 
    try 
    { 
     OleDbCommand accessCommand = new OleDbCommand(); 
     System.Data.DataTable dt = new System.Data.DataTable(); 
     accessCommand = new OleDbCommand(query, mycon); 

     using (OleDbDataReader myReader = accessCommand.ExecuteReader()) 
     { 
      DataTable myTable = new DataTable(); 
      myTable.Load(myReader); 
      return myTable; 
     } 
    } 
    finally 
    { 
     mycon.Close(); 
    } 

} 

und Abfrage [qry_1] gespeichert in MS Access-Datenbank wie folgt aussieht:

SELECT tbl_MAPPING_GICM_AoA.[Type of expense] 
FROM tbl_USGAAP_ALL_TRANS, tbl_MAPPING_GICM_AoA 
WHERE tbl_USGAAP_ALL_TRANS.[Account]=[tbl_MAPPING_GICM_AoA].[Natural Account] 
AND tbl_USGAAP_ALL_TRANS.[Created By] NOT IN (SELECT [Created by/User ID] FROM tbl_GICM_AoA_EXCL_FACTOR1) 
AND tbl_USGAAP_ALL_TRANS.[Je Source] NOT IN (SELECT [JE SOURCE] FROM tbl_GICM_AoA_EXCL_FACTOR2) 
AND tbl_USGAAP_ALL_TRANS.[Je Category] NOT IN (SELECT [JE CATEGORY] FROM tbl_GICM_AoA_EXCL_FACTOR3) 
AND (tbl_USGAAP_ALL_TRANS.[Account] LIKE '4*' OR tbl_USGAAP_ALL_TRANS.[Account] LIKE '5*' OR tbl_USGAAP_ALL_TRANS.[Account] LIKE '6*') 

Also, wenn ich es in Access ausführen funktioniert es ganz gut, aber wenn ich nenne diese Abfrage von C# Ich bekomme die Ausnahme "Daten nicht gefunden". Wenn ich die letzte Zeichenfolge (mit LIKE) in der Abfrage lösche, fängt alles an zu arbeiten

Antwort

6

Versuchen Sie, das Platzhalterzeichen zu ersetzen. Access verwendet '*', aber mit OLEDB müssen Sie '%' als Platzhalter verwenden.

+0

Es hat funktioniert! Jetzt funktioniert die Abfrage in Access zwar nicht, aber das ist mir egal. Vielen Dank! – Vadim

+0

@Vadim Gern geschehen. –