ADO.NET, работа с бд

 
0
 
.NET
ava
mego4el | 22.01.2013, 20:05
Есть небольшой фрагмент программы, где в AdapterDemo() (выделено жирным), я пытаюсь изменить запись в бд, затем сохранить изменения.
Мне нужно всего-лишь Изменить любую запись в DataTable "Books" и сохранить изменения в исходной базе данных.
Не могу разобраться, что же я делаю не так. Сижу читаю в книге - все один в один, ошибок тоже нет, но тем не менее это не приводит к изменению записи в бд и вообще ни к чему.

База данных: Books.mdb, где есть таблицы Authors и Books.
Таблица в которой нужно изменить любую(ые) записи это "Books".
Она состоит из BookID, BookName, AuthorID.

По -умолчанию "Books" заполнена  и состоит из 10 разных значений (по BOOkID это от 1 до 10).

Очень прошу, помогите разобраться. Еще как-нибудь бы вывести результат изменений в бд на консоль.
Спасибо!


using System;
using System.Data;
using System.Data.OleDb;

class DbSample {
    static string SampleDbPath =
        @"Books.mdb";

    static OleDbConnection myConnection;

    static void ReaderDemo() {
        OleDbCommand myCommand = new OleDbCommand( "SELECT * FROM Books", myConnection );

        OleDbDataReader myReader = myCommand.ExecuteReader();

        Console.WriteLine( "All books in database:" );
        while ( myReader.Read() ) {
            object myObject = myReader[ "BookName" ];
            Console.WriteLine( myObject.ToString() );
        }
        myReader.Close();

        myCommand = new OleDbCommand( "SELECT COUNT(*) FROM Books", myConnection );
        Console.WriteLine( "\nBooks count - {0}", myCommand.ExecuteScalar() );
    }

    static void ParameterDemo() {
        OleDbCommand myCommand =
            new OleDbCommand( "SELECT COUNT(*) FROM Books WHERE (AuthorID = ?)",
                             myConnection );
        myCommand.Parameters.Add( "AuthorID", OleDbType.VarChar );
        myCommand.Parameters[ 0 ].Value = 1;

        Console.WriteLine( "\nBooks count by author - {0}", myCommand.ExecuteScalar() );
    }

    static void AdapterDemo() {
        OleDbDataAdapter myAdapter = new
            OleDbDataAdapter( "SELECT * FROM Books", myConnection );

        DataSet myDataSet = new DataSet();

        myAdapter.Fill( myDataSet );

        for ( int i = 0; i < myDataSet.Tables[ 0 ].Rows.Count; ++i ) {
            Console.WriteLine( myDataSet.Tables[ 0 ].Rows[ i ].ItemArray[ 2 ].ToString() );
        }


        myAdapter.UpdateCommand = new OleDbCommand("UPDATE Books SET BookID =?, BookName =?, AuthorID =?"); //+"WHERE
        myAdapter.UpdateCommand.Parameters.Add("BookID", OleDbType.Integer, 3, "BookID");
        myAdapter.UpdateCommand.Parameters.Add("BookName", OleDbType.VarChar, 50, "BookName");
        myAdapter.UpdateCommand.Parameters.Add("AuthorID", OleDbType.Integer, 3, "AuthorID");

        myAdapter.UpdateCommand.Connection = myConnection;
        myAdapter.Update(myDataSet.Tables[0]);

    }

    static void TransactionDemo() {
        OleDbTransaction myTransaction = myConnection.BeginTransaction();
        OleDbCommand dropBooks = new OleDbCommand( "DROP TABLE Books", myConnection );
        //OleDbCommand dropAuthors = new OleDbCommand("DROP TABLE AuthorsNonEx", myConnection);
        OleDbCommand dropAuthors = new OleDbCommand("DROP TABLE Authors", myConnection);

        dropBooks.Transaction = myTransaction;
        dropAuthors.Transaction = myTransaction;

        try {
            dropBooks.ExecuteNonQuery();
            dropAuthors.ExecuteNonQuery();
            myTransaction.Commit();
        } catch ( Exception e ) {
            Console.WriteLine( e.Message );
            myTransaction.Rollback();
        }
    }

    static void Main( string[] args ) {
    myConnection = new OleDbConnection();
    myConnection.ConnectionString ="Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" +SampleDbPath;

    myConnection.Open();

    ReaderDemo();
    ParameterDemo();
    AdapterDemo();
    TransactionDemo();

    myConnection.Close();

    }
}



Вот что было выделено жирным (чего-то не выделяет в коде)

myAdapter.UpdateCommand = new OleDbCommand("UPDATE Books SET BookID =?, BookName =?, AuthorID =?"); //+"WHERE
myAdapter.UpdateCommand.Parameters.Add("BookID", OleDbType.Integer, 3, "BookID");
myAdapter.UpdateCommand.Parameters.Add("BookName", OleDbType.VarChar, 50, "BookName");
myAdapter.UpdateCommand.Parameters.Add("AuthorID", OleDbType.Integer, 3, "AuthorID");

myAdapter.UpdateCommand.Connection = myConnection;
myAdapter.Update(myDataSet.Tables[0]);
Ответы (1)
ava
Certain | 23.01.2013, 11:13 #
Привет!

Цитата


По -умолчанию "Books" заполнена  и состоит из 10 разных значений (по BOOkID это от 1 до 10).


BookID - первичный ключ в таблице Books?
Если ДА, то UPDATE работать не будет, первичный ключ менять нельзя


Цитата




myAdapter.UpdateCommand = new OleDbCommand("UPDATE Books SET BookID =?, BookName =?, AuthorID =?"); //+"WHERE

myAdapter.UpdateCommand.Parameters.Add("BookID", OleDbType.Integer, 3, "BookID");

myAdapter.UpdateCommand.Parameters.Add("BookName", OleDbType.VarChar, 50, "BookName");

myAdapter.UpdateCommand.Parameters.Add("AuthorID", OleDbType.Integer, 3, "AuthorID");



//НЕОБХОДИМО ИНИЦИАЛИЗИРОВАТЬ ВСЕ ПАРАМЕТРЫ

//myAdapter.UpdateCommand.Parameters["AuthorID"].Value = 1;



myAdapter.UpdateCommand.Connection = myConnection;

myAdapter.Update(myDataSet.Tables[0]);





Зарегистрируйтесь или войдите, чтобы написать.
Фирма дня
Вы также можете добавить свою фирму в каталог IT-фирм, и публиковать статьи, новости, вакансии и другую информацию от имени фирмы.
Подробнее
Участники
advanced
Отправить