2017-02-05 2 views
1

Ich arbeite mit einer vorhandenen Access 2010-Datenbank, die Tabellen und Abfragen ('Ansichten') enthält. Wenn ich die Datenbank von Visual Studio 2015 aus anschließe, können Tools wie der Database Explorer den Inhalt der Access-Tabellen anzeigen, aber für Abfragen, die LIKE-Operatoren mit '*' enthalten, werden nur die Headertitel mit Null angezeigt Aufzeichnungen.Wie Visual Studio 2015 mit Access 2010 funktioniert LIKE Wildcards

Ich fand, dass, wenn ich diese Access-basierten Abfragen in Visual Studio dupliziere aber die LIKE '*' Platzhalterzeichen mit '%' ersetzen, diese VS-basierten Abfragen arbeiten (sie geben Datensätze ungleich Null zurück).

Diese bestimmte Access-Datenbank ist voll von Abfragen mit '*' und es wäre schwierig, sie alle (z. B. zu ALIKE) zu ändern.

Gibt es eine Möglichkeit, Visual Studio-Tools in LIKE-Abfragen in dieser Datenbank mit dem '*' zu arbeiten? Vielleicht ein Parameter für die Verbindungszeichenfolge oder eine Eigenschaft in VS? Oder vielleicht gibt es etwas, das in der Datenbank selbst geändert werden kann (ein globaler Parameter)?

Das Ändern des Providers in VS von Microsoft.ACE.OLEDB.4.0 zu Microsoft.ACE.OLEDB.12.0 hatte keine Auswirkung. Die Datenbank ist anscheinend 04.00.0000 (Verbindungseigenschaften).

Meine Hoffnung ist es, eine C# Desktop-App zu erstellen, die auf diese Datenbank zugreifen kann (und ihre Abfragen, die diese '*' Wildcards haben).

Für Hintergrund auf der Wildcard Unverträglichkeit, siehe zum Beispiel LIKE query on an Access database via C# always returns COUNT(*) of 0

Vielen Dank für alle Ideen.

Antwort

1

Die integrierten Visual Studio-Datenbank-Tools verwenden normalerweise System.Data.OleDb für ihre Datenbankmanipulationen. Was Sie sehen, ist eine unglückliche Einschränkung des Access OLEDB-Anbieters.

für eine Access-Tabelle mit dem Namen [Früchte]

id fruit 
-- ----- 
1 apple 
2 banana 
3 cherry 
4 apricot 

und eine gespeicherte Access-Abfrage namens [qry_aFruits]

SELECT fruit 
FROM fruits 
WHERE fruit LIKE "a*"; 

folgende C# -Code System.Data.OleDb kehrt keine Zeilen

myConnectionString = 
     @"Provider=Microsoft.ACE.OLEDB.12.0;" + 
     @"Data Source=C:\Users\Public\Database1.accdb;"; 
using (var conn = new OleDbConnection(myConnectionString)) 
{ 
    conn.Open(); 
    using (var cmd = new OleDbCommand("SELECT * FROM [qry_aFruits]", conn)) 
    { 
     using (OleDbDataReader rdr = cmd.ExecuteReader()) 
     { 
      while (rdr.Read()) 
      { 
       Console.WriteLine(rdr["fruit"]); 
      } 
     } 
    } 
} 
mit

Derselbe Code, der System.Data.Odbc verwendet, gibt jedoch zwei Zeilen zurück, wie exp ektiert:

myConnectionString = 
     @"Driver={Microsoft Access Driver (*.mdb, *.accdb)};" + 
     @"Dbq=C:\Users\Public\Database1.accdb;"; 
using (var conn = new OdbcConnection(myConnectionString)) 
{ 
    conn.Open(); 
    using (var cmd = new OdbcCommand("SELECT * FROM [qry_aFruits]", conn)) 
    { 
     using (OdbcDataReader rdr = cmd.ExecuteReader()) 
     { 
      while (rdr.Read()) 
      { 
       Console.WriteLine(rdr["fruit"]); 
      } 
     } 
    } 
} 

Also, wenn Sie mit viel gespeichert Access-Abfragen arbeiten müssen, die * als LIKE Platzhalter verwenden dann werden Sie wahrscheinlich verzichten müssen die integrierte Visual Studio-Datenbank-Tools, die auf gebaut von System.Data.OleDb (z. B. Datenquellen und TableAdapters) und ODBC verwenden.

+0

Vielen Dank für Ihre gründliche und hilfreiche Antwort. – Baffin

+0

Für alle zukünftigen Leser: Meine db hat ein Passwort, daher musste ich zu den beiden oben erwähnten Verbindungszeichenfolgen folgendes hinzufügen: 'Jet OLEDB: Datenbankkennwort = xxxx' (für OLEDB) und 'PWD = xxxx' (für ODBC). – Baffin

1

Nein, es gibt keine solche Einstellung. Du wirst auf die eine oder andere Weise adoptieren müssen.

+0

Danke für diese Info. Ich werde wahrscheinlich alle Abfragen zu ALIKE ändern (damit ich die VS-Tools und -Komponenten verwenden kann). – Baffin

Verwandte Themen