powered by simpleCommunicator - 2.0.56     © 2025 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / WinForms, .Net Framework [игнор отключен] [закрыт для гостей] / SQL запрос в С# на FireBird
67 сообщений из 67, показаны все 3 страниц
SQL запрос в С# на FireBird
    #38437466
greshnik_05
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Имеется 4 текстбокса на форме и есть кнопка по нажатию которй происходит UPDATE запрос на сервер FireBird.
Проблема в том что этот UPDATE запрос не идет, данные не обновляются в чем может быть причина?
Код прилагается.

Код: c#
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
 private void btnSave_Click(object sender, EventArgs e)
        {

            string SQLString = "Update SPR_SVOI SET name = '" + textBox1.Text + "', dir = '" + textBox2.Text + "', tel = '" + textBox3.Text + "', email = '" + textBox4.Text + "'";
            FbCommand UpdateCommand = new FbCommand(SQLString, frmGeneral.fbConnection);
            
            if (frmGeneral.fbConnection.State == ConnectionState.Closed)
            {
                frmGeneral.fbConnection.Open();
            }

            FbTransaction fbTransact = frmGeneral.fbConnection.BeginTransaction();// стартуем транзакцию
            UpdateCommand.Transaction = fbTransact;
           
            try
            {
                UpdateCommand.ExecuteNonQuery();//выполняем запрос на UPDATE
                fbTransact.Commit();// коммит транзакции если запрос прошел успешно
            }
            catch (FbException fbex)
            {
                MessageBox.Show(fbex.Message, "Внимание!");
            }
            catch (Exception ex)
            {
                MessageBox.Show(ex.Message, "Внимание!!!");
            }
            finally
            {
                UpdateCommand.Dispose();//в документации написано, что ОЧЕНЬ рекомендуется убивать объекты этого типа, если они больше не нужны
                frmGeneral.fbConnection.Close();
            }
            
        }




Этот Update запрос выполнял в IBExperte'e там всё норма. Перенес сюда - не пашет. (((
...
Рейтинг: 0 / 0
SQL запрос в С# на FireBird
    #38437546
Alex Kuznetsov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
greshnik_05,

Хрустальный шар говорит, что проблема в 150-й строке...
...
Рейтинг: 0 / 0
SQL запрос в С# на FireBird
    #38437562
greshnik_05
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Хрустальный шар ошибся, там нет столько строк!
...
Рейтинг: 0 / 0
SQL запрос в С# на FireBird
    #38437581
Фотография Изопропил
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Код: c#
1.
"Update SPR_SVOI SET name = '" + textBox1.Text + "', dir = '" + textBox2.Text + "', tel = '" + textBox3.Text + "', email = '" + textBox4.Text + "'"


ну-ну
...
Рейтинг: 0 / 0
SQL запрос в С# на FireBird
    #38437594
Alex Kuznetsov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
greshnik_05,

Ну, ежели так, то что говорят сообщения об ошибке?
Отладчиком пробовали проходить?
Соединение правильно настроено?

В общем, хрустальный шар говорит, что ХЗ пока что в чём ошибка...
...
Рейтинг: 0 / 0
SQL запрос в С# на FireBird
    #38437596
Фотография Где-то в степи
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Alex Kuznetsov,
посмотрите сколько строк затронуто запросом, или там вообще 0, ели вернет все строки, это же ламмерский запрос, модифицирует все строки в таблице, да еще ..... .. ( махнул рукой )
...
Рейтинг: 0 / 0
SQL запрос в С# на FireBird
    #38437670
Pallaris
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
1. Держать глобальный объект соединения и тем паче проверять на открытость не нужно - делаешь для любого запроса всегда так
Код: c#
1.
2.
3.
4.
5.
using (FbCOnnection conn_ = new FbConnection(connectionString))
{
     conn_.Open();
     ....
}


по выходу из using соединение сделает Dispose само
2. Транзакция здесь не нужна - в ней вообще смысла нет
3. Где 'where' в запросе - или ты все строки в таблице заапдейтить хочешь.
4. Запрос хоть и маленький, но лучше все параметры оформлять как параметры, а не формировать запрос вручную - так избавишься от проблем преобразования типов и дурацких ошибок
...
Рейтинг: 0 / 0
SQL запрос в С# на FireBird
    #38437675
Pallaris
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
5. И не надо такой код писать в обработчике нажатия кнопки. Надо так
Код: c#
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
private void btnSave_Click(object sender, EventArgs e)
{
     if (DoSomeShit())
     {
          MessageBox("Получилось!");
     }
}

public bool DoSomeShit()
{
     ....
     return boolResult;
}
...
Рейтинг: 0 / 0
SQL запрос в С# на FireBird
    #38437992
greshnik_05
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Учитывая все вышеописанные замечания, переделаю и отпишусь в случае чего. Спасибо!
...
Рейтинг: 0 / 0
SQL запрос в С# на FireBird
    #38438020
