powered by simpleCommunicator - 2.0.56     © 2025 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / WinForms, .Net Framework [игнор отключен] [закрыт для гостей] / SQL запрос в С# на FireBird
25 сообщений из 67, страница 2 из 3
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
25 сообщений из 67, страница 2 из 3
Форумы / WinForms, .Net Framework [игнор отключен] [закрыт для гостей] / SQL запрос в С# на FireBird
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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