Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Базы данных под .NET > Работа с базой даных Access


Автор: alxxx 29.9.2007, 17:16
Здравствуйте товарищи программисты, у меня есть вопрос.

Нужно создать на C#  программу с возможностью создания и открытия базы данных Access, создания в ней таблиц (структура таблицы жестко задана в программе)  добавления, редактирования, удаления и просмотра записей.

 В С# равно как и в базах данных шарю пока очень слабо. 

Как создать базу я вроде понял, а вот как к ней подключиться и работать дальше (добавлять, редактировать, удалять записи)  не знаю. 

Прошу чем-нибудь помочь. Спасибо.

Автор: Smorodin 29.9.2007, 19:46
Код

 string connectionString = "provider=Microsoft.JET.OLEDB.4.0;" + "data source = c:\\db.mdb";
            string commandString = "select `id`, `name`, `name_tr` from vuzs ORDER BY `name`";
            OleDbDataAdapter DataAdapter = new OleDbDataAdapter(commandString, connectionString);

            DataSet DataSet = new DataSet();

            DataAdapter.Fill(DataSet, "vuzs");

            DataTable dataTable = DataSet.Tables[0];

          

            foreach (DataRow dataRow in dataTable.Rows)
            {
                listBox1.Items.Add(dataRow["name"]);
               
                label1.Text = dataRow["name"].ToString();
             
             
            }



Добавлено через 29 секунд
Код

 string connectionString = @"Provider=Microsoft.Jet.OLEDB.4.0;Data Source=C:\db.mdb";
            using (OleDbConnection connection = new OleDbConnection(connectionString))
            {
                connection.Open();



                // добавим строку в таблицу vuzs
                OleDbCommand command = new OleDbCommand("UPDATE vuzs SET `name`='" + textName.Text + "', `name_tr`='" + textName_tr.Text + "' WHERE `name_tr`='" + this.VuzNameTr + "'", connection);
                command.ExecuteNonQuery();


            }


Добавлено через 1 минуту и 3 секунды
Код

string connectionString = @"Provider=Microsoft.Jet.OLEDB.4.0;Data Source=C:\db.mdb";
            using (OleDbConnection connection = new OleDbConnection(connectionString))
            {
                connection.Open();

               

                // добавим строку в таблицу vuzs
                OleDbCommand command = new OleDbCommand("INSERT INTO vuzs(name, name_tr) VALUES('" + textBox1.Text + "', '" + textBox2.Text + "')", connection);
                command.ExecuteNonQuery();

                
            }

Автор: alxxx 30.9.2007, 16:44
Спасибо.
А как создавать таблицу в базе?

Автор: thomas 30.9.2007, 16:54
alxxx, 
http://msdn2.microsoft.com/en-us/library/ms186197(vs.80).aspx  smile 

Автор: Smorodin 30.9.2007, 17:35
Есть таблица. В ней поля:
id - Счетчик
name - Текстовый
vuz_id  - Числовой.

Есть код:
Код

        public Zvons(int vid)
        {
            InitializeComponent();
            //MessageBox.Show(vid.ToString());
            string connectionString = "provider=Microsoft.JET.OLEDB.4.0;" + "data source = c:\\db.mdb";
            string commandString = "select `id`, `name` from zvon WHERE `vuz_id`='" + vid + "'";
            OleDbDataAdapter DataAdapter = new OleDbDataAdapter(commandString, connectionString);

            DataSet DataSet = new DataSet();

            DataAdapter.Fill(DataSet, "zvon");

            DataTable dataTable = DataSet.Tables[0];

          
            foreach (DataRow dataRow in dataTable.Rows)
            {
               ...               
            }
        }



Ругается так:
Цитата
Таблица 'zvon' открыта с монопольным доступом пользователем 'Admin' на машине 'SMORODIN'.

и показывает на строку:
Код
DataAdapter.Fill(DataSet, "zvon");


В чем ошибка? Я еще только учусь...  :unsure:

Автор: thomas 30.9.2007, 21:26
Smorodin, 
Закрой Access и потом юзай базу из своей программы.  smile 
и переименуй экаунт admin на что-нибуь другое, тогда тебя никто не хакнет через общепринятый экаунт admin.  smile 
Иди в политики и там переименовывай.

