Форум программистов
 
О проблемах, например, с регистрацией пишите сюда - alarforum@yandex.ru, проверяйте папку спам! Обязательно пройдите активизацию e-mail, а тут можно восстановить пароль.

Вернуться   Форум программистов > .NET фреймворки > Базы данных (ADO.NET, LinqToSql, ORM Entity Framework, NHibernate)
Регистрация

Восстановить пароль
Повторная активизация e-mail


Ответ
 
Опции темы
Старый 08.11.2017, 01:40   #1
Alexis_777
Пользователь
 
Регистрация: 08.11.2017
Сообщений: 48
Злость Выбор базы данных через меню

Как сделать выбор файла базы данных через меню?
файл записывается в переменную ConnectionString.
Вот код кнопки открытия файла, класс OpenFileDialog расположен на форме Form9:
Код:
private void открытьToolStripMenuItem_Click(object sender, EventArgs e)
        {
            Form9 f = new Form9();
            f.openFileDialog1.Filter = "Файлы базы данных Microsoft Access (*.accdb)|*.accdb";
            f.openFileDialog1.RestoreDirectory = true;
            if (f.openFileDialog1.ShowDialog() == DialogResult.Cancel)
                return;
            if (f.openFileDialog1.FileName != "")
                FillTable(); // вызовем метод FillTable
        }
