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

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Как работать с запросами? 
:(
    Опции темы
Fighter
Дата 12.7.2007, 02:51 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Блин, извините, совсем уж лол, себя не узнаю (хотя это мож после Delphi). Опять я загнулся на добавлении. Вот код:

Код

                String str;
                str = "INSERT INTO Disks" + Convert.ToChar(13);
                str += "(Disc_Name, Disc_Have, Disc_Type)" + Convert.ToChar(13);
                str += "values(" + "'" + addDisk.textBox1.Text + "', ";
                str += "'" + addDisk.textBox2.Text + "', ";
                str += "'" + addDisk.textBox3.Text + "')";
                if (oleDbConnection1.State == ConnectionState.Closed)
                {
                    oleDbConnection1.Open();
                }
                oleDbCommand1.CommandText = str;
                oleDbCommand1.ExecuteNonQuery();
                oleDbConnection1.Close();
                ds1.Disks.AcceptChanges();



Да, здесь без обновления. Но, мне хотя бы пока без обновления чтобы это все добавлялось в базу. Что же здесь не так (смысл надо оставить тем же, добавление через запросы) в реализации? Да, все объекты oledbCommand, oleDbDataAdapter - я уж пока что мышкой таскаю на форму. Пока что хватает. 
PM MAIL   Вверх
emmanuil
Дата 12.7.2007, 05:25 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Все должно работать, а в чем конкретно проблемма, что за ошибка?
Код

            using (OleDbConnection oleDbConnection1 = new OleDbConnection(<строка подключения>))
            {
                using (OleDbCommand oleDbCommand1 = oleDbConnection1.CreateCommand())
                {
                    StringBuilder sb = new StringBuilder("INSERT INTO Disks\n");
                    sb.Append("(Disc_Name, Disc_Have, Disc_Type)\n");
                    sb.Append("values(" + "'" + addDisk.textBox1.Text + "', ");
                    sb.Append("'" + addDisk.textBox2.Text + "', ");
                    sb.Append("'" + addDisk.textBox3.Text + "')");

                    oleDbCommand1.CommandText = sb.ToString();
                    oleDbConnection1.Open();
                    oleDbCommand1.ExecuteNonQuery();
                    //ds1.Disks.AcceptChanges(); // это тут не нужно, так как ты добавляешь запросом, чтобы отобразить изменения в наборе, нужно его переоткрыть
                }
            }
        }

addDisk - это внешняя форма? Если да, то лучше через свойства, а не делать компоненты public.
\n - можно не писать, а вместо этого можно сделать пробел.
PM MAIL   Вверх
emmanuil
Дата 12.7.2007, 05:49 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Если сервер у тебя Sql Server 2005 то используй пространство имен System.Data.SqlClient (мож для 2000-го тож подойдет, сам не пробовал).
Не рекомендую собирать sql код в коде программы, напиши лучше хранимку с параметрами и через нее работай (личное мнение). Если решишь, помогу с параметрами в ADO.NET. Я сам раньше писал на Delphi. технология ADO и ADO.NET кардинально отличаются друг от друга. В ADO.NET, все наборы данных не имеют постоянного коннекта с базой. Они локальные! А в ADO, они все связаны напрямую с базой. Поэтому в ADO.NET больше писанины для работы с базой. 
PM MAIL   Вверх
Fighter
Дата 12.7.2007, 06:13 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Цитата(emmanuil @  12.7.2007,  05:25 Найти цитируемый пост)
Все должно работать, а в чем конкретно проблемма, что за ошибка?



Фишка в том, что он все компилит нормально. Прага запускается и при исполнении этого кода рантаймовых ошибок нет. Он просто не добавляет запись в базу.

Добавлено через 40 секунд
Хм... Извините, что-то меня щас на мысль толкнуло. Я думаю, что все работает. Щас проверю.

Добавлено через 9 минут и 35 секунд
Да, все работает. Я при создании коннекта выбрал, чтобы база у меня вместе с компиляцией копировалась в папку с экзэшником. Да, щас добавляет. Ну, буду мучить обновление. 