greshnik_05
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Ах да... Код программы писал исходя из этой статьи
тынц
...
Рейтинг: 0 / 0
SQL запрос в С# на FireBird
    #38438098
Фотография Где-то в степи
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
greshnik_05,
не читайте разные глупости, тем более любителей д. донцовой
автор Информации по этой теме оказалось катастрофически мало как на русском, так и на английском. Кроме документации по Firebird ADO.NET Data Provider, в принципе, ничего больше нет.
в технологии доступа используется ado.net подостренный на интерфейсах, и абсолютно никакой разницы нет к какому хранилищу обращаться от поставщика данных net, отсюда следует, что можно исполнить такой код, что модифицируя пару строчек этого кода,
можно обратиться к любому типу хранилищ ( при условии что к нему реализован поставщик). То есть вы должны видеть стратегию решения, реализуемою через интерфейсы, а тактика - это плюшки корыте разработчики провайдеров добавили в свои длл..
...
Рейтинг: 0 / 0
SQL запрос в С# на FireBird
    #38438108
Фотография Где-то в степи
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
greshnik_05,
вот что бы было понятно, задание..
Напиши код получения данных
1 какой тип хранилища - не знаю пока...
2 строка подключения - не знаю пока...
3 строка запроса - не знаю пока...
...
Рейтинг: 0 / 0
SQL запрос в С# на FireBird
    #38438113
Фотография Где-то в степи
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
о плюшках, если не изменяет память там уже реализована форма для собирания строки подключения...
...
Рейтинг: 0 / 0
SQL запрос в С# на FireBird
    #38438324
greshnik_05
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Где-то в степи, спасибо я учту
...
Рейтинг: 0 / 0
SQL запрос в С# на FireBird
    #38438368
Фотография Где-то в степи
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
greshnik_05,
вот почитайте про стандартизацию http://professorweb.ru/my/ADO_NET/base/level1/1_2.php
...
Рейтинг: 0 / 0
SQL запрос в С# на FireBird
    #38438417
greshnik_05
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Где-то в степиgreshnik_05,
вот почитайте про стандартизацию http://professorweb.ru/my/ADO_NET/base/level1/1_2.php
ОК

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

Код: c#
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
58.
59.
60.
61.
62.
63.
64.
65.
66.
67.
68.
69.
70.
71.
72.
73.
74.
private bool UpdateCommand()
        {
            using (FbConnection fbConnect = new FbConnection(frmGeneral.fbConnectionString.ToString()))
            {
                //открываем подключение
                fbConnect.Open();
                //создаем новую команду на UPDATE
                FbCommand SQLCommand = new FbCommand("Update SPR_SVOI SET NAME = @NAME, DIR = @DIR, TEL = @TEL, EMAIL = @EMAIL WHERE ID = 1", fbConnect);

                //обьявляем обьект класса FbParameter
                FbParameter parameter = new FbParameter();
                //задаем имя параметра
                parameter.ParameterName = "@NAME";
                //задаем значение параметра
                parameter.Value = textBoxName.Text;
                //задаем тип параметра
                parameter.FbDbType = FbDbType.VarChar;
                //передаем параметр обьекту класса FbCommand
                SQLCommand.Parameters.Add(parameter);

                //переопределяем обьект класса FbParameter
                parameter = new FbParameter();
                //задаем имя параметра
                parameter.ParameterName = "@DIR";
                //задаем значение параметра
                parameter.Value = textBoxDirector.Text;
                //задаем тип параметра
                parameter.FbDbType = FbDbType.VarChar;
                //передаем параметр обьекту класса FbCommand
                SQLCommand.Parameters.Add(parameter);

                //переопределяем обьект класса FbParameter
                parameter = new FbParameter();
                //задаем имя параметра
                parameter.ParameterName = "@TEL";
                //задаем значение параметра
                parameter.Value = textBoxTelefon.Text;
                //задаем тип параметра
                parameter.FbDbType = FbDbType.VarChar;
                //передаем параметр обьекту класса FbCommand
                SQLCommand.Parameters.Add(parameter);

                //переопределяем обьект класса FbParameter
                parameter = new FbParameter();
                //задаем имя параметра
                parameter.ParameterName = "@EMAIL";
                //задаем значение параметра
                parameter.Value = textBoxEmail.Text;
                //задаем тип параметра
                parameter.FbDbType = FbDbType.VarChar;
                //передаем параметр обьекту класса FbCommand
                SQLCommand.Parameters.Add(parameter);

                //выполняем запрос 
                try
                {
                    SQLCommand.ExecuteNonQuery();
                    return true;
                }
                catch (FbException FbExcept)
                {
                    MessageBox.Show("Сообщение ошибки: " + FbExcept.Message + ". Номер ошики: " + FbExcept.ErrorCode.ToString(), "Вниание!!!");
                    return false;
                }
            }//using; по выходу из using соединение сделает Dispose само
        }

