Форум программистов, компьютерный форум, киберфорум
Наши страницы
C#: Базы данных, ADO.NET
Войти
Регистрация
Восстановить пароль
 
Рейтинг 4.57/7: Рейтинг темы: голосов - 7, средняя оценка - 4.57
Елена01
0 / 0 / 0
Регистрация: 02.12.2012
Сообщений: 19
1

Как подключиться к базе данных Access

24.03.2015, 20:01. Просмотров 1349. Ответов 12
Метки нет (Все метки)

Здравствуйте. Помогите решить задачу с подключением БД, созданной в Access2007. Проблема в том, что среда ошибку не выдаёт и не выводит данные в listBox и listView. Скорее всего, БД не подключается, как мне кажется. Но я не знаю, как это исправить.
Вот код программы для Form3, в которой располагаются listBox и listView:

C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Data.OleDb;    // пространство имён для работы с БД
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;
 
public partial class Form3 : Form
    {
        OleDbDataReader dataReader;           // Объявление объекта dataReader
        OleDbConnection conn = null;          // Объявление соединения conn         
 
        public Form3()
        {
            InitializeComponent();
                                 
            // создание и инициализация команды
            OleDbCommand myCommand = new OleDbCommand("SELECT * FROM Неизменяемые_параметры", conn);
 
            try
            {
                string source = @"Provider=Microsoft.ACE.OLEDB.12.0;" +
                    @"Data Source=C:\Users\KIP OSV2\Documents\Елена\Программа\Test_application\Test_application\DBdevicesKIP.accdb";
                // новое соединение с БД
                conn = new OleDbConnection(source);
                // открытие соединения
                conn.Open();                
                dataReader = myCommand.ExecuteReader();
                while (dataReader.Read())
                {
                    // Создаём переменные, получаем для них значения из объекта dataReader,
                    // используя метод GetТипДанных
                    long Number = dataReader.GetInt64(0);
                    string Name = dataReader.GetString(1);
                    string Inv_number = dataReader.GetString(2);
                    // Выводим данные в элемент listBox1
                    listBox1.Items.Add("Порядковый номер: " + Number + "Название прибора: " + Name + "Инвентарный номер: " + Inv_number);
                    // Создаём экземпляр item класса ListViewItem для записи в него данных из dataReader
                    ListViewItem item = new ListViewItem(new string[] { Convert.ToString(dataReader[0]),
                            Convert.ToString(dataReader[1]), Convert.ToString(dataReader[2])});
                    listView1.Items.Add(item);                    
                }
                // Закрытие ридера
                dataReader.Close();
            }
            catch (Exception ex)
            {
                MessageBox.Show(ex.ToString());
            }
            finally
            {                
                // закрытие соединения
                conn.Close();
            }
        }
Вот что я пробовала для решения этой проблемы:
1) Создала новый проект с одной формой, куда и выводила данные. Там выходила ошибка, указывающая на строку:
conn.Open();
Здесь я и решила, что просто БД не подключается в моём проекте. Но вот почему – не знаю.
2) Нашла на одном форуме совет: изменить платформу для компиляции проекта на х86. Изменила (Сборка -> Диспетчер конфигураций -> Активная платформа решения). Ничего не изменилось. Всё по-прежнему не работает.
3) Нашла на другом форуме инициализацию БД другим способом, вот пример:

C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
//using System.Linq;
using System.Text;
using System.Windows.Forms;
using System.Data.OleDb;
 
