Я пытаюсь сохранить данные в базе данных нажатием кнопки, но переменные кажутся частными по своей природе. Я попытался переместиться туда, где они определены, но, похоже, это вызывает другие ошибки.
Учитывая исправление, почему это было исправлено таким образом?
Код следует.
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.
}
}
}





Обновление: [знак] Я тоже забыл переместить Table в класс ...
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;
}
}
У вас есть OleDbDataAdapter в блоке пространства имен.
да, вот что происходит, когда я использую Блокнот для редактирования кода ... :-)
Вы объявляете dTable и adapter в конструкторе, поэтому он выходит из области видимости, как только конструктор будет завершен.
Вы хотите переместить объявления переменных в основной класс, например:
public partial class Form1 : Form
{
private DataTable dTable;
private OleDbDataAdapter adapter;
Public Form1()
{
... your setup here ...
dTable = new DataTable();
... etc ...
}
}
Объяснение: в основном вы говорите: «Дайте мне объект адаптера, который я буду использовать в этом методе (конструкторе)». Подразумевается, что когда метод завершается, он вам больше не нужен. Если вы сделаете то, что рекомендовано, вы скажете: «Я буду использовать объект адаптера в этом классе». Ключевое слово для поиска - это область действия.
адаптер привязан к конструктору Form1, а не к самому классу.
Переместите адаптер и dtable в закрытые члены класса.
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, чтобы они были доступны для события метода нажатия кнопки. Если вы объявляете их в конструкторе, они не могут быть приняты другими методами, вам необходимо объявить их как поля объекта, чтобы они были «глобальными» для вашего экземпляра объекта.
Вам нужно выяснить, в какой области видимости нужна каждая переменная, у вас может быть локальная область видимости, то есть объявленная внутри метода или область видимости класса, объявленная вне метода.
адаптер и dTable объявляются в вашем конструкторе. Они оба должны быть «перемещены» из конструктора, чтобы получить объемную информацию для всего класса. Так же, как Фрэнси с адаптером.
Могут быть и другие ошибки, но их трудно угадать, если вы не опубликовали ошибку компилятора.
/ Йохан /
Помечено как я действительно не думаю, что это (вопрос / решение) о MS Access! :)