C# и БД MS Access

Категория: C# , SQL , Венда Комментариев: 25

Описание механизма взаимодействия приложений на 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

Автор: Кто-то   @   28 января 2009 Комментариев: 25
Метки : , ,

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

Webmoney Z163628999150, R617151845974

Комментариев: 25

Комментарии
марта 11, 2009
22:35
#1 allenn :

нашёл именно то что мне было нужно

СПАСИБО!

Апр 26, 2009
14:40
#2 Scorpion :

Спасибо, все понятно и именно то, что надо.

мая 18, 2009
22:48
#3 yevda :

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

мая 24, 2009
18:17
#4 Marishka :

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

мая 24, 2009
18:54
#5 Marishka :

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

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

Автор мая 24, 2009
19:58
#6 Кто-то :

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

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

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

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

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

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

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

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

июня 4, 2009
18:07
#7 баюн :

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

OleDbDataReader read = myOleDbCommand.ExecuteReader ();

хелп,пльз.

Автор июня 5, 2009
20:56
#8 Кто-то :

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

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

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

try

{

OleDbDataReader read = myOleDbCommand.ExecuteReader ();

}

catch (Exception ex)

{

MessageBox.Show (ex.Message)

}

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

Ноя 26, 2009
1:13

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

OleDbDataReader oldbr = oldbc.ExecuteReader ();

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

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

Автор Ноя 26, 2009
22:48
#10 Кто-то :

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

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

Дек 6, 2009
11:51
#11 CATgamer :

написал ваш код а он то неработает)) вставил в С# 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 ["Договор.Оплата"]);

Автор Дек 6, 2009
22:40
#12 Кто-то :

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

Дек 7, 2009
21:57
#13 CATgamer :

итак прочитав книгу Эндрю Троелсен 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";

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

Дек 7, 2009
22:50
#14 CATgamer :

и возникла другая проблема, а точнее ошибка звучит она вот так 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 ();

Автор Дек 9, 2009
19:20
#15 Кто-то :

OleDbCommand myCommand = new OleDbCommand ();

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

OleDbCommand myCommand = myOleDbConnection.CreateCommand ();

Дек 17, 2009
22:13
#16 Apx :

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

yOleDbCommand->CommandText =

«SELECT ClName»+

«FROM Clients» +

«GROUP BY ClName»;

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

Автор Дек 18, 2009
19:44
#17 Кто-то :

Apx, что пишет?

Дек 21, 2009
23:48
#18 Apx :

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

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

Автор Дек 22, 2009
15:25
#19 Кто-то :

Создавать, естественно, можно, стандартным запросом 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

Дек 25, 2009
11:00
#20 Apx :

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

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

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

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

Янв 14, 2010
21:44

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

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

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

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

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

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

Автор Янв 14, 2010
22:07
#22 Кто-то :

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 их не использовал, поэтому ничего сказать не могу. Если есть чем поделиться по этому поводу — буду рад услышать.

марта 21, 2010
15:21
#23 cold :

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

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);

......

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

Ноя 24, 2010
23:17
#24 Prophenation :

Всё заработало с первого раза. Автору огромное спасибо!!!!! :D

марта 20, 2011
2:16
#25 arenoros :

наконец то нашёл то что было нужно))

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

Предыдущая запись
«
Следующая запись
»