namespace Kypca4
{
    public partial class Ud_Buf : Form
    {
        OleDbConnectionStringBuilder bldr;
        OleDbConnection cn;
        public Ud_Buf()
        {
            InitializeComponent();
            bldr = new OleDbConnectionStringBuilder();
            bldr.DataSource = Data.str;
            bldr.Provider = "Microsoft.ACE.OLEDB.12.0";
Написано, что это для Access2007. Подскажите, как подключить БД таким способом + комментарии к коду, т.к. впервые работаю с БД в C# и многого не знаю.
Кто-нибудь дайте дельный совет! Заранее спасибо
0
Лучшие ответы (1)
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
24.03.2015, 20:01
Ответы с готовыми решениями:

Как подключиться к базе данных Access на хостинге?
подключение_кБазеДанных = new OleDbConnection(@"Data Source =...

Как подключиться к базе данных
Доброго времени суток друзья, хочу подключить Oracle DataBase к С # , для начало просто бы...

Как подключиться к Базе данных денвера
Установил денвер. В phpMyAdmin создал базу данных Museum2. Есть код, чтобы вывести все записи из...

Как подключиться к локальной базе данных .mdf?
Знаю, как подключиться к БД, которая создана в MS SQL. Но вот как подключиться к локальной БД я не...

Как подключиться к базе данных MySQL на хостинге
Как подключиться к базе данных? База данных MySQL на хостинге?

12
Fene4ka_
102 / 102 / 40
Регистрация: 24.01.2014
Сообщений: 1,244
25.03.2015, 12:56 2
Елена01, попробуйте использовать другой драйвер
C#
1
2
_connString = @"Provider=Microsoft.Jet.OLEDB.4.0; 
                        Data Source=" + Path;
1
Елена01
0 / 0 / 0
Регистрация: 02.12.2012
Сообщений: 19
25.03.2015, 19:10  [ТС] 3
Попробую, напишу, что получилось.
0
Елена01
0 / 0 / 0
Регистрация: 02.12.2012
Сообщений: 19
26.03.2015, 19:53  [ТС] 4
Попробовала, как вы и писали. При этом я создала новое приложение с одной формой, на которой разместила listBox и listView. Ниже – код нового приложения:

C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Data.OleDb;    // пространство имён для работы с БД
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;
 
namespace WindowsFormsApplication1
{
    public partial class Form1 : Form
    {
        OleDbDataReader dataReader;           // Объявление объекта dataReader       
 
        public Form1()
        {
            InitializeComponent();
 
            OleDbConnection conn = null;          // Объявление соединения conn 
            OleDbCommand myCommand = new OleDbCommand("SELECT * FROM Неизменяемые_параметры", conn);
 
            try
            {
                string source = @"Provider=Microsoft.Jet.OLEDB.4.0; Data Source=C:\Users\KIP OSV2\Documents\Елена\Программа\WindowsFormsApplication1\WindowsFormsApplication1\DBdevicesKIP.mdb";
                // новое соединение с БД
                conn = new OleDbConnection(source);
                // открытие соединения
                conn.Open();                
                dataReader = myCommand.ExecuteReader();
                while (dataReader.Read())
                {
                    // Создаём переменные, получаем для них значения из объекта dataReader,
                    // используя метод GetТипДанных
                    long Number = dataReader.GetInt64(0);
                    string Name = dataReader.GetString(1);
                    string Inv_number = dataReader.GetString(2);
                    // Выводим данные в элемент listBox1
                    listBox1.Items.Add("Порядковый номер: " + Number + "Название прибора: " + Name + "Инвентарный номер: " + Inv_number);
                    // Создаём экземпляр item класса ListViewItem для записи в него данных из dataReader
                    ListViewItem item = new ListViewItem(new string[] { Convert.ToString(dataReader[0]),
                            Convert.ToString(dataReader[1]), Convert.ToString(dataReader[2])});
                    listView1.Items.Add(item);                    
                }
                // Закрытие ридера
                dataReader.Close();
            }
            catch (Exception ex)
            {
                MessageBox.Show(ex.ToString());
            }
            finally
            {                
                // закрытие соединения
                conn.Close();
            }
        }
    }
}
При этом выходит следующая ошибка (см. прикреплённый скриншот).

Строка 32:
dataReader = myCommand.ExecuteReader();

Насколько я понимаю, ошибка указывает на то, что БД не подключена. В чём здесь может быть причина?
0
Миниатюры
Как подключиться к базе данных Access  
insite2012
Модератор
Эксперт .NET
4878 / 3831 / 1096
Регистрация: 12.10.2013
Сообщений: 11,101
Записей в блоге: 2
26.03.2015, 20:29 5
Цитата Сообщение от Елена01 Посмотреть сообщение
Насколько я понимаю
Вы не верно понимаете. Вам ошибка все говорит, там черным по белому написано, что свойство Connection не инициализированно.
0
Елена01
0 / 0 / 0
Регистрация: 02.12.2012
Сообщений: 19
27.03.2015, 16:53  [ТС] 6
Именно, я не понимаю. Поэтому и пишу на этом форуме.
Тогда объясните мне, какое это свойство Connection не инициализировано?
0
kodv
1425 / 1098 / 344
Регистрация: 11.04.2011
Сообщений: 2,606
Завершенные тесты: 1
27.03.2015, 17:50 7
Елена01, вы сильно много не понимаете ... Нужно пытаться разбираться.
C#
1
2
 OleDbConnection conn = null;          // Объявление соединения conn 
OleDbCommand myCommand = new OleDbCommand("SELECT * FROM Неизменяемые_параметры", conn);
Здесь вы передаете в комманду null, вместо коннекшна, так как conn = null. В результате вы и получаете исключение о неинициализированном соединении. Создавайте команду после того, как создаете соединение.
1
Елена01
0 / 0 / 0
Регистрация: 02.12.2012
Сообщений: 19
30.03.2015, 17:03  [ТС] 8
Я поняла, где была моя ошибка. Исправила её. Всё заработало) Но теперь я поняла, что меня волнует совсем другое. Я не могу получить информацию из БД из дочернего окна моего приложения, а не из главного. В главное окно – форму 1- выводится информация (см. 1-ый скриншот). Далее при двойном клике мыши по рисунку (выходит соответствующая подсказка) (см. скриншот 2) появляется форма 2 с рисунками (см. скриншот 3). И при нажатии кнопкой маши на первом рисунке – задвижке – появляется следующая форма (см. скриншот 4), в которую должна выводиться информация из БД о задвижке. Но она не выводится! И не возникает никакой ошибки при запуске этого проекта. Что здесь не так? Ведь форма 1 свидетельствует о том, что к БД можно подключиться и информация из неё доступна. Почему то же самое не получается сделать для формы 3? Ниже привела код программы для 1-ой и 3-ей форм:

C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Data.OleDb;    // пространство имён для работы с БД
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;
 
namespace Test_application
{
    public partial class Form1 : Form
    {
        OleDbDataReader dataReader;           // Объявление объекта dataReader      
 
        public Form1()
        {
            InitializeComponent();
 
            OleDbConnection conn = null;          // Объявление соединения conn
 
            try
            {               
                string source = @"Provider=Microsoft.ACE.OLEDB.12.0;" +
                    @"Data Source=C:\Users\KIP OSV2\Documents\Елена\Программа\Test_application\Test_application\DBdevicesKIP.accdb";
                // новое соединение с БД
                conn = new OleDbConnection(source);
                // открытие соединения
                conn.Open();
                // создание и инициализация команды
                OleDbCommand myCommand = new OleDbCommand("SELECT * FROM Неизменяемые_параметры", conn);
                dataReader = myCommand.ExecuteReader();
                while (dataReader.Read())
                {
                    // Создаём переменные, получаем для них значения из объекта dataReader,
                    // используя метод GetТипДанных
                    long Number = dataReader.GetInt32(0);
                    string Name = dataReader.GetString(1);
                    string Inv_number = dataReader.GetString(2);
                    // Выводим данные в элемент listBox1
                    listBox1.Items.Add("Порядковый номер: " + Number);
                    listBox1.Items.Add("Название прибора: " + Name);
                    listBox1.Items.Add("Инвентарный номер: " + Inv_number);
                    listBox1.Items.Add(" ");
                }
                // Закрытие ридера
                dataReader.Close();
            }
            catch (Exception ex)
            {
                MessageBox.Show(ex.ToString());
            }
            finally
            {
                // закрытие соединения
                conn.Close();
            }
        }
 
        private void Form1_Load(object sender, EventArgs e)
        {
            toolTip1.SetToolTip(pictureBox1, "Дважды щёлкните на данный объект," + "\n" + "чтобы получить информацию о приборах," + "\n" + "расположенных в нём");
        }
 
        private void pictureBox1_MouseDoubleClick(object sender, MouseEventArgs e)
        {
            Form2 f2 = new Form2(this);
            f2.Show();
        }
    }
}
Код для формы 3:

C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Data.OleDb;    // пространство имён для работы с БД
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;
 
namespace Test_application
{
    public partial class Form3 : Form
    {
        OleDbDataReader dataReader;           // Объявление объекта dataReader          
 
        public Form3()
        {
            InitializeComponent();
 
            OleDbConnection conn = null;          // Объявление соединения conn
 
            try
            {
                string source = @"Provider=Microsoft.ACE.OLEDB.12.0;" +
                    @"Data Source=C:\Users\KIP OSV2\Documents\Елена\Программа\Test_application\Test_application\DBdevicesKIP.accdb";
                // новое соединение с БД
                conn = new OleDbConnection(source);
                // открытие соединения
                conn.Open();
                // создание и инициализация команды
                OleDbCommand myCommand = new OleDbCommand("SELECT * FROM Неизменяемые_параметры", conn);
                dataReader = myCommand.ExecuteReader();
                while (dataReader.Read())
                {
                    // Создаём переменные, получаем для них значения из объекта dataReader,
                    // используя метод GetТипДанных
                    long Number = dataReader.GetInt32(0);
                    string Name = dataReader.GetString(1);
                    string Inv_number = dataReader.GetString(2);
                    // Выводим данные в элемент listBox1
                    listBox1.Items.Add("Порядковый номер: " + Number);
                    listBox1.Items.Add("Название прибора: " + Name);
                    listBox1.Items.Add("Инвентарный номер: " + Inv_number);
                    listBox1.Items.Add(" ");
                }
                // Закрытие ридера
                dataReader.Close();
            }
            catch (Exception ex)
            {
                MessageBox.Show(ex.ToString());
            }
            finally
            {
                // закрытие соединения
                conn.Close();
            }
        }
 
        private Form2 _f2;               
        public Form3 (Form2 f2)
        {
            InitializeComponent();
            _f2 = f2;
        }
    }
}
0
Миниатюры
Как подключиться к базе данных Access   Как подключиться к базе данных Access   Как подключиться к базе данных Access  

Как подключиться к базе данных Access  
Fene4ka_
102 / 102 / 40
Регистрация: 24.01.2014
Сообщений: 1,244
30.03.2015, 17:13 9
а зачем вы в формах дублируете код ? для чего по-вашему был придуман ООП ?
не проще ли либо в 1 форме вообще не работать с базой либо просто во вторую форму передавать источник данных ? 1 строчку кода дебажить куда легче чем 30
0
kodv
1425 / 1098 / 344
Регистрация: 11.04.2011
Сообщений: 2,606
Завершенные тесты: 1
30.03.2015, 17:22 10
Елена01, что же вы помелолчились? Выкладывали бы тогда код и второй формы тоже! У вас в 3-ей форме 2 конструктора, которые делают абмолютно разные вещи. Один заполняет listBox, а второй задает ссылку на вторую форму. Какой из этих конструкторов вы используете для создания своей третьей формы?
0
Елена01
0 / 0 / 0
Регистрация: 02.12.2012
Сообщений: 19
30.03.2015, 19:31  [ТС] 11
Я в 1-ой форме и не буду работать с базой данных. Я это сделала для проверки работоспособности listbox'а, передаются туда данные из БД или нет. Этого объекта вообще там не будет. У меня же вообще ничего не получалось до этого.

Добавлено через 4 минуты
3-я форма у меня появляется при одном клике на определённую картинку во 2-ой форме.

Добавлено через 3 минуты
Код из 3-ей формы:

C#
1
2
3
4
5
private void pictureBox1_MouseClick(object sender, MouseEventArgs e)
        {
            Form3 f3 = new Form3(this);
            f3.Show();
        }
0
kodv
1425 / 1098 / 344
Регистрация: 11.04.2011
Сообщений: 2,606
Завершенные тесты: 1
30.03.2015, 19:48 12
Лучший ответ Сообщение было отмечено Елена01 как решение

Решение

Елена01, что и требовалось доказать. У вас выполняется конструктор Form3 (Form2 f2), в то время как запрос к БД выполняется в конструкторе Form3 (). Измените второй конструктор следующим образом:
C#
1
2
3
4
5
6
              
        public Form3 (Form2 f2)
                : this ()
        {
            _f2 = f2;
        }
1
Елена01
0 / 0 / 0
Регистрация: 02.12.2012
Сообщений: 19
31.03.2015, 19:40  [ТС] 13
Завтра попробую. Отвечу, что получилось или не получилось)

Добавлено через 23 часа 43 минуты
Ур-ра! Зар-работало! (Кот Матроскин) Спасибо за помощь
0
31.03.2015, 19:40
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
31.03.2015, 19:40

Как подключиться к базе данных, расположенной на хостинге timeweb
Здравствуйте. Подскажите пожалуйста с таким вопросом: Пытаюсь подключиться к базе данных,...

Как подключиться к удаленной базе данных, расположенной на сетевом компьютере?
У меня возникла проблема. Если упростить, то проблема заключается в следующем. Есть два компьютера...

Как подключиться к конкретной базе данных при работе с EF Code First
Я хочу подключиться к конкретной базе данных при работе с EF Code First. Как мне это сделать?


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
13
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2019, vBulletin Solutions, Inc.
Рейтинг@Mail.ru