Вопрос

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

Учитывая исправление, почему оно было исправлено именно так?

Ниже приведен код.

namespace enable
{
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
            OleDbConnection favouriteConnection = new System.Data.OleDb.OleDbConnection("Provider=Microsoft.Jet.OLEDB.4.0;Data Source=\\\\192.168.123.5\\Share\\Matt\\BugTypes.mdb");
            string strSQL = "SELECT CategoryName, Show " + "FROM [Categories] WHERE Show = 'Yes' " + "ORDER BY CategoryName";
            OleDbDataAdapter adapter = new OleDbDataAdapter(strSQL, favouriteConnection);
            OleDbCommandBuilder cBuilder = new OleDbCommandBuilder(adapter);
            DataTable dTable = new DataTable();
            adapter.Fill(dTable);
            BindingSource bSource = new BindingSource();
            bSource.DataSource = dTable;
            dataGridView1.DataSource = bSource;
            adapter.Update(dTable);
        }
        private void button1_Click(object sender, EventArgs e)
        {
            adapter.Update(dTable);//this is the button that needs to do the save, but can't see the variables.
        }
    }
}
Это было полезно?

Решение

Вы заявляете dTable и adapter в конструкторе, поэтому он выходит из области видимости, как только конструктор завершается.

Вы хотите переместить объявления переменных в основной класс, например:

public partial class Form1 : Form
{
    private DataTable dTable;
    private OleDbDataAdapter adapter;

    Public Form1()
    {
         ... your setup here ...
         dTable = new DataTable();
         ... etc ...
    }
}

Другие советы

namespace enable
{    
    public partial class Form1 : Form
    {

    OleDbDataAdapter adapter;
    DataTable dTable = new DataTable();

        public Form1()
        {
            InitializeComponent();
            OleDbConnection favouriteConnection = new System.Data.OleDb.OleDbConnection("Provider=Microsoft.Jet.OLEDB.4.0;Data Source=\\\\192.168.123.5\\Share\\Matt\\BugTypes.mdb");
            string strSQL = "SELECT CategoryName, Show " + "FROM [Categories] WHERE Show = 'Yes' " + "ORDER BY CategoryName";
            adapter = new OleDbDataAdapter(strSQL, favouriteConnection);
            OleDbCommandBuilder cBuilder = new OleDbCommandBuilder(adapter);
            adapter.Fill(dTable);
            BindingSource bSource = new BindingSource();
            bSource.DataSource = dTable;
            dataGridView1.DataSource = bSource;
            adapter.Update(dTable);            
        }
        private void button1_Click(object sender, EventArgs e)
        {
            adapter.Update(dTable);//this is the button that needs to do the save, but can't see the variables.
        }
    }
}

Вам необходимо изменить DataAdapter и область dataTable, чтобы они были доступны для события метода нажатия кнопки.Если вы объявите их в конструкторе, к ним невозможно получить доступ с помощью других методов, вам необходимо объявить их как поля объекта, чтобы они были «глобальными» для вашего экземпляра объекта.

Вам необходимо выяснить, в какой области действия нуждается каждая переменная. Вы можете иметь локальную область видимости, то есть объявленную внутри метода, или область видимости класса, объявленную вне метода.

Адаптер ограничен конструктором Form1, а не самим классом.

Переместите адаптер и dtable в частные члены класса.

Обновлять:[вздох] Я тоже забыл переместить dTable в класс...

namespace enable
{    
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
            OleDbConnection favouriteConnection = new System.Data.OleDb.OleDbConnection("Provider=Microsoft.Jet.OLEDB.4.0;Data Source=\\\\192.168.123.5\\Share\\Matt\\BugTypes.mdb");
            string strSQL = "SELECT CategoryName, Show " + "FROM [Categories] WHERE Show = 'Yes' " + "ORDER BY CategoryName";
            m_Adapter = new OleDbDataAdapter(strSQL, favouriteConnection)l
            OleDbCommandBuilder cBuilder = new OleDbCommandBuilder(m_Adapter);
            dTable = new DataTable();
            m_Adapter.Fill(dTable);
            BindingSource bSource = new BindingSource();
            bSource.DataSource = dTable;
            dataGridView1.DataSource = bSource;
            m_Adapter.Update(dTable);            
        }

        private void button1_Click(object sender, EventArgs e)
        {
            m_Adapter.Update(dTable);//this is the button that needs to do the save, but can't see the variables.
        }

        OleDbDataAdapter m_Adapter;
        DataTable dTable;
    }
}

адаптер и dTable объявлены в вашем конструкторе.Их обоих следует «вынести» из конструктора, чтобы получить информацию для всего класса.Точно так же, как Франси сделал с адаптером.

Могут быть и другие ошибки, но их трудно догадаться, если вы не опубликовали информацию об ошибке компилятора.

/Йохан/

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top