C# и БД MS Access

Описание механизма взаимодействия приложений на C# и файлов базы данных Microsoft Access.

Для соединения с базой данных MS Access (файл .mdb) в C# следует использовать класс OleDbConnection со следующими параметрами соединения:
provider=Microsoft.Jet.OLEDB.4.0;data source=databaseFile
Здесь databaseFile — абсолютный путь к файлу базы данных Access. Провайдер соединения должен иметь значение Microsoft.Jet.OLEDB.4.0.

Пример параметров соединения с файлом базы данных Microsoft Access:

string connectionString =
 "provider=Microsoft.Jet.OLEDB.4.0;" +
 "data source=C:\data\dbase.mdb";

Бэкслеши в пути файла следует заэскейпить (именно поэтому в примере вместо одного бекслеша поставлено по два).
Вышеупомянутую строку параметров соединения следует передать конструктору OleDbConnection из System.Data.OleDb:

OleDbConnection myOleDbConnection = new OleDbConnection(connectionString);

Ниже приведен листинг программы, которая подключается к базе данных клиентов в формате MS Access и выводит информацию по первому клиенту. Для отправки SQL-запросов и чтения их результатов здеь используются объекты OleDbCommand и OleDbDataReader.

/*
 dbMSAccess.cs
 Пример использования объекта OleDbConnection для работы с базой данных MS Access
*/

using System;
using System.Data;
using System.Data.OleDb;

class OleDbConnectionAccess
{
 public static void Main()
 {
 // Формируем строку с параметрами подключения к файлу базы данных
 string connectionString =
 "provider=Microsoft.Jet.OLEDB.4.0;" +
 "data source=C:\data\dbase.mdb";

 // создаем объект OleDbConnection для соединения с Бд и передаем его конструктору строку с параметрами подключения
 OleDbConnection myOleDbConnection = new OleDbConnection(connectionString);

 // создаем объект OleDbCommand
 OleDbCommand myOleDbCommand = myOleDbConnection.CreateCommand();

 // задаем SQL-запрос к базе данных в свойстве CommandText объекта OleDbCommand
 // Результатом запроса должны быть данные клинета с именем Кто-то
 myOleDbCommand.CommandText =
 "SELECT CompanyName, ContactName, Address "+
 "FROM Clients "+
 "WHERE ContactName = 'Кто-то'";
 // открываем соединение с БД с помощью метода Open() объекта OleDbConnection
 myOleDbConnection.Open();

 // создаем объект OleDbDataReader и вызываем метод ExecuteReader() для выполнения введенного SQL-запроса
 OleDbDataReader myOleDbDataReader = myOleDbCommand.ExecuteReader();

 // Читаем первую (в нашем случае - и единственную) строку ответа базы данных с помощью метода Read() объекта OleDbDataReader
 myOleDbDataReader.Read();

 // отображаем результат запроса

 Console.WriteLine("myOleDbDataReader[" CompanyName"] = "+
 myOleDbDataReader["CompanyName"]);
 Console.WriteLine("myOleDbDataReader[" ContactName"] = "+
 myOleDbDataReader["ContactName"]);
 Console.WriteLine("myOleDbDataReader[" Address"] = "+
 myOleDbDataReader["Address"]);

 // закрываем OleDbDataReader методом Close()
 myOleDbDataReader.Close();
 // закрываем соединение с БД
 myOleDbConnection.Close();
 }
}

Результатом работы программы будет следующий текст:

myOleDbDataReader["CompanyName"] = Кто-то и Компания
myOleDbDataReader["ContactName"] = Кто-то
myOleDbDataReader["Address"] = Улица Какая-то, д.12

Поблагодарить автора

