Описание механизма взаимодействия приложений на 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
нашёл именно то что мне было нужно
СПАСИБО!
Спасибо, все понятно и именно то, что надо.
аналогично первому каменту — пасиб огромное!
Подскажите, пожалуйста, у меня 3 магазина, как мне автоматизировать учет товаров оптово-розничной сети. надо учитывать приход товара и его отгрузку. если можете на C#! спасибо за ранее.
В нашей сети один главный магазин, а остальные дочерние. если в одном магазине купили товар, то это можно проследить и в остальных.
вот такакя вот беда
Служебные данные 1 магазина
Служебные данные 2 магазина
Служебные данные 3 магазина
Каталог товаров
Если операторы территориально разнесены (учет прихода/отгрузки товара проводится в каждом магазине по отдельности), то для этого придется разрабатывать не на
вылетает с ошибкой (у меня) на строке
OleDbDataReader read = myOleDbCommand.ExecuteReader ();
хелп,пльз.
Какая именно ошибка?
В большинстве случаев эта конструкция не выполняется из-за ошибок в SQL-запросе.
Попробуйте сделать
try
{
OleDbDataReader read = myOleDbCommand.ExecuteReader ();
}
catch (Exception ex)
{
MessageBox.Show (ex.Message)
}
И скажите какое сообщение выдается.
У меня точно такая же ошибка как и у Баюна вот на этой строчке —
OleDbDataReader oldbr = oldbc.ExecuteReader ();
Название ошибки — «OleDbException was unhandled» «Несоответствие типов данных в выражении условия отбора»
Помогите разобраться.
Опять-же ошибка в запросе.
Проверьте правильность типов данных WHERE, а еще лучше покажите запрос.
написал ваш код а он то неработает)) вставил в С# 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 ["Договор.Оплата"]);
Так у Вас кавычки в выводимом тексте перекрывают кавычки-ограничители строки. Либо используйте внутри строк апострофы, либо экранируйте кавычки, либо делайте неинтерпретируемую строку (с @ в начале)
итак прочитав книгу Эндрю Троелсен 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";
сначало выделение ячейки памяти и только потом указание провайдера и пути
и возникла другая проблема, а точнее ошибка звучит она вот так 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 ();
OleDbCommand myCommand = new OleDbCommand ();
Вы создаете команду, не привязывая ее к соединению. Соответственно у Вас запрос выполняется не к открытой базе данных, а куда-то в никуда. Создавайте команду непосредственно от соединения:
OleDbCommand myCommand = myOleDbConnection.CreateCommand ();
А у меня падает при выполнении запроса вида:
yOleDbCommand->CommandText =
«SELECT ClName»+
«FROM Clients» +
«GROUP BY ClName»;
при том, что в самом аксесе запрос выполняется на ура.
Apx, что пишет?
Вобщем оледб ридер не получал результаты запроса, решил проблему переписав запрос. Как ни странно помогло о_О.
Ещё вопрос. Можно ли программно создавать новые таблицы, и получать информацию, из файла mdb, о существующих таблицах?
Создавать, естественно, можно, стандартным запросом 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
Проверить сам сейчас не могу. Отпишитесь, что получится.
Выдалось свободных пару часиков. Вобщем попытался с information schema. В трай кетче запускаю, и получаю что файл INFORMATION_SCHEMA.mdb не был найден.
С MSysObjects я считаю всё намного лучше. Видимо оно прочтёт, но exception выдаёт, что: «Записи немогут быть прочитаны; отсутсвует разрешение на чтение у MSysObjects».
Возможно где то ещё надо прописать логин пароль к базе, если есть. Ну или хотя бы залогиниться под MYSQLroot или как то так.
Решение проблемы тривиальное, но есть. Можно ещё просто создать таблицу, tables и когда надо записывать имя таблицы, но не хочется попросту хранить данные, которые уже есть где то в файле access
Ну вы блин даёте...
1)А как мне этим OleDbDataReader-ом наполнить
такую хрень как DataGrid?
Ведь в результатах может выползти не тоКА Адна стрАка?
2)Меня терзают смутные сомнения по поводу использования такой фигни как COMMIT и ROLLBACK.
Был бы счастлив взглянуть хотя бы одним глазком на примерчик из четырёх-пяти строк...
1) Примерно так:
2)
В Access их не использовал, поэтому ничего сказать не могу. Если есть чем поделиться по этому поводу — буду рад услышать.
здраствуйте , столкнулся с проблемой коннекта с бд. При подключении выдает ошибку
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);
......
Может чем поможете ?=)
Всё заработало с первого раза. Автору огромное спасибо!!!!!
наконец то нашёл то что было нужно))
А как открыть базу Access защищённую паролем 12345?
Нужно указать пароль от базы MS Access в строке подключения. Выглядеть это будет примерно так:
string connectionString =
«provider=Microsoft.Jet.OLEDB.4.0;» +
«data source=C:\data\dbase.mdb» +
«Password=12345»;