Модераторы: gambit
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Как выполнять запросы в БД (ACCESS), При создании доступа к ней создан Wizard 
:(
    Опции темы
Softaz
Дата 16.4.2006, 05:36 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


wasm
**


Профиль
Группа: Участник
Сообщений: 373
Регистрация: 16.1.2006

Репутация: 4
Всего: 16



Никак не могу понять простую вещь.
Мучаюсь с 2005.

Вообщем
1. кидаю на форму DataGridView, кликаем по треугольнику вверху, выбираем Choose Data Source --> Add Project Data Source...

2. Выбираю Database --> Next --> создаю новое подключение с БД ACCESS

3. Соглашаюсь сохранить в dataConnectionString (Yes, save the connection as)

4. Выбираю таблицы и поля, DataSet присваивается имя dataDataSet.

5. Жму Finish.
Создаются компоненты  myTableBindingSource, myTableDataSet, myTableTableAdapter

Теперь я могу изменять relation, выбирать, какие поля отображать.
Поставил bindingNavigator, в BindingSource указал myTableBindingSource.
Вообщем, все стандартно, имхо.

Проблема в том, что никак не могу понять, как, используя _эти_созданные_компоненты_, выполнять свои произвольные запросы в базу данных?
Например, сделать textBox и прямо в нем писать SELECT * FROM Table...?

Пример прикрепил в аттаче.

Заранее спасибо! 

Присоединённый файл ( Кол-во скачиваний: 42 )
Присоединённый файл  testDB.zip 106,93 Kb


--------------------
Разочарованный в .NET
PM MAIL WWW   Вверх
Ch0bits
Дата 16.4.2006, 10:30 (ссылка) |    (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


Python Dev.
****


Профиль
Группа: Завсегдатай
Сообщений: 2124
Регистрация: 21.2.2005
Где: Казань

Репутация: нет
Всего: 62



Эх... через мастера работать все молодцы, а надо сначала учиться всё вручную писать.  smile 

Код

        private void button1_Click(object sender, EventArgs e)
        {
            // Connection я взял из твоего myTableTableAdapter'а
            using (OleDbConnection conn = myTableTableAdapter.Connection)
            {
                try
                {
                    // Открываем соединение
                    conn.Open();
                }
                catch (OleDbException ex)
                {
                    MessageBox.Show(ex.Message);
                    return;
                }

                // Создаём транзакцию
                OleDbTransaction trans = myTableTableAdapter.Connection.BeginTransaction();

                // Создаём комманду
                OleDbCommand OC = new OleDbCommand("", myTableTableAdapter.Connection, trans);

                // Твой текстбокс и запросом
                OC.CommandText = textBox1.Text;

                try
                {
                    // Execute выбирай по вкусу, в зависимости от твоих целей
                    OC.ExecuteNonQuery();
                }
                catch (OleDbException ex)
                {
                    MessageBox.Show("Опа! Запрос навернулся! " + ex.Message);
                    trans.Rollback(); // Делаем откат изменений
                    return;
                }

                // Если всё ОК, то проводим транзакцию
                trans.Commit();
            }
        }
 
PM WWW   Вверх
Softaz
Дата 16.4.2006, 13:06 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


wasm
**


Профиль
Группа: Участник
Сообщений: 373
Регистрация: 16.1.2006

Репутация: 4
Всего: 16



А почему не происходит заполнение?
Код

// ...
//Провели транзакцию
this.myTableTableAdapter.Fill(this.dataDataSet.MyTable);


Еще один вопрос.
Создается Fill (Query), у которого есть параметр CommandText, MyTableTableAdapter с подобными параметрами, куда вписываются соответствующие SQL-команды.
Их как-либо можно менять в runtime, чтобы примерно следующее:

Код

Fill.CommandText = "SELECT id FROM myTable WHERE id = 1";
this.myTableTableAdapter.Fill(this.dataDataSet.MyTable);
//В результате в гриде отобразятся записи, удовлетворяющие условию.


Заранее спасибо. 


--------------------
Разочарованный в .NET
PM MAIL WWW   Вверх
Ch0bits
Дата 16.4.2006, 13:26 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Python Dev.
****


Профиль
Группа: Завсегдатай
Сообщений: 2124
Регистрация: 21.2.2005
Где: Казань

Репутация: нет
Всего: 62



Если проще, то:
Ты можешь на схеме данных в своей таблице вызвать меню Add->Query и создать произвольный запрос с помощью мастера. При этом в дата адаптере таблицы появится метод заполнения с именем твоего запроса. 
PM WWW   Вверх
Softaz
Дата 16.4.2006, 15:48 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


wasm
**


Профиль
Группа: Участник
Сообщений: 373
Регистрация: 16.1.2006

Репутация: 4
Всего: 16



При этом в дата адаптере таблицы появится метод заполнения с именем твоего запроса. 
Есть, только никак не пойму, как его менять в рантайме.
Допустим, создал я FillBy.
При создании в CommandText написал SELECT id, field1, filed2, field3 FROM MyTable
При его вызове выведутся все данные из таблицы, что очевидно.

Теперь мне захотелось организовать поиск по таблице.
Так вот как заменить строку запроса к БД в рантайм (например, на SELECT id FROM MyTable) у этого FillBy я и не знаю.

Пока написал такой код и поместил его в *.Designer.cs

Код

        public System.Data.OleDb.OleDbCommand[] _cCollection;
        [System.Diagnostics.DebuggerNonUserCodeAttribute()]
        [System.ComponentModel.Design.HelpKeywordAttribute("vs.data.TableAdapter")]
        [System.ComponentModel.DataObjectMethodAttribute(System.ComponentModel.DataObjectMethodType.Fill, false)]
        public virtual int FillBy000(dataDataSet.MyTableDataTable dataTable, string str)
        {  
            this._cCollection = new System.Data.OleDb.OleDbCommand[1];
            this._cCollection[0] = new System.Data.OleDb.OleDbCommand();
            this._cCollection[0].Connection = this.Connection;
            this._cCollection[0].CommandText = str;
            this._cCollection[0].CommandType = System.Data.CommandType.Text;
            this.Adapter.SelectCommand = this._cCollection[0];
            if ((this.ClearBeforeFill == true)) {
                dataTable.Clear();
            }
            int returnValue = this.Adapter.Fill(dataTable);
            return returnValue;
        }


Соответственно, вызываю

Код

            try
            {
                this.myTableTableAdapter.FillBy000(this.dataDataSet.MyTable, "SELECT id, field1, filed2 FROM MyTable WHERE id > 3");
            }
            catch (System.Exception ex)
            {
                System.Windows.Forms.MessageBox.Show(ex.Message);
            }


Вот примерно этого добиваюсь.
Не подходит потому, что каждый раз при изменении в Designer'е, код переписывается и приходится его копировать.
Как делать вручную без мастера я знаю, только это ооочень долго будет: полно таблиц и связей.


--------------------
Разочарованный в .NET
PM MAIL WWW   Вверх
alir
Дата 16.4.2006, 16:24 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 383
Регистрация: 19.3.2005

Репутация: нет
Всего: 4



Softaz
Цитата

А почему не происходит заполнение?


Все-таки лучше писать своими руками - там провереннее.
Код

DataSet4 ds2 = new DataSet4();
DataSet3TableAdapters.UsdataTableAdapter dsAdapter = new DataSet3TableAdapters.UsdataTableAdapter();
dsAdapter.Fill(ds.Usdata);


Что ты имеешь ввиду под runtime? Неужели задача не решается через обычные oledbcommands? 
PM MAIL ICQ   Вверх
Softaz
Дата 16.4.2006, 18:19 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


wasm
**


Профиль
Группа: Участник
Сообщений: 373
Регистрация: 16.1.2006

Репутация: 4
Всего: 16



Что ты имеешь ввиду под runtime?
Изменение параметра CommandText у Query Fill, создаваемым мастером во время работы программы. Например, по нажатию на кнопку, в переменную занесся некоторая динамически формируемая строка и запрос выполнился (Fill(...)).

Неужели задача не решается через обычные oledbcommands? 
Решается. Таблиц много, полно связей, так что мастером намного быстрее.
Создавать новые oledbcommands, потом использовать их не хочется.
Просто если есть возможность задания своих Query, хочется узнать как ей пользоваться. 


--------------------
Разочарованный в .NET
PM MAIL WWW   Вверх
albert21
Дата 16.4.2006, 23:20 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 166
Регистрация: 10.1.2006

Репутация: нет
Всего: нет



Есть вариант использования DataView, его можно сортировать и фильтровать
Код

DataView dw=new DataView(dataSet.Table1);
dw.RowFilter="id="+Convert.ToString(per);


Или так:
Код

DataRow[] foundRows;    
foundRows = table.Select( "Фамилия Like '%ро%'" );


Вариации можно разные придумать, при этом работа ведётся в локальной копии БД, а не по сетке!
Правда вопрос есть открытый! Как выполнить подобную выборку из нескольких таблиц? 
--------------------
http://www.certifications.ru/publicresults.php?tu_id=45939
PM MAIL   Вверх
Softaz
Дата 24.4.2006, 19:29 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


wasm
**


Профиль
Группа: Участник
Сообщений: 373
Регистрация: 16.1.2006

Репутация: 4
Всего: 16



Вот так можно:
Код

             //Переход на запись
             int index = bindingSource1.Find("MyField", "334");
             if (index != -1)
             {
                 bindingSource1.Position = index;
             }


Код

            //Поиск записи. SQL поддерживается
            bindingSource1.Filter = "MyField Like '%33%'";

 


--------------------
Разочарованный в .NET
PM MAIL WWW   Вверх
voiger
Дата 22.1.2008, 13:20 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 3
Регистрация: 7.6.2007
Где: Украина, Запорожь е

Репутация: нет
Всего: нет



про wizard, почему не обновляются данные в базе:
http://msdn2.microsoft.com/en-us/library/ms246989.aspx

UPD: т.е. если у вас не обновляются данные в базе, возможно вы на вопрос Wizard'a "А не хотите ли скопировать базу в дирректорию проекта?" ответили "хочу". После этого визард мало того, что поместил базу в дирректорию с *.csproj-файлом, но и копирует её каждый раз при компиляции проекта в bin. Обо всём этом написано в MSDN (см. ссылку выше)

Это сообщение отредактировал(а) voiger - 22.1.2008, 16:37
PM MAIL ICQ   Вверх
thomas
Дата 22.1.2008, 15:48 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Доцент... почти
***


Профиль
Группа: Завсегдатай
Сообщений: 1385
Регистрация: 3.10.2006
Где: " Сказочное королевство"

Репутация: 35
Всего: 65



voiger
Приветствую на форуме.  smile 

Вы задали очень "понятный" вопрос. Поясните ситуацию и задайте более конкретный вопрос. Иначе никто не сможет вам помоч.


--------------------
Крепко жму горло, искренне ваш Thomas. (С)vingrad
Некоторые сорта флоры буквально за одно мгновение превращают нас в фауну!
Проблемы негров шерифа не волнуют.
PM MAIL   Вверх
voiger
Дата 22.1.2008, 16:33 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 3
Регистрация: 7.6.2007
Где: Украина, Запорожь е

Репутация: нет
Всего: нет



thomas
это ответ smile))

У человека "не выполнялись запросы". Они выполнялись, но в другой БД, в скопированной в bin-дирректорию проекта, а он смотрел, скорее всего (как и я), в исходную БД. 
Сам разобрался, решил людям помочь smile
PM MAIL ICQ   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Прежде чем создать тему, посмотрите сюда:
stab
mr.DUDA
Exception

Используйте теги [code=csharp][/code] для подсветки кода. Используйтe чекбокс "транслит" если у Вас нет русских шрифтов.

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, stab, mr.DUDA, Exception.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Базы данных под .NET | Следующая тема »


 




[ Время генерации скрипта: 0.0817 ]   [ Использовано запросов: 21 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.