2017-02-05 7 views
1

Я работаю с существующей базой данных Access 2010, содержащей таблицы и запросы («виды»).Как заставить Visual Studio 2015 работать с шаблонами LIKE Access 2010 LIKE

Когда я соединяю базу данных с Visual Studio 2015, такие инструменты, как Проводник базы данных, могут видеть содержимое таблиц Access, но для запросов, которые содержат LIKE-операторы с «*» подстановочными знаками, он видит только заголовки заголовков, с нулевым значением записей.

Я обнаружил, что если я дублирую эти запросы на основе доступа в Visual Studio, но заменяю символы LIKE '*' на «%», эти запросы на основе VS работают (они возвращают ненулевые записи).

Эта конкретная база данных доступа заполнена запросами «*», и было бы сложно изменить их все (например, ALIKE).

Есть ли способ заставить инструменты Visual Studio работать с «*» в запросах LIKE в этой базе данных? Возможно, параметр в строке соединения или свойство в VS? Или, может быть, есть что-то, что можно изменить в самой базе данных (глобальный параметр)?

Изменение поставщика в VS от Microsoft.ACE.OLEDB.4.0 до Microsoft.ACE.OLEDB.12.0 не повлияло. База данных, по-видимому, 04.00.0000 (Свойства подключения).

Моя надежда состоит в том, чтобы создать настольное приложение C#, которое может получить доступ к этой базе данных (и к ее запросам с этими «*» подстановочными знаками).

Для фона на подстановочные несовместимости, смотри, например LIKE query on an Access database via C# always returns COUNT(*) of 0

Спасибо за любые идеи.

ответ

1

Средство для создания базы данных Visual Studio имеет тенденцию использовать System.Data.OleDb для обработки их базы данных. То, что вы видите, является неудачным ограничением поставщика доступа OLEDB.

для таблицы доступа с именем [фрукты]

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

и доступ сохраненный запрос с именем [qry_aFruits]

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

следующие C# код с помощью System.Data.OleDb возвращает строк

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"]); 
      } 
     } 
    } 
} 

Однако тот же код с использованием System.Data.Odbc возвращает две строки, как exp ected:

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"]); 
      } 
     } 
    } 
} 

Так что, если вам нужно работать с большим количеством сохраненных запросов доступа, которые используют * как LIKE шаблона, то вам, возможно, придется отказаться от встроенных инструментов базы данных Visual Studio, которые построены на вершине из System.Data.OleDb (например, Источники данных и TableAdapters) и использовать ODBC.

+0

Спасибо за ваш тщательный и полезный ответ. – Baffin

+0

Для будущих читателей: у моего db есть пароль, поэтому мне пришлось добавить следующие две строки соединения, упомянутые выше: «Jet OLEDB: пароль базы данных = xxxx» (для OLEDB) и «PWD = xxxx» (для ODBC). – Baffin

1

Нет, такой установки нет. Вам придется принять тот или иной путь.

+0

Благодарим за информацию. Я, вероятно, в конечном итоге изменим все запросы на ALIKE (чтобы я мог использовать VS-инструменты и компоненты VS). – Baffin