OleDbDataAdapter: не может обновить базу данных - PullRequest
1 голос
/ 20 января 2012

Я работаю над этим со вчерашнего дня, и я просто не могу обновить свою базу данных. Есть 3 таблицы. Вот фрагмент кода одной из WinForms. Он загружает данные и отображает, но после изменения sth вручную в сетке я получаю либо ошибки при вызове Update, либо что-то вообще происходит.

пожалуйста, помогите, потому что я схожу с ума.

    public partial class Form3 : Form
    {
    //instance fields
    private export2Excel export2XLS;
    private DataSet _dataSet;
    private BindingSource _bsrc;
    private OleDbDataAdapter _dAdapter;
    private OleDbCommandBuilder _cBuilder;
    private DataTable _dTable;

    private void button1_Click(object sender, EventArgs e)
    {
        //create the connection string
        string connString = "Provider=Microsoft.Jet.OLEDB.4.0;Data      
        Source='C:\\Documents and Settings\\dorota\\Moje dokumenty\\Visual Studio  
        2010\\Projects\\WindowsFormsApplication1\\WindowsFormsApplication1\\artb.mdb'";

        //create the database query
        string query = "SELECT * FROM Samochody";
        System.Data.DataSet DtSet = new System.Data.DataSet();
        _dataSet = DtSet;
        //create an OleDbDataAdapter to execute the query
        OleDbDataAdapter dAdapter = new OleDbDataAdapter(query, connString);
        dAdapter.FillSchema(_dataSet, SchemaType.Source);

        _dAdapter = dAdapter;
        //create a command builder
        OleDbCommandBuilder cBuilder = new OleDbCommandBuilder(_dAdapter);
        _cBuilder = cBuilder;
        //create a DataTable to hold the query results
        DataTable dTable = new DataTable();
        _dTable = dTable;
        //fill the DataTable
        _dAdapter.Fill(_dTable);
        //_dAdapter.TableMappings.Add("Samochody", "Table");

        _dAdapter.Fill(_dataSet);

        // --------------------- to datagridview !

        //BindingSource to sync DataTable and DataGridView
        BindingSource _bsrc = new BindingSource();

        //set the BindingSource DataSource
        //bSource.DataSource = _dTable;
        _bsrc.DataSource = _dTable;
        //_bsrc = bSource;
        //set the DataGridView DataSource
        dataGridView1.DataSource = _bsrc;
    }
    }

и здесь ...:

    private void sqlsave_Click(object sender, EventArgs e)
    {

        //int i=_dAdapter.Update(_dTable);
        _dAdapter.Update(_dataSet.Tables["Samochody"]);
        //_dAdapter.Update(_dataSet,"Samochody");
    }

// --------------------------------------------- ------------------------------------

ки. Я изменил метод sqlsave для этого

    private void sqlsave_Click(object sender, EventArgs e)
    {

    try
    {
        //_dAdapter.Update(_dataSet.Tables["Samochody"]);
         OleDbCommand oldb= _cBuilder.GetUpdateCommand();
         int i=oldb.ExecuteNonQuery();
         System.Windows.Forms.MessageBox.Show(i+" rows affected.");
        //_dAdapter.Update(_dataSet,"Samochody");
    }catch(OleDbException oldbex){
        System.Windows.Forms.MessageBox.Show(oldbex.ToString());
    }

и теперь я, наконец, стал более информативным, чем «Ошибка в»

Необработанное исключение типа 'System.InvalidOperationException' произошло в System.Data.dll Дополнительная информация: ExecuteNonQuery требуется открытое и доступное соединение. Ток соединения состояние закрыто.

так что дайте мне изменить что-то, и я дам вам знать, если это так!

// --------------------------------

нет. нет. слишком быстро, не может длиться долго теперь, пытаясь спасти, я снова получил исключение, Connectin открыт, но (я не могу опубликовать изображение), когда я отлаживаю это, я вижу, что мой объект типа OleDbCommand как _commandText имеет

"ОБНОВИТЬ Самоходы SET Item = ?, Data dyspozycji autem od = ?, ..."

и так далее. Я думаю, что это причина. Я прав? Что делать?

Ответы [ 2 ]

0 голосов
/ 21 января 2012

Я нашел ответ:

Но лучшим подходом было бы использовать перетаскивание и изучение формы кода.

Select Data|View Datasources. Your dataset should be visible in the DataSources Window.
Drag a table to a (new) form. VS2005 will add a load of components and a few lines of code.

Форма теперь будет иметь экземпляр набора данных, и это будет ваша точка отсчета для методов Adapter.Fill и .Update.

Легко и отлично работает!: D
Я нашел это здесь: https://stackoverflow.com/a/548124/1141471

0 голосов
/ 21 января 2012

Вы не предоставили соединение для вашего OleDbDataAdapter.Попробуйте что-то вроде этого:

Пример отличается от вашего кода, но показывает объявление нового соединения и передачу его в OleDbDataAdapter

        string connetionString = null;
        OleDbConnection connection ;
        OleDbDataAdapter oledbAdapter ;
        OleDbCommandBuilder oledbCmdBuilder ;
        DataSet ds = new DataSet();
        int i = 0;
        string sql = null;
        connetionString = "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=Your mdb filename;";
        connection = new OleDbConnection(connetionString);
        sql = "select * from tblUsers";
        try
        {
            connection.Open();  // your code must have like this
            oledbAdapter = new OleDbDataAdapter(sql, connection);
            oledbCmdBuilder = new OleDbCommandBuilder(oledbAdapter);
            oledbAdapter.Fill(ds);
            for (i = 0; i <= ds.Tables[0].Rows.Count - 1; i++)
            {
                ds.Tables[0].Rows[i].ItemArray[2] = "neweamil@email.com";
            }
            oledbAdapter.Update(ds.Tables[0]);
            connection.Close();
            MessageBox.Show ("Email address updates !");
        }
        catch (Exception ex)
        {
            MessageBox.Show(ex.ToString());
        }
...