private void btnSave_Click(object sender, EventArgs e)
        {
            if (UpdateCommand())
            {
                MessageBox.Show("Данные успешно сохраннены!", "Внимание!!!");
            }
        }


...
Рейтинг: 0 / 0
SQL запрос в С# на FireBird
    #38438678
Arm79
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
greshnik_05,

1) SqlCommand тоже поддерживает IDisposable
2) Разве у SqlCommand.Parameters нет метода AddWithValue?
3) Имеет ли смысл именно в приватном методе делать обработку ошибок? К тому же у вас просто перехватываются FbException. Это значит, что при отваливании сети ошибка может быть не обработана. Нужно еще ApplicationException/Exception
...
Рейтинг: 0 / 0
SQL запрос в С# на FireBird
    #38441692
greshnik_05
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Как правильно обновить gridview (DevExpress) ну или обычный datagridview после добавления, редактирования и удаления одной строки в таблице?
В данный момент я делаю так. Создал функцию заполнения gridview'а (использую DevExpress компонент)и вызываю данную функцию (код прилагается нижу) после вышеописанных событий. При большом объеме данных такой метод вызовет ахтунг. Как этого избежать?

Код: c#
1.
2.
3.
4.
5.
6.
7.
private void InitializeGridView()
        {
            FbDataAdapter fbDataAdapter = new FbDataAdapter("Select * From spr_mfc", FireBird.fbConnectionString.ToString());
            DataSet fbDataSet = new DataSet();
            fbDataAdapter.Fill(fbDataSet);
            gridControl1.DataSource = fbDataSet.Tables[0];
        }
...
Рейтинг: 0 / 0
SQL запрос в С# на FireBird
    #38441712
Pallaris
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
greshnik_05,

не загружать весь объем данных
...
Рейтинг: 0 / 0
SQL запрос в С# на FireBird
    #38441729
greshnik_05
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
как правильно это сделать??? сделать select запрос где id = последняя добавленная запись, а потом добавить результат в датагрид к уже имеющимся данным???
...
Рейтинг: 0 / 0
SQL запрос в С# на FireBird
    #38441733
Pallaris
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
К тому же, если ты изменяешь, добавляешь или удаляешь запись через грид и биндингсурс, то ничего обновлять как-бы и не надо - все уже на экране. Просто Adapter.Update() да и все.
...
Рейтинг: 0 / 0
SQL запрос в С# на FireBird
    #38441740
Pallaris
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
greshnik_05как правильно это сделать???

Например можно использовать постраничный вывод.
Код: c#
1.
select first 20 skip 20 * from table



даст тебе 20 записей начиная с 21ой
...
Рейтинг: 0 / 0
SQL запрос в С# на FireBird
    #38441746
greshnik_05
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
PallarisК тому же, если ты изменяешь, добавляешь или удаляешь запись через грид и биндингсурс, то ничего обновлять как-бы и не надо - все уже на экране. Просто Adapter.Update() да и все.

Нет. я делаю это следующим образом по кнопке Добавить (Изменить) выводится новое окно где есть текстбоксы и 2 кнопки Сохранить и Закрыть. Забиваю данные в текстбоксы и жму кнопку Сохранить. А потом после закрытия формы вызызваю выше описанную функцию которая заново датагрид и заполняет. Вот!
...
Рейтинг: 0 / 0
SQL запрос в С# на FireBird
    #38441756
Pallaris
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
greshnik_05,
Все неправильно.
К BindingSource прицеплен DataTable
По кнопке "Сохранить" должны выполняться операции с BindingSource (AddNew - если добавить, поменять current - если изменить). После этого вызываешь Adapter.Update(DataTable). У Adaptera должны быть настроены команды Update, Delete, Insert
...
Рейтинг: 0 / 0
SQL запрос в С# на FireBird
    #38441771
Фотография Где-то в степи
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
greshnik_05, поплыл........
а кто знает почему в селекте писать (*) стрёмно?
...
Рейтинг: 0 / 0
SQL запрос в С# на FireBird
    #38441786
carrotik
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Где-то в степиа кто знает почему в селекте писать (*) стрёмно?

... ну, разве что индексы могут не работать ....
...
Рейтинг: 0 / 0
SQL запрос в С# на FireBird
    #38441814
Arm79
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Где-то в степи,

Звездочка плоха по нескольким причинам. В таблице может поменяться набор полей и порядок их следования. Получишь трудноуловимую ошибку. Еще она приводит к выборке всех полей, хотя реально нужно меньше. Самый шик, когда в набор попадает ненужный блоб
...
Рейтинг: 0 / 0
SQL запрос в С# на FireBird
    #38441824
Фотография Где-то в степи
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ну в общем то да, избыточность данных, а отсюда не оптимальная внутренняя планировка запроса, предположим вытащить покровный индекс ,а он будет перелопачивать основную таблицу.
еще читал вот такую фитчу, при звездочке планировщик делает лишние телодвижения перед выборкой "создание контекста запроса", лезет вытаскивать все "метаданные" таблицы вместо проверки на ключ указанного поля..
...
Рейтинг: 0 / 0
SQL запрос в С# на FireBird
    #38441838