Тут коннекчусь к базе данных:
Код:
public partial class Form1 : Form
    {
        static Form9 f = new Form9();
        // Строка соединения с базой данных
        public string ConnectionString = "Provider=Microsoft.ACE.OLEDB.12.0;Data Source=" + f.openFileDialog1.FileName;
        public Form1()
        {
            InitializeComponent();
        }
        // Показать таблицу Базы данных
        private void FillTable() 
        {
            string CommandText = "SELECT * FROM [База данных]"; 
            OleDbDataAdapter da = new OleDbDataAdapter(CommandText, ConnectionString); 
            DataSet ds = new DataSet(); 
            da.Fill(ds, "[База данных]"); 
            dataGridView1.DataSource = ds.Tables["[База данных компакт-дисков]"].DefaultView; 
            dataGridView1.AutoGenerateColumns = true; 
}
}
При открытии БД ошибка: Необрабатываемое исключение в приложении, код результата DB_SEC_E_AUTH_FAILED(0x80040E4D). Сам текст ошибки:
Цитата:
************** Текст исключения **************
System.Data.OleDb.OleDbException (0x80040E4D): Сообщение об ошибке не предусмотрено, код результата: DB_SEC_E_AUTH_FAILED(0x80040E4D).
в System.Data.OleDb.OleDbConnectionIn ternal..ctor(OleDbConnectionString constr, OleDbConnection connection)
в System.Data.OleDb.OleDbConnectionFa ctory.CreateConnection(DbConnection Options options, DbConnectionPoolKey poolKey, Object poolGroupProviderInfo, DbConnectionPool pool, DbConnection owningObject)
в System.Data.ProviderBase.DbConnecti onFactory.CreateConnection(DbConnec tionOptions options, DbConnectionPoolKey poolKey, Object poolGroupProviderInfo, DbConnectionPool pool, DbConnection owningConnection, DbConnectionOptions userOptions)
в System.Data.ProviderBase.DbConnecti onFactory.CreateNonPooledConnection (DbConnection owningConnection, DbConnectionPoolGroup poolGroup, DbConnectionOptions userOptions)
в System.Data.ProviderBase.DbConnecti onFactory.TryGetConnection(DbConnec tion owningConnection, TaskCompletionSource`1 retry, DbConnectionOptions userOptions, DbConnectionInternal oldConnection, DbConnectionInternal& connection)
в System.Data.ProviderBase.DbConnecti onInternal.TryOpenConnectionInterna l(DbConnection outerConnection, DbConnectionFactory connectionFactory, TaskCompletionSource`1 retry, DbConnectionOptions userOptions)
в System.Data.ProviderBase.DbConnecti onClosed.TryOpenConnection(DbConnec tion outerConnection, DbConnectionFactory connectionFactory, TaskCompletionSource`1 retry, DbConnectionOptions userOptions)
в System.Data.ProviderBase.DbConnecti onInternal.OpenConnection(DbConnect ion outerConnection, DbConnectionFactory connectionFactory)
в System.Data.OleDb.OleDbConnection.O pen()
в System.Data.Common.DbDataAdapter.Fi llInternal(DataSet dataset, DataTable[] datatables, Int32 startRecord, Int32 maxRecords, String srcTable, IDbCommand command, CommandBehavior behavior)
в System.Data.Common.DbDataAdapter.Fi ll(DataSet dataSet, Int32 startRecord, Int32 maxRecords, String srcTable, IDbCommand command, CommandBehavior behavior)
в System.Data.Common.DbDataAdapter.Fi ll(DataSet dataSet, String srcTable)
в База_данных_компакт_дисков.Form1.Fi llTable() в d:\База данных компакт-дисков\База данных компакт-дисков\Form1.cs:строка 32
в База_данных_компакт_дисков.Form1.от крытьToolStripMenuItem_Click(Object sender, EventArgs e) в d:\База данных компакт-дисков\База данных компакт-дисков\Form1.cs:строка 333
в System.Windows.Forms.ToolStripItem. RaiseEvent(Object key, EventArgs e)
в System.Windows.Forms.ToolStripMenuI tem.OnClick(EventArgs e)
в System.Windows.Forms.ToolStripItem. HandleClick(EventArgs e)
в System.Windows.Forms.ToolStripItem. HandleMouseUp(MouseEventArgs e)
в System.Windows.Forms.ToolStripItem. FireEventInteractive(EventArgs e, ToolStripItemEventType met)
в System.Windows.Forms.ToolStripItem. FireEvent(EventArgs e, ToolStripItemEventType met)
в System.Windows.Forms.ToolStrip.OnMo useUp(MouseEventArgs mea)
в System.Windows.Forms.ToolStripDropD own.OnMouseUp(MouseEventArgs mea)
в System.Windows.Forms.Control.WmMous eUp(Message& m, MouseButtons button, Int32 clicks)
в System.Windows.Forms.Control.WndPro c(Message& m)
в System.Windows.Forms.ScrollableCont rol.WndProc(Message& m)
в System.Windows.Forms.ToolStrip.WndP roc(Message& m)
в System.Windows.Forms.ToolStripDropD own.WndProc(Message& m)
в System.Windows.Forms.Control.Contro lNativeWindow.OnMessage(Message& m)
в System.Windows.Forms.Control.Contro lNativeWindow.WndProc(Message& m)
в System.Windows.Forms.NativeWindow.C allback(IntPtr hWnd, Int32 msg, IntPtr wparam, IntPtr lparam)
Думаю, ошибка из-за неправильного пути. По-разному пробовал путь задать, но ни разу не получалось сделать чтобы заработало.
Alexis_777 вне форума Ответить с цитированием
Старый 08.11.2017, 09:31   #2
Serge_Bliznykov
Старожил
 
Регистрация: 09.01.2008
Сообщений: 26,260
По умолчанию

попробуйте обрамить имя файла в connectionstring двойными кавычками.

p.s. можно сначала добиться, чтобы работало с каким-то конкретным именем, заданными прямо в тексте программы:
Код:
string FileName = @"\"d:\База данных компакт-дисков\База данных компакт-дисков\test.accdb\"";
public string ConnectionString = "Provider=Microsoft.ACE.OLEDB.12.0;Data Source=" + FileName;
а потом, если заработает, можно уже смело добавлять кавычки при добавлении в строку f.openFileDialog1.FileName
Serge_Bliznykov вне форума Ответить с цитированием
Старый 10.11.2017, 04:57   #3
Alexis_777
Пользователь
 
Регистрация: 08.11.2017
Сообщений: 48
По умолчанию

Цитата:
Сообщение от Serge_Bliznykov Посмотреть сообщение
попробуйте обрамить имя файла в connectionstring двойными кавычками.

p.s. можно сначала добиться, чтобы работало с каким-то конкретным именем, заданными прямо в тексте программы:
Код:
string FileName = @"\"d:\База данных компакт-дисков\База данных компакт-дисков\test.accdb\"";
public string ConnectionString = "Provider=Microsoft.ACE.OLEDB.12.0;Data Source=" + FileName;
а потом, если заработает, можно уже смело добавлять кавычки при добавлении в строку f.openFileDialog1.FileName
С конкретным именем все работает, но вот с f.openFileDialog1.FileName вылазит всё также ошибка.
Alexis_777 вне форума Ответить с цитированием
Старый 10.11.2017, 09:37   #4
Serge_Bliznykov
Старожил
 
Регистрация: 09.01.2008
Сообщений: 26,260
По умолчанию

Цитата:
Сообщение от Alexis_777 Посмотреть сообщение
С конкретным именем все работает
работает с тем же именем, что Вы пытаетесь выбрать через файлдиалог?

Цитата:
Сообщение от Alexis_777 Посмотреть сообщение
но вот с f.openFileDialog1.FileName вылазит всё также ошибка.
двойные кавычки добавили?

выведите полученную строчку ConnectionString куда-нибудь (в TextBox или в файл), посмотрите, что там не так в полученной строке.
Serge_Bliznykov вне форума Ответить с цитированием
Старый 10.11.2017, 11:57   #5
Alexis_777
Пользователь
 
Регистрация: 08.11.2017
Сообщений: 48
По умолчанию

Цитата:
Сообщение от Serge_Bliznykov Посмотреть сообщение
работает с тем же именем, что Вы пытаетесь выбрать через файлдиалог?


двойные кавычки добавили?

выведите полученную строчку ConnectionString куда-нибудь (в TextBox или в файл), посмотрите, что там не так в полученной строке.
Протестировал ConnectionString c помощью MessageBox.
Получается, что при ConnectionString = "Provider=Microsoft.ACE.OLEDB.12.0; Data Source=" + f.openFileDialog1.FileName
Выводит только Provider=Microsoft.ACE.OLEDB.12.0;D ata Source=.

Сам f.openFileDialog1.FileName в ConnectionString не видит, типо он пустой. С кавычками и без них все равно пустой.

Отдельно вывел в MessageBox f.openFileDialog1.FileName, выводит правильно путь и файл с расширением.
Изображения
Тип файла: png скрин.png (16.5 Кб, 71 просмотров)
Alexis_777 вне форума Ответить с цитированием
Старый 10.11.2017, 12:04   #6
Serge_Bliznykov
Старожил
 
Регистрация: 09.01.2008
Сообщений: 26,260
По умолчанию

Цитата:
Сообщение от Alexis_777 Посмотреть сообщение
Сам f.openFileDialog1.FileName в ConnectionString не видит, типо он пустой. С кавычками и без них все равно пустой
Ха. Так всё в порядке выполнения.

код на иницилизации формы выполняется ДО ТОГО, как Вы вызываете ваш открытьToolStripMenuItem_Click

а нужно - ПОСЛЕ.

p.s. расставьте в коде MessageBox'ы в этих процедурах, увидите, кто из них вызывается в каком порядке.
Serge_Bliznykov вне форума Ответить с цитированием
Старый 10.11.2017, 16:31   #7
Alexis_777
Пользователь
 
Регистрация: 08.11.2017
Сообщений: 48
По умолчанию

Цитата:
Сообщение от Serge_Bliznykov Посмотреть сообщение
Ха. Так всё в порядке выполнения.

код на иницилизации формы выполняется ДО ТОГО, как Вы вызываете ваш открытьToolStripMenuItem_Click

а нужно - ПОСЛЕ.

p.s. расставьте в коде MessageBox'ы в этих процедурах, увидите, кто из них вызывается в каком порядке.
Спасибо за помощь, да вы правы, глупая ошибка. Теперь все работает.
Alexis_777 вне форума Ответить с цитированием
Старый 10.11.2017, 17:09   #8
Serge_Bliznykov
Старожил
 
Регистрация: 09.01.2008
Сообщений: 26,260
По умолчанию

Пожалуйста. Ничего страшного. Удачи!
Serge_Bliznykov вне форума Ответить с цитированием
Ответ

Здесь нужно купить рекламу за 20 тыс руб в месяц! ) пишите сюда - alarforum@yandex.ru
Без учёта ботов - 20000 человек в день, 350000 в месяц.

Опции темы


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
выбор базы данных Smogg C# (си шарп) 0 09.08.2016 10:56
Проектирование базы данных в Postgres: выбор типа данных между TEXT и VARCHAR Blondy Общие вопросы по программированию, компьютерный форум 6 06.03.2014 01:09
Создание меню. Базы данных nork Помощь студентам 7 06.03.2013 10:50
Delphi 7 выбор организации базы данных Streamline БД в Delphi 3 16.08.2010 13:39
Выбор базы данных FoxBrut БД в Delphi 2 02.03.2010 12:37


Проекты отопления, пеллетные котлы, бойлеры, радиаторы
интернет магазин respective.ru
Пеллетный котёл Emtas
котлы EMTAS
Здесь нужно купить рекламу за 7 тыс руб в месяц! )
пишите сюда - alarforum@yandex.ru
ИКС 840