Pregunta

Estoy tratando de guardar datos en una base de datos con solo presionar un botón, pero las variables parecen ser privadas por la naturaleza de donde están definidas. He intentado moverme donde están definidos, pero esto parece producir otros errores.

Dado un arreglo, ¿por qué fue arreglado de esa manera?

El código siguiente.

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.
        }
    }
}
¿Fue útil?

Solución

Está declarando dTable y adaptador en el constructor, por lo que queda fuera del alcance tan pronto como se complete el constructor.

Desea mover las declaraciones de variables a la clase principal, como:

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

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

Otros consejos

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.
        }
    }
}

Es necesario cambiar DataAdapter y el ámbito de dataTable para poder acceder al evento de método de clic de botón. Si los declara en el constructor, no se puede acceder a ellos por otros métodos, debe declararlos como campos de objeto para que sean " globales " a su instancia de objeto.

Debe averiguar qué alcance necesita cada variable, puede tener un alcance local, es decir, declarado dentro de un método o un alcance de clase, declarado fuera de un método.

el adaptador tiene un alcance para el constructor de Form1, no para la clase en sí.

Mueva el adaptador y la tabla de datos para que sean miembros privados de la clase.

Actualización: [suspiro] También olvidé mover dTable a la clase para hacer frente ...

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;
    }
}

adaptador y dTable se declara dentro de su constructor. Ambos deben ser 'sacados' del constructor para obtener una primicia de clase. Al igual que Franci hizo con el adaptador.

Es posible que haya otros errores, pero es difícil de adivinar cuando no ha publicado el error del compilador.

/ johan /

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top