Arm79
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Где-то в степину в общем то да, избыточность данных, а отсюда не оптимальная внутренняя планировка запроса, предположим вытащить покровный индекс ,а он будет перелопачивать основную таблицу.
еще читал вот такую фитчу, при звездочке планировщик делает лишние телодвижения перед выборкой "создание контекста запроса", лезет вытаскивать все "метаданные" таблицы вместо проверки на ключ указанного поля..

Зависит от оптимизатора.

Например, в MS SQL запросы типа exists (select * from ) и exists (select 1 from ) ничем не отличаются.
...
Рейтинг: 0 / 0
SQL запрос в С# на FireBird
    #38441848
Фотография Где-то в степи
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Arm79,
а что им отличаться то, это предикат типа Any, он как бы полной выборки не производит, а берет первое значение итерации и отваливает.
count в себе на вряд ли содержит.
при звездочке или наличии пользовательского поля и отсутствия where и я был бы оптимизатор, я бы полез в метеоданные таблицы и дернул там число записей ( сомневаюсь что такой штуки там нет) а если бы было where я бы построил полный запрос и при первой итерации заполнения буфера вывода отвалил бы..
...
Рейтинг: 0 / 0
SQL запрос в С# на FireBird
    #38443188
greshnik_05
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Извиняюсь за свой долгий оффлайн!

Pallarisgreshnik_05,
Все неправильно.
К BindingSource прицеплен DataTable
По кнопке "Сохранить" должны выполняться операции с BindingSource (AddNew - если добавить, поменять current - если изменить). После этого вызываешь Adapter.Update(DataTable). У Adaptera должны быть настроены команды Update, Delete, Insert

Я так понимаю вышеописанные действия осуществляются в том случае если я с данными работаю прямо в гриде. Ну то есть изменяю, добавляю или редактирую данные прямо в сетке грида???
...
Рейтинг: 0 / 0
SQL запрос в С# на FireBird
    #38443213
Pallaris
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
greshnik_05,

нет, не правильно. С BindingSource ты можешь хоть через консоль работать, грид тут ни при чем.
...
Рейтинг: 0 / 0
SQL запрос в С# на FireBird
    #38443227
greshnik_05
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Pallaris, то есть вместо прямых запросов к бд через FbCommand я должен организовать все запросы через dataadapter с настройкой
Update, delete, insert?
...
Рейтинг: 0 / 0
SQL запрос в С# на FireBird
    #38443245
greshnik_05
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
И вызываю их потом. Например для добавления данных в БД нажимаю "Сохранить" а в обработчике на сохранить использую INSERT.
для удаления - delete, редактирования - update. Я правильно вас понял?
...
Рейтинг: 0 / 0
SQL запрос в С# на FireBird
    #38443260
Pallaris
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
greshnik_05И вызываю их потом.

Нет, вызывать нужно только adapter.Update(твой table) - он сам уже сделает инсерты, апдейты и делиты. Т.е., работая с BindingSource, ты изменяешь свой DataTable в памяти, а адаптер по этому измененному DataTable сам внесет изменения в БД
...
Рейтинг: 0 / 0
SQL запрос в С# на FireBird
    #38443280