27 Responses to C# и БД MS Access

  1. аналогично первому каменту — пасиб огромное!

  2. Подскажите, пожалуйста, у меня 3 магазина, как мне автоматизировать учет товаров оптово-розничной сети. надо учитывать приход товара и его отгрузку. если можете на C#! спасибо за ранее.

  3. В нашей сети один главный магазин, а остальные дочерние. если в одном магазине купили товар, то это можно проследить и в остальных.

    вот такакя вот беда

  4. если в одном магазине купили товар, то это можно проследить и в остальных

    Для этого Вам просто надо иметь единую базу данных товаров для каждого магазина. То есть база данных должна содержать примерно следующий список таблиц:

    Служебные данные 1 магазина

    Служебные данные 2 магазина

    Служебные данные 3 магазина

    Каталог товаров

    как мне автоматизировать учет товаров оптово-розничной сети. надо учитывать приход товара и его отгрузку. если можете на C#!

    Если операторы территориально разнесены (учет прихода/отгрузки товара проводится в каждом магазине по отдельности), то для этого придется разрабатывать не на

  5. вылетает с ошибкой (у меня) на строке

    OleDbDataReader read = myOleDbCommand.ExecuteReader ();

    хелп,пльз.

  6. Какая именно ошибка?

    В большинстве случаев эта конструкция не выполняется из-за ошибок в SQL-запросе.

    Попробуйте сделать

    try

    {

    OleDbDataReader read = myOleDbCommand.ExecuteReader ();

    }

    catch (Exception ex)

    {

    MessageBox.Show (ex.Message)

    }

    И скажите какое сообщение выдается.

  7. У меня точно такая же ошибка как и у Баюна вот на этой строчке —

    OleDbDataReader oldbr = oldbc.ExecuteReader ();

    Название ошибки — «OleDbException was unhandled» «Несоответствие типов данных в выражении условия отбора»

    Помогите разобраться.

  8. Опять-же ошибка в запросе.

    Проверьте правильность типов данных WHERE, а еще лучше покажите запрос.

  9. написал ваш код а он то неработает)) вставил в С# VS2008, правильность прослеживается до начала прописывания вывода на эран моего запроса там пишет чо нету скобочек и точки с запятыми когда логика синтаксиса прослеживается

    .

    myOleDbCommand.CommandText =

    «SELECT Банк_Реквизитов.Код_клиента, Банк_Реквизитов.Наименование_Банка, Договор.Ном_договора, Договор.Дата_закл, Договор.Стоимость, Договор.Объем, Договор.Оплата» +

    «FROM (Клиенты INNER JOIN Договор ON Клиенты.[Код_клиента] = Договор.[Код_клиента])» +

    «INNER JOIN Банк_Реквизитов ON Клиенты.[Код_клиента] = Банк_Реквизитов.[Код_клиента];»;

    myOleDbConnection.Open ();

    OleDbDataReader myOleDbDataReader =

    myOleDbCommand.ExecuteReader ();

    myOleDbDataReader.Read ();

    Console.WriteLine ("myOleDbDataReader[" Банк_Реквизитов.Код_клиента"]= "+ myOleDbDataReader ["Банк_Реквизитов.Код_клиента"]);

    Console.WriteLine ("myOleDbDataReader[" Банк_Реквизитов.Наименование_Банка"]= "+ myOleDbDataReader ["Банк_Реквизитов.Наименование_Банка"]);

    Console.WriteLine ("myOleDbDataReader[" Договор.Ном_договора"]= "+ myOleDbDataReader ["Договор.Ном_договора"]);

    Console.WriteLine ("myOleDbDataReader[" Договор.Дата_закл"]= "+ myOleDbDataReader ["Договор.Дата_закл"]);

    Console.WriteLine ("myOleDbDataReader[" Договор.Стоимость"]= "+ myOleDbDataReader ["Договор.Стоимость"]);

    Console.WriteLine ("myOleDbDataReader[" Договор.Объем"]= "+ myOleDbDataReader ["Договор.Объем"]);

    Console.WriteLine ("myOleDbDataReader[" Договор.Оплата"]= "+ myOleDbDataReader ["Договор.Оплата"]);

  10. Так у Вас кавычки в выводимом тексте перекрывают кавычки-ограничители строки. Либо используйте внутри строк апострофы, либо экранируйте кавычки, либо делайте неинтерпретируемую строку (с @ в начале)

  11. итак прочитав книгу Эндрю Троелсен C# и платформа NET.

    До моих извилин дошло. что ваше соединение с базой слегка неверно из-за чего у меня постоянно выдавал ошибку что мол данные не сходятся на 51 строке и показывал строку заполнения ячейки памяти

    OleDbConnection myOleDbConnection = new OleDbConnection (connectionString);

    сравнив коды я понял в чем ошибка вот ее фикс

    OleDbConnection cn = new OleDbConnection ();

    cn.ConnectionString = «provider=Microsoft.Jet.OLEDB.4.0;» +

    @"data source = D:\fata\abase.mdb";

    сначало выделение ячейки памяти и только потом указание провайдера и пути

  12. и возникла другая проблема, а точнее ошибка звучит она вот так ExecuteReader: Свойство Connection не инициализировано.

    я понимаю что свойство Connection нужно как-то инициализировать, но вот как =)

    вот мой код когда действую в открытом соединении.

    cn.Open ();

    OleDbCommand myCommand = new OleDbCommand ();

    myCommand.CommandText = «SELECT Наименование_организации, Код_клиента, Адрес» +

    «FROM Клиенты» +

    «WHERE Код_клиента = '2'»;

    OleDbDataReader myDataReader;

    myDataReader = myCommand.ExecuteReader ();

    myDataReader.Read ();

    {

    Console.WriteLine («Клиент под номером 2,» + myDataReader["Наименование_организации"] + myDataReader["Код_клиента"] + myDataReader["Адрес"].ToString ());

    }

    myDataReader.Close ();

    cn.Close ();

  13. OleDbCommand myCommand = new OleDbCommand ();

    Вы создаете команду, не привязывая ее к соединению. Соответственно у Вас запрос выполняется не к открытой базе данных, а куда-то в никуда. Создавайте команду непосредственно от соединения:

    OleDbCommand myCommand = myOleDbConnection.CreateCommand ();

  14. А у меня падает при выполнении запроса вида:

    yOleDbCommand->CommandText =

    «SELECT ClName»+

    «FROM Clients» +

    «GROUP BY ClName»;

    при том, что в самом аксесе запрос выполняется на ура.

  15. Вобщем оледб ридер не получал результаты запроса, решил проблему переписав запрос. Как ни странно помогло о_О.

    Ещё вопрос. Можно ли программно создавать новые таблицы, и получать информацию, из файла mdb, о существующих таблицах?

  16. Создавать, естественно, можно, стандартным запросом CREATE TABLE.

    Насчет второго вопроса не уверен, но должно быть что-то вроде

    SELECT * FROM INFORMATION_SCHEMA.TABLES WHERE TABLE_TYPE = 'BASE TABLE'

    или

    SELECT Name FROM MSysObjects WHERE (((MSysObjects.Flags)=0) AND ((MSysObjects.Type)=1)) ORDER BY MSysObjects.Name

    There is an owner in the database called INFORMATION_SCHEMA who has a bunch of objects that will be of interest to you. There are INFORMATION_SCHEMA tables, columns, procs, and just a ton of stuff.

    Проверить сам сейчас не могу. Отпишитесь, что получится.

    forums.whirlpool.net.au/f...cfm/523219.html

    www.devx.com/tips/Tip/25270

  17. Выдалось свободных пару часиков. Вобщем попытался с information schema. В трай кетче запускаю, и получаю что файл INFORMATION_SCHEMA.mdb не был найден.

    С MSysObjects я считаю всё намного лучше. Видимо оно прочтёт, но exception выдаёт, что: «Записи немогут быть прочитаны; отсутсвует разрешение на чтение у MSysObjects».

    Возможно где то ещё надо прописать логин пароль к базе, если есть. Ну или хотя бы залогиниться под MYSQLroot или как то так.

    Решение проблемы тривиальное, но есть. Можно ещё просто создать таблицу, tables и когда надо записывать имя таблицы, но не хочется попросту хранить данные, которые уже есть где то в файле access

  18. Ну вы блин даёте...

    1)А как мне этим OleDbDataReader-ом наполнить

    такую хрень как DataGrid?

    Ведь в результатах может выползти не тоКА Адна стрАка?

    2)Меня терзают смутные сомнения по поводу использования такой фигни как COMMIT и ROLLBACK.

    Был бы счастлив взглянуть хотя бы одним глазком на примерчик из четырёх-пяти строк...

  19. 1) Примерно так:

    OleDbDataReader reader = command.ExecuteReader ();

    while (reader.Read ())

    grid.Items.Add (reader["row1"],reader["row2"]);

    2) msdn.microsoft.com/en-us/...ry/ms190295.aspx

    msdn.microsoft.com/en-us/...ry/ms181299.aspx

    В Access их не использовал, поэтому ничего сказать не могу. Если есть чем поделиться по этому поводу — буду рад услышать.

  20. здраствуйте , столкнулся с проблемой коннекта с бд. При подключении выдает ошибку

    System.IO.FileNotFoundException: Невозможно загрузить файл или сборку «System.EnterpriseServices, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a» или один из зависимых от них компонентов. Не удается найти указанный файл.

    Имя файла: «System.EnterpriseServices, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a» ---> System.IO.FileNotFoundException: Не удается найти указанный файл. (Исключение из HRESULT: 0×80070002)

    Вот код , вроде бы все так же как в примере

    ...

    string stringcom = «INSERT INTO tab SELECT * FROM tab»;

    OleDbConnection cn = new OleDbConnection ();

    cn.ConnectionString = «provider=Microsoft.Jet.OLEDB.4.0;» + @"data source = c:\db1.mdb";

    cn.Open ();

    OleDbCommand cm = new OleDbCommand (stringcom, cn);

    ......

    Может чем поможете ?=)

  21. Нужно указать пароль от базы MS Access в строке подключения. Выглядеть это будет примерно так:

    string connectionString =

    «provider=Microsoft.Jet.OLEDB.4.0;» +

    «data source=C:\data\dbase.mdb» +

    «Password=12345»;

Оставить комментарий

Your email address will not be published. Required fields are marked *

*

You may use these HTML tags and attributes: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <strike> <strong>