Кстати, обновление, которое было написано выше я пробовал и он все равно таблицу не обновлял. Я программу не закрывал и поэтому он новую копию базы не делал, следовательно он должен был обновить.

Я вот что думаю, может быть дело такое. В моей таблице Disks есть поля (Disc_id, DIsc_Name, Disc_have, Disc_Type). Я при настройке DataAdapter'a при создании Select'a я выбрал только поля Disc_Name, Disc_Have, Disc_Type, поля Disc_id - я не выбрал. Из-за этого он при создании смог сгенерить только SelectCommand. А при обновлении используется OleDbCommandBuilder.GetUpdateCommand(). Мож он из-за этого неправильно формирует команду на обновление. 
PM MAIL   Вверх
Fighter
Дата 12.7.2007, 06:34 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Итак, совершенно случайно "нарвался" на рабочий вариант кода. Вот как оно вышло:

Код

                String str;
                str = "INSERT INTO Disks" + Convert.ToChar(13);
                str += "(Disc_Name, Disc_Have, Disc_Type)" + Convert.ToChar(13);
                str += "values(" + "'" + addDisk.textBox1.Text + "', ";
                str += "'" + addDisk.textBox2.Text + "', ";
                str += "'" + addDisk.textBox3.Text + "')";
                if (oleDbConnection1.State == ConnectionState.Closed)
                {
                    oleDbConnection1.Open();
                }
                oleDbCommand1.CommandText = str;
                oleDbCommand1.ExecuteNonQuery();
                oleDbConnection1.Close();
                ds1.Disks.Clear(); // Здесь Disks - класс таблицы дисков в наборе данных ds1
                Disks.Fill(ds1, "Disks"); // Здесь Disks - это oleDbDataAdapter


Если возможно объяснение вот этого, почему же этот вариант полностью работает. Добавляет запись в саму таблицу, да и еще DataGridView обновляет. Во, чудеса какие-то. Лана, ща дальше буду пробовать этот C#.

Добавлено через 46 секунд
Цитата(emmanuil @  12.7.2007,  05:49 Найти цитируемый пост)
Если решишь, помогу с параметрами в ADO.NET.


Спасибо, как доберусь - думаю топик создам, буду ждать пока ответишь. 
PM MAIL   Вверх
emmanuil
Дата 12.7.2007, 07:25 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



тут интересны только две строчки.
Совет: Если у тебя одна таблица, то не используй DataSet, а используй DataTable.
Код

ds1.Disks.Clear(); // Здесь Disks - класс таблицы дисков в наборе данных ds1
Disks.Fill(ds1, "Disks"); // Здесь Disks - это oleDbDataAdapter

ds1.Disks.Clear(); - очищает все записи в наборе
Disks.Fill(ds1, "Disks"); - заполняет занова нобор данных из базы
так как к гриду у тебя подцеплена эта таблица, то и в гриде данные отображаются

Добавлено через 3 минуты и 50 секунд
Цитата(emmanuil @  12.7.2007,  03:25 Найти цитируемый пост)
чтобы отобразить изменения в наборе, нужно его переоткрыть

Вот те две строчки, как раз это и делают
PM MAIL   Вверх
Fighter
Дата 12.7.2007, 14:32 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Цитата(emmanuil @  12.7.2007,  07:25 Найти цитируемый пост)
ds1.Disks.Clear(); - очищает все записи в набореDisks.Fill(ds1, "Disks"); - заполняет занова нобор данных из базытак как к гриду у тебя подцеплена эта таблица, то и в гриде данные отображаются


Т.е. он очищает записи не в самой базе, а в наборе. А потом заново туда данные заливает. Ясно. Спасибо.
Вроде все DML операции пашут. Надо будет щас попробовать выборку из 2 таблиц с ограничениями сделать. 
PM MAIL   Вверх
Ответ в темуСоздание новой темы Создание опроса
Прежде чем создать тему, посмотрите сюда:
stab
mr.DUDA
Exception

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

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

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


 




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


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

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