greshnik_05
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
[quot Pallaris
ты изменяешь свой DataTable в памяти, а адаптер по этому измененному DataTable сам внесет изменения в БД[/quot]
А каким образом изменить DataTable в памяти? не подскажите?(только сильно не ругайтесь)
...
Рейтинг: 0 / 0
SQL запрос в С# на FireBird
    #38443293
greshnik_05
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Код: c#
1.
2.
3.
4.
5.
fbDataAdapter = new FbDataAdapter(SQLcommand, FireBird.fbConnectionString.ToString());
FbCommandBuilder fbCommand = new FbCommandBuilder (fbDataAdapter);

fbDataAdapter.Fill(table);
bindingSource.DataSource = table;



а потом вызвать adapter.Update(table)?
...
Рейтинг: 0 / 0
SQL запрос в С# на FireBird
    #38443299
greshnik_05
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
где SQLcommand это sql запрос на добавление, удаление и выборку.
...
Рейтинг: 0 / 0
SQL запрос в С# на FireBird
    #38443312
Pallaris
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
greshnik_05А каким образом изменить DataTable в памяти? не подскажите?(только сильно не ругайтесь)

[src c#]
bindingSrc_.DataSource = dataTable_;
dataGridView_.DataSource = bindingSrc_;
....
// добавление новой DataRow к DataTable
bindingSrc_.AddNew();
...

// изменение текущей записи
(bindingSrc_.current as DataRow)["поле1"] = someValue;
...

//удаление текущей записи
bindingSrc_.RemoveCurrent();
...

// запись изменений в БД
adapter.Update(dataTable_);
[src c#]

ну и с удалением
...
Рейтинг: 0 / 0
SQL запрос в С# на FireBird
    #38443322
Pallaris
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Блин, криворукость...

Код: c#
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
dataAdapter_.SelectCommand = new FbCommand(..);
dataAdapter_.InsertCommand = new FbCommand(...);
dataAdapter_.DeleteCommand = new FbCommand(...);
dataAdapter_.UpdateCommand = new FbCommand(...);

dataAdapter_.Fill(dataTable_);
bindingSrc_.DataSource = dataTable_;
dataGridView_.DataSource = bindingSrc_;
....
// добавление новой DataRow к DataTable
bindingSrc_.AddNew();
...

// изменение текущей записи
(bindingSrc_.current as DataRow)["поле1"] = someValue;
...

//удаление текущей записи
bindingSrc_.RemoveCurrent();
...

// запись изменений в БД
dataAdapter_.Update(dataTable_);
...
Рейтинг: 0 / 0
SQL запрос в С# на FireBird
    #38443688
greshnik_05
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Что то ничего не выходит.
Код: c#
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
58.
59.
60.
61.
62.
63.
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;
using FirebirdSql.Data.FirebirdClient;
using MFC_Statistica;

namespace Test
{
    public partial class Form1 : Form
    {
        
        FbDataAdapter fbDataAdapter = new FbDataAdapter();
        BindingSource bindingSource = new BindingSource();
        DataTable table = new DataTable();
        FbConnection fbConnect = new FbConnection(FireBird.fbConnectionString.ToString());

        public Form1()
        {
            InitializeComponent();

            fbDataAdapter.SelectCommand = new FbCommand("Select id, name, path From spr_mfc", fbConnect);
            fbDataAdapter.InsertCommand = new FbCommand("Insert Into spr_mfc (name, path) Values (@NAME, @PATH)", fbConnect);
            fbDataAdapter.UpdateCommand = new FbCommand("Update spr_mfc SET name = @NAME, path = @PATH where id = @ID", fbConnect);
            fbDataAdapter.DeleteCommand = new FbCommand("Delete From spr_mfc where id = @ID", fbConnect);

            fbDataAdapter.InsertCommand.Parameters.Add("@NAME", FbDbType.VarChar, 150, "name");
            fbDataAdapter.InsertCommand.Parameters.Add("@PATH", FbDbType.VarChar, 70, "path");

            fbDataAdapter.UpdateCommand.Parameters.Add("@NAME", FbDbType.VarChar, 150, "name");
            fbDataAdapter.UpdateCommand.Parameters.Add("@PATH", FbDbType.VarChar, 70, "path");
            fbDataAdapter.UpdateCommand.Parameters.Add("@ID", FbDbType.Integer, 5, "id");

            fbDataAdapter.DeleteCommand.Parameters.Add("@ID", FbDbType.Integer, 5, "id");

            fbDataAdapter.Update(table);
            table.AcceptChanges();
        }

        private void Form1_Load(object sender, EventArgs e)
        {
            fbDataAdapter = new FbDataAdapter("select id, name, path from spr_mfc", FireBird.fbConnectionString.ToString());
            FbCommandBuilder fbCommand = new FbCommandBuilder(fbDataAdapter);

            fbDataAdapter.Fill(table);
            bindingSource.DataSource = table;
            gridControl1.DataSource = bindingSource;
        }

        private void btnAdd_Click(object sender, EventArgs e)
        {
            table.Rows[table.Rows.Count-1].SetField("name", "name1");
            table.Rows[table.Rows.Count-1].SetField("path", "path1");
            fbDataAdapter.Update((DataTable)bindingSource.DataSource);

        }
    }
}


По нажатию кнопки записи в строке table.Rows.Count-1 меняются на те которые я указал и данные сохраняются. Это единственное что получилось.

После bindingSource.AddNew(); в гриде появляется новая строка. а как данные добавить туда так и не понял. пробовал так
Код: c#
1.
2.
3.
4.
5.
bindingSource.AddNew();
fbDataAdapter.Update((DataTable)bindingSource.DataSource);
(bindingSource.Current as DataRow)["name"] = "1name";
(bindingSource.Current as DataRow)["path"] = "1path";
fbDataAdapter.Update((DataTable)bindingSource.DataSource);


Но не выхоит. Указывает на (bindingSource.Current as DataRow)["name"] = "1name"; и пишет ссылка на объект не эказывает на экземпляр объекта.
Как правильно добавить то данные???
...
Рейтинг: 0 / 0
SQL запрос в С# на FireBird
    #38443816
Pallaris
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
greshnik_05,

добавление

Код: c#
1.
2.
3.
DataRow newRow_ = bindingSource.AddNew() as DataRow;
newRow_["..."]=...;
adapter.Update(...);
...
Рейтинг: 0 / 0
SQL запрос в С# на FireBird
    #38443844
greshnik_05
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Pallaris,
Код: c#
1.
2.
3.
4.
5.
6.
7.
private void btnAdd_Click(object sender, EventArgs e)
        {
            DataRow row = bindingSource.AddNew() as DataRow;
            row["name"] = "NewName1";
            row["path"] = "NewPath1";
            fbDataAdapter.Update((DataTable)bindingSource.DataSource);
        }



row["name"] = "NewName1"; указывает на эту строку и пишет ошибку сылка на объект не указывает на экземпляр объекта
...
Рейтинг: 0 / 0
SQL запрос в С# на FireBird
    #38443849
Pallaris
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
greshnik_05,

сделай
Код: c#
1.
object obj_ = source_.AddNew();



и посмотри в дебагере, какого типа obj_, - может, он не не DataRow, я не помню
...
Рейтинг: 0 / 0
SQL запрос в С# на FireBird
    #38443904
greshnik_05
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Код: c#
1.
2.
3.
4.
5.
6.
7.
8.
 DataRowView row = bindingSource.AddNew() as DataRowView;
            //bindingSource.RemoveCurrent();//удалить текущую запись
            row["name"] = "NewName1";
            row["path"] = "NewPath1";
                
            //table.Rows[table.Rows.Count-1].SetField("name", "name");
            //table.Rows[table.Rows.Count-1].SetField("path", "path");
            fbDataAdapter.Update((DataTable)bindingSource.DataSource);


Вот так работает! Данные отображаются в гриде. Но данные не сохраняются! и ID поле не увеличивается на 1.
...
Рейтинг: 0 / 0
SQL запрос в С# на FireBird
    #38443922
Pallaris
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
greshnik_05,

а обновление и удаление работает?
...
Рейтинг: 0 / 0
SQL запрос в С# на FireBird
    #38443934
greshnik_05
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Вот так я удаляю запись, все работает.
Код: c#
1.
2.
bindingSource.RemoveCurrent();//удалить текущую запись
fbDataAdapter.Update((DataTable)bindingSource.DataSource);



А вот так я изменяю запись
Код: c#
1.
2.
3.
 table.Rows[table.Rows.Count-1].SetField("name", "name");
            table.Rows[table.Rows.Count-1].SetField("path", "path");
            fbDataAdapter.Update((DataTable)bindingSource.DataSource);


где table.Rows.Count-1 номер последней строки в гриде. Пока только так.
...
Рейтинг: 0 / 0
SQL запрос в С# на FireBird
    #38443939
Фотография МСУ
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Фиребирд ещё не подохло?
...
Рейтинг: 0 / 0
SQL запрос в С# на FireBird
    #38443940
Pallaris
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
не работает только insert, я правильно понял?
...
Рейтинг: 0 / 0
SQL запрос в С# на FireBird
    #38443941
Pallaris
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
МСУ,

не, норм
...
Рейтинг: 0 / 0
SQL запрос в С# на FireBird
    #38443947
greshnik_05
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
МСУФиребирд ещё не подохло?
Нет он жив.

Pallarisне работает только insert, я правильно понял?
Да


Редактирование текущей записи делаю так

Код: c#
1.
2.
3.
(bindingSource.Current as DataRowView)["name"] = "newName1";
(bindingSource.Current as DataRowView)["path"] = "newPath1";
fbDataAdapter.Update((DataTable)bindingSource.DataSource);
...
Рейтинг: 0 / 0
SQL запрос в С# на FireBird
    #38443950
Фотография МСУ
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
PallarisМСУ, не, норм
Ну тухляк же для дельфовых поделок, не?

greshnik_05Нет он жив.
Мдя...
...
Рейтинг: 0 / 0
SQL запрос в С# на FireBird
    #38443952
Pallaris
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
greshnik_05,

С виду команда insert рабочая. id - автоинкрементное поле, генерируется автоматом по триггеру? Никаких ошибок не падает при adapter.Update() после AddNew()? Точно не добавляется запись - или, может, не заметил?
...
Рейтинг: 0 / 0
SQL запрос в С# на FireBird
    #38443957
Pallaris
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
МСУ,

ну, мелкие задачки выполняет, жрать не просит.
...
Рейтинг: 0 / 0
SQL запрос в С# на FireBird
    #38443974
greshnik_05
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Id генерируется по тригеру.
Запись в БД не добавляется. Но новая строка в гриде появляется с заданными значениями, кроме поля id оно пустое авто генерация не происходит
...
Рейтинг: 0 / 0
SQL запрос в С# на FireBird
    #38443976
Pallaris
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
МСУМдя...

кстати, какой основной критерий тухлячности?
...
Рейтинг: 0 / 0
SQL запрос в С# на FireBird
    #38443983
Фотография МСУ
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Pallarisкстати, какой основной критерий тухлячности?
Смрад и убогость.
...
Рейтинг: 0 / 0
SQL запрос в С# на FireBird
    #38443990
Pallaris
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
greshnik_05,

в базе изменения появляютяс после Update. Поле id соответственно будет пустым пока не сделаешь Update и Fill
...
Рейтинг: 0 / 0
SQL запрос в С# на FireBird
    #38444619
greshnik_05
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Сделал вот так
Код: c#
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
 private void btnAdd_Click(object sender, EventArgs e)
        {
            try
            {
                DataRowView row = bindingSource.AddNew() as DataRowView;
                row["name"] = "NewName1234";
                row["path"] = "NewPath1234";
                fbDataAdapter.Update((DataTable)bindingSource.DataSource);
                fbDataAdapter.Fill(table);
            }
            catch (Exception ex)
            {
                MessageBox.Show(ex.Message);
            }
            

        }



Данные добавляются в БД нормально в том случае если 2 аза нажать на кнопку btnAdd. Не понятно почему
...
Рейтинг: 0 / 0
SQL запрос в С# на FireBird
    #38445231
greshnik_05
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
помогите кто знает в чем причина!
...
Рейтинг: 0 / 0
SQL запрос в С# на FireBird
    #38445250
Alex Kuznetsov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
greshnik_05помогите кто знает в чем причина!Вечерком сваяю чаво-нить - выложу...
...
Рейтинг: 0 / 0
SQL запрос в С# на FireBird
    #38445254
greshnik_05
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Alex Kuznetsovgreshnik_05помогите кто знает в чем причина!Вечерком сваяю чаво-нить - выложу...

У меня только инсерт не работает остальное работает нормально!
...
Рейтинг: 0 / 0
SQL запрос в С# на FireBird
    #38446575
Alex Kuznetsov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Alex Kuznetsovgreshnik_05помогите кто знает в чем причина!Вечерком сваяю чаво-нить - выложу...
Как и обещал - выкладываю...
...
Рейтинг: 0 / 0
SQL запрос в С# на FireBird
    #38446786
greshnik_05
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Alex Kuznetsov,
Спасибо.
У меня пару вопросов возникло.
1. в примере данные добавляются через датагрид, если данные добавляю через тексбоксы например. как быть?
2. где объявлен биндиг соурсе bsTest?
3. Вы использовали компонент "Набор данных" dsTest. это видно в окне обозревателя решений. Я делал так DataTable table = new DataTable(); это что то меняет?
...
Рейтинг: 0 / 0
SQL запрос в С# на FireBird
    #38446879
Alex Kuznetsov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
greshnik_05Alex Kuznetsov,
Спасибо.
У меня пару вопросов возникло.
1. в примере данные добавляются через датагрид, если данные добавляю через тексбоксы например. как быть?
2. где объявлен биндиг соурсе bsTest?
3. Вы использовали компонент "Набор данных" dsTest. это видно в окне обозревателя решений. Я делал так DataTable table = new DataTable(); это что то меняет?
Пожалуйста,

ответы на вопросы в доработанном примере.
Вся работа с базой выполнена без использования дизайнера - только код.
Добавление в гриде отключено - реализовано через использование текстбоксов.
Типизированного набора данных нет - использован простой DataTable.
...
Рейтинг: 0 / 0
SQL запрос в С# на FireBird
    #38446977
greshnik_05
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Alex Kuznetsov, спасибо. Понял в чем была моя ошибка.
Не могли вы разъяснить в чем разница между методом описанным вами в примере и вот этим

Код: c#
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
58.
59.
60.
61.
62.
63.
64.
65.
66.
67.
68.
69.
70.
71.
72.
73.
74.
75.
76.
77.
78.
79.
80.
81.
private bool UpdateCommand()
        {
            using (FbConnection fbConnect = new FbConnection(FireBird.fbConnectionString.ToString()))
            {
                //открываем подключение
                fbConnect.Open();
                //создаем новую команду на UPDATE
                FbCommand SQLCommand = new FbCommand("Update SPR_SVOI SET NAME = @NAME, DIR = @DIR, TEL = @TEL, EMAIL = @EMAIL WHERE ID = 1", fbConnect);

                //обьявляем обьект класса FbParameter
                FbParameter parameter = new FbParameter();
                //задаем имя параметра
                parameter.ParameterName = "@NAME";
                //задаем значение параметра
                parameter.Value = textBoxName.Text;
                //задаем тип параметра
                parameter.FbDbType = FbDbType.VarChar;
                //передаем параметр обьекту класса FbCommand
                SQLCommand.Parameters.Add(parameter);

                //переопределяем обьект класса FbParameter
                parameter = new FbParameter();
                //задаем имя параметра
                parameter.ParameterName = "@DIR";
                //задаем значение параметра
                parameter.Value = textBoxDirector.Text;
                //задаем тип параметра
                parameter.FbDbType = FbDbType.VarChar;
                //передаем параметр обьекту класса FbCommand
                SQLCommand.Parameters.Add(parameter);

                //переопределяем обьект класса FbParameter
                parameter = new FbParameter();
                //задаем имя параметра
                parameter.ParameterName = "@TEL";
                //задаем значение параметра
                parameter.Value = textBoxTelefon.Text;
                //задаем тип параметра
                parameter.FbDbType = FbDbType.VarChar;
                //передаем параметр обьекту класса FbCommand
                SQLCommand.Parameters.Add(parameter);

                //переопределяем обьект класса FbParameter
                parameter = new FbParameter();
                //задаем имя параметра
                parameter.ParameterName = "@EMAIL";
                //задаем значение параметра
                parameter.Value = textBoxEmail.Text;
                //задаем тип параметра
                parameter.FbDbType = FbDbType.VarChar;
                //передаем параметр обьекту класса FbCommand
                SQLCommand.Parameters.Add(parameter);

                //выполняем запрос 
                try
                {
                    SQLCommand.ExecuteNonQuery();
                    return true;
                }
                catch (FbException FbExcept)
                {
                    MessageBox.Show("Сообщение ошибки: " + FbExcept.Message + ". Номер ошики: " + FbExcept.ErrorCode.ToString(), "Вниание!!!");
                    return false;
                }
            }//using; по выходу из using соединение сделает Dispose само
        }

 private void btnSave_Click(object sender, EventArgs e)
        {
            try
            {
                if (UpdateCommand())
                {
                    MessageBox.Show("Данные успешно сохраннены!", "Внимание!!!");
                }
            }
            catch (Exception except)
            {
                MessageBox.Show("Сообщение об ошибке: " + except.Message, "Вниание!!!");
            }
        }



Этот метод я использовал до того как посоветовали метод с биндинг сорсами.
...
Рейтинг: 0 / 0
SQL запрос в С# на FireBird
    #38447710
Alex Kuznetsov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
greshnik_05,

Ну что-ж, давайте разберём то, что Вы сделали:
1. В принципе правильная задумка...
Код: c#
1.
 using (FbConnection fbConnect = new FbConnection(FireBird.fbConnectionString.ToString())) 


2.На данном этапе соединение открывать не обязательно, т.к. оно не обязано быть открытым для создания объекта FbCommand
Код: c#
1.
2.
3.
4.
//открываем подключение
                fbConnect.Open();
                //создаем новую команду на UPDATE
                FbCommand SQLCommand = new FbCommand("Update SPR_SVOI SET NAME = @NAME, DIR = @DIR, TEL = @TEL, EMAIL = @EMAIL WHERE ID = 1", fbConnect);

Соединение можно установить непосредственно перед вызовом процедуры

3.Создание параметров
Код: c#
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
//обьявляем обьект класса FbParameter
                FbParameter parameter = new FbParameter();
                //задаем имя параметра
                parameter.ParameterName = "@NAME";
                //задаем значение параметра
                parameter.Value = textBoxName.Text;
                //задаем тип параметра
                parameter.FbDbType = FbDbType.VarChar;
                //передаем параметр обьекту класса FbCommand
                SQLCommand.Parameters.Add(parameter);

- подход верен за исключением некоторых моментов. Думаю, вот так будет более корректно
Код: c#
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
//обьявляем обьект класса FbParameter
                FbParameter parameter = new FbParameter();
                //задаем имя параметра
                parameter.ParameterName = "@NAME";
                // указываем направление параметра
                parameter.Direction = ParameterDirection.Input
                //задаем тип параметра
                parameter.FbDbType = FbDbType.VarChar;
                // Надо ещё указать размерность параметра
                parameter.Size = <размер> ;
                //задаем значение параметра
                parameter.Value = textBoxName.Text.Trim();
                //передаем параметр обьекту класса FbCommand
                SQLCommand.Parameters.Add(parameter);


4. Вот здесь я не уверен в том, что ожидаемый эффект от использования using будет достигнут:
Код: c#
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
                //выполняем запрос 
                try
                {
                    SQLCommand.ExecuteNonQuery();
                    return true;
                }
                catch (FbException FbExcept)
                {
                    MessageBox.Show("Сообщение ошибки: " + FbExcept.Message + ". Номер ошики: " + FbExcept.ErrorCode.ToString(), "Вниание!!!");
                    return false;
                }

моя неуверенность происходит от того, что Вы выходите из процедуры до окончания блока using.

Теперь по поводу Вашего вопроса о том, в чём разница между методом приведённым в моём примере с использованием binding и Вашим методом. На мой взгляд она очевидна. В случае с использованием binding указанием значений параметров перед вызовом процедуры занимается объект DataAdapter на основание информации из DataTable. Соответственно он-же и занимается установлением связи с сервером, и т.д. В Вашем-же методе Вы сами устанавливаете параметры вызова процедуры и вызываете её.

В Вашем варианте нет принципиальной ошибки, т.к. всё зависит от задачи, архитектуры решения и т.д. Т.е. какой подход выбрать - решать Вам.
...
Рейтинг: 0 / 0
67 сообщений из 67, показаны все 3 страниц
Форумы / WinForms, .Net Framework [игнор отключен] [закрыт для гостей] / SQL запрос в С# на FireBird
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]