Автор: Smorodin 1.10.2007, 09:37
Винда у меня временно, пока винчестер новый не купил. Обычно под никсом и никогда не юзал Ацес. ПРосто пользуясь моментом, решил пошаманить что нибудь под винд. smile

Спасибо за закрытие базы smile Я - ламер.

Добавлено через 53 секунды
Еще возник вопрос: а можно средствами C# узнать, открыта база или нет? smile

Добавлено через 9 минут и 1 секунду
Еще проблема:
Код

            string connectionString = "provider=Microsoft.JET.OLEDB.4.0;" + "data source = c:\\db.mdb";
            string commandString = "SELECT pars.id, pars.start, pars.end FROM pars WHERE (((pars.zvon_id)=2))";
            OleDbDataAdapter DataAdapter = new OleDbDataAdapter(commandString, connectionString);

            DataSet DataSet = new DataSet();

            DataAdapter.Fill(DataSet, "pars");

            DataTable dataTable = DataSet.Tables[0];

            int i = 0;


            foreach (DataRow dataRow in dataTable.Rows)
            {
            }

Ругается "IErrorInfo.GetDescription failed with E_FAIL(0x80004005)."
и показывает на "DataAdapter.Fill(DataSet, "pars");"

Автор: alxxx 1.10.2007, 20:49
Так, всем спасибо, кое что вроде уже раскурил.

Есть еще такой вопрос:
Как мне отобразить таблицу в DataGridView?

Автор: thomas 1.10.2007, 21:22
alxxx, 

DataGridView.DataSource = MyDataSet
DataGridView.DataMember = "myTableName"

Автор: alxxx 1.10.2007, 23:05
Так, отлично, с DataGridView разобрался. 
Осталась сделать последнюю фичу. 
Нужно последовательно просматривать записи таблицы, выводя их в текстбоксы
Как это лучше сделать?  Использовать bindingNavigator? Если да, то как его использовать?

Автор: Smorodin 2.10.2007, 07:40
У меня такой вопрос: как узнать количество строк, которые бернул Ацесс по запросу?
код:
Код

 string connectionString = "provider=Microsoft.JET.OLEDB.4.0;" + "data source = c:\\db.mdb";
            string commandString = "SELECT ...............";
            OleDbDataAdapter DataAdapter = new OleDbDataAdapter(commandString, connectionString);

            DataSet DataSet = new DataSet();

            DataAdapter.Fill(DataSet, "pars");

            DataTable dataTable = DataSet.Tables[0];

            int i = 0;


            foreach (DataRow dataRow in dataTable.Rows)
            {
            }

Узнать количество строк нужно до вызова foreach

Автор: alxxx 2.10.2007, 15:05
Цитата(Smorodin @  2.10.2007,  07:40 Найти цитируемый пост)
как узнать количество строк, которые бернул Ацесс по запросу?

Может это глупо, и профессионалы так не делают, но я тупо посчитал в цикле foreach.

Автор: Mr_Smith 2.10.2007, 16:46
Цитата(alxxx @  2.10.2007,  15:05 Найти цитируемый пост)
Может это глупо, и профессионалы так не делают, но я тупо посчитал в цикле foreach. 

профессионалы юзают 
dataTable.Rows.Count  )))

еще можно так:

int table_count = myDataAdapter.Fill(MyDataSet) //когда несколько таблиц заполняешь за раз

int rows_count = myDataAdapter.Fill(MyDataSet,"mytable1") //когда конкретную

int rows_count = command.ExecuteNonQuery();

Автор: alxxx 2.10.2007, 23:44
Подскажите еще пожалуйста, как извлечь данные из  dataTable. То есть мне надо из конкретной строки взять конкретное поле чтобы использовать данные из  него.

Автор: Smorodin 3.10.2007, 03:51
Код

            string connectionString = "provider=Microsoft.JET.OLEDB.4.0;" + "data source = c:\\db.mdb";
            string commandString = "SELECT ...............";
            OleDbDataAdapter DataAdapter = new OleDbDataAdapter(commandString, connectionString);

            DataSet DataSet = new DataSet();

            DataAdapter.Fill(DataSet, "pars");

            DataTable dataTable = DataSet.Tables[0];

            int i = 0;


            foreach (DataRow dataRow in dataTable.Rows)
            {
                      textBox1.Text = dataRow["column_name"].ToString();
            }


alxxx, это?

