Не удается получить данные из базы данных Access после успешного подключения с использованием WPF

#c# #wpf #ms-access #combobox

#c# #wpf #ms-access #combobox

Вопрос:

Я пишу код на C # с проектом WPF. У меня есть выпадающий список ComboBox1, в котором пользователь выбирает один элемент из базы данных Microsoft Access на моем компьютере. Сразу после того, как пользователь что-то выбирает, я хочу получить определенное значение из той же строки, которую пользователь только что выбрал для перехода в текстовый блок.

Я получаю 3 одинаковые ошибки и говорю: «Имя «connect» не существует в текущем контексте«. Я не уверен, как это исправить.

 using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Data;
using System.Windows.Documents;
using System.Windows.Input;
using System.Windows.Media;
using System.Windows.Media.Imaging;
using System.Windows.Navigation;
using System.Windows.Shapes;
using System.Data.OleDb;
using System.Data.SqlClient;
using System.Data;
using System.ComponentModel;

namespace bundlecalc
{

    public partial class MainWindow : Window
    {
        public MainWindow()
        {
            InitializeComponent();
            MainWindow_Load();
        }

        private void MainWindow_Load()
        {   
            OleDbConnection connect = new OleDbConnection();
            connect.ConnectionString =  @"Provider=Microsoft.ACE.OLEDB.12.0;Data Source=C:ProjectsDatabase.accdb;
            Persist Security Info = False; ";
            connect.Open();

            OleDbCommand command = new OleDbCommand();
            command.Connection = connect;
            command.CommandText = "SELECT Column1 FROM Table1";

            OleDbDataReader reader = command.ExecuteReader();

            while(reader.Read())
            {
                ComboBox1.Items.Add(reader["Column1"].ToString());
            }
            connect.Close();

        }

        private void ComboBox1_SelectedIndexChanged(object sender, RoutedEventArgs e)
        {
            connect.Open();

            OleDbCommand command = new OleDbCommand();
            command.Connection = connect;
            string query = "select * from Table1 where Column1 ='"   ComboBox1.Text   "'";
            command.CommandText = query;

            OleDbDataReader reader = command.ExecuteReader();

            while (reader.Read())
            {
                BetaAnswer.Text = reader["ValueFromRow"].ToString();
            }

            connect.Close();
        }
    }
}
 

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

1. объявить connect как член класса

2. @viveknuna: Плохая идея. Сохранение открытых объектов подключения в классе с длительным сроком службы просто запрашивает ошибки.

Ответ №1:

В MainWindow_Load вы объявляете connect переменную:

 OleDbConnection connect = new OleDbConnection();
 

Но у ComboBox1_SelectedIndexChanged вас этого нет. Просто объявите его и в этом методе.

Вы также можете заглянуть в using блок для поиска доступных ресурсов, таких как подключения к базе данных. Что-то вроде:

 using (OleDbConnection connect = new OleDbConnection())
{
    // use the connection
}
 

(У вас может возникнуть соблазн сделать connect переменную членом уровня класса, который может быть повторно использован всем в классе. Не делайте этого. Это, как известно, плохая идея. Соединение с базой данных должно быть создано, использовано и уничтожено в очень небольшой области. Пул соединений позаботится о повторном использовании за вас. Попытка самостоятельного повторного использования приведет к проблемам.)

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

1. Хотел бы добавить, что OP не должен использовать конкатенированные операторы ad hoc sql и элементы управления пользовательского интерфейса. Используйте параметризованные запросы или хранимые процедуры.