Автор: Mr_Smith 3.10.2007, 05:06
dataTable.Rows[i][j]

Автор: alxxx 4.10.2007, 22:29
Подскажите, еще пожалуйста, а как сохранить изменения в самой базе после того как я изменяю dataTable? 

Автор: WinNet 4.10.2007, 22:58
Цитата

Подскажите, еще пожалуйста, а как сохранить изменения в самой базе после того как я изменяю dataTable?  


Можно так:
Код

OleDbCommand Command = new OleDbCommand("testProcedure", new SqlConnection(connectionString));
Command.CommandType = CommandType.StoredProcedure; // Например с помощью хранимой процедуры
            SqlParameter parametr = null;
            // далее параметры 
            parametr = new SqlParameter("@p1", SqlDbType.Int);
            parametr.Value = p1;
            Command.Parameters.Add(parametr);

            parametr = new SqlParameter("@p2", SqlDbType.Char);
            parametr.Value = p2;
            Command.Parameters.Add(parametr);
            // etc...

            Command.Connection.Open(); // открываем подключение
            Command.ExecuteNonQuery(); // вносим изменения (в данном случае вызывается хр.проц)
            Command.Connection.Dispose(); // осв. память.


Или так:
Код

            OleDbCommand UpCommand = new OleDbCommand();
            UpCommand.CommandType = CommandType.Text;
            OleDbParameter parametr = null;

            parametr = new OleDbParameter("@p1", SqlDbType.Int);
            parametr.SourceColumn = "p1";
            UpCommand.Parameters.Add(parametr);

            parametr = new OleDbParameter("p2", SqlDbType.VarChar);
            parametr.Size = 25;
            parametr.SourceColumn = "p2";
            UpCommand.Parameters.Add(parametr);

            UpCommand.CommandText = "SQL запрос";
            OleDbDataAdapter sqlDA = new OleDbDataAdapter();
            UpCommand.Connection = new OleDbConnection(connectionString);
            sqlDA.UpdateCommand = UpCommand;
            sqlDA.Update(Table);

Автор: alxxx 6.10.2007, 15:07
Вот есть примерно такая тема:
Как мне сохранить изменения в базу?  Что-то  у меня ничего не получается.

 
Код

OleDbDataAdapter DataAdapter = new OleDbDataAdapter(commandString, connectionString);
                DataSet dataSet = new DataSet();
                DataTable dataTable = new DataTable();
                DataAdapter.Fill(dataSet, textBox2.Text);
                dataTable = dataSet.Tables[0];
                dataTable.Rows[crec]["Name"] = textBox5.Text;
                dataTable.Rows[crec]["Summ"] = textBox4.Text;   

Автор: WinNet 6.10.2007, 18:12
Цитата

Вот есть примерно такая тема:
Как мне сохранить изменения в базу?  Что-то  у меня ничего не получается.


Можно так:

Код


OleDbDataAdapter DataAdapter = new OleDbDataAdapter(commandString, connectionString);
                DataSet dataSet = new DataSet();
                DataTable dataTable = new DataTable();
                DataAdapter.Fill(dataSet, textBox2.Text);
                dataTable = dataSet.Tables[0];
                dataTable.Rows[crec]["Name"] = textBox5.Text;
                dataTable.Rows[crec]["Summ"] = textBox4.Text; 
 
                OleDbCommandBuilder cBuild = new OleDbCommandBuilder(DataAdapter);
                DataAdapter.Update(dataTable);


Пишу попамяти , но вроде должно сработать...

Автор: alxxx 7.10.2007, 13:02
WinNet, не работает, пишет такое

Цитата

Dynamic SQL generation for the UpdateCommand is not supported against a SelectCommand that does not return any key column information.

Автор: WinNet 7.10.2007, 13:32
Хм... Можно попробовать внести тзменения в DataSet и написать так DataAdapter.Update(dataSet). 


Автор: alxxx 29.10.2007, 00:10
Подскажите, как измененные данные из DataGridView  запихнуть обратно в базу?

Автор: uranpro 19.6.2009, 10:48
так и не ответили на 1 вопрос в теме!
Как создать базу данных(не таблицу) программно ?

Код

create database MyAcsDB

Автор: Экскалупатор 19.6.2009, 11:44
 smile 
uranpro, вопрос нашел свой ответ через два года.

Автор: uranpro 19.6.2009, 11:56
 smile 

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)