Форум программистов, компьютерный форум, киберфорум
C#: Базы данных
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
 Аватар для jkom-18rus
88 / 33 / 8
Регистрация: 26.02.2016
Сообщений: 326

Дублирование кода SQLite DataAdapter

08.04.2025, 18:57. Показов 1954. Ответов 16
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Всем привет

Пытаюсь избежать дублирования кода.

У меня есть универсальный метод, который открывает подключение к БД
C#
1
2
3
4
5
6
7
8
9
10
11
private void ExecuteWithDataAdapter(string query, Action<SQLiteDataAdapter> action)
        {
            using (SQLiteConnection connection = new SQLiteConnection(connectionString))
            {
                connection.Open();
                using (SQLiteDataAdapter adapter = new SQLiteDataAdapter(query, connection))
                {
                    action(adapter);
                }
            }
        }
Я к нему обращаюсь в других методах.
Раньше я вызывал его только один раз, и всё было хорошо.

Создал новый метод, где мне пришлось к этому прибегнуть дважды.
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
private int GetContractCountByName(string tableName, string selectedItem)
        {
            int count = 0;
            int id = -1; // Идентификатор, который мы будем искать
 
            // Сначала получаем идентификатор по имени
            string idQuery = $"SELECT Id FROM {tableName} WHERE Name = @Name";
 
            ExecuteWithDataAdapter(idQuery, adapter =>
            {
                adapter.SelectCommand.Parameters.AddWithValue("@Name", selectedItem);
                DataTable resultTable = new DataTable();
                adapter.Fill(resultTable);
                if (resultTable.Rows.Count > 0)
                {
                    id = Convert.ToInt32(resultTable.Rows[0]["Id"]);
                }
            });
 
            // Если идентификатор найден, считаем количество договоров
            if (id != -1)
            {
                string countQuery = $"SELECT COUNT(*) FROM Contract WHERE {tableName}Id = @ForeignKeyId";
 
                ExecuteWithDataAdapter(countQuery, adapter =>
                {
                    adapter.SelectCommand.Parameters.AddWithValue("@ForeignKeyId", id);
                    DataTable countTable = new DataTable();
                    adapter.Fill(countTable);
                    if (countTable.Rows.Count > 0)
                    {
                        count = Convert.ToInt32(countTable.Rows[0][0]);
                    }
                });
            }
 
            return count;
        }
Возможно ли как-то упростить, чтобы ExecuteWithDataAdapter(countQuery, adapter => написать один раз?
0
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
08.04.2025, 18:57
Ответы с готовыми решениями:

Code First - выбор: Microsoft.EntityFrameworkCore.Sqlite, Microsoft.Data.Sqlite, System.Data.SQLite и др.
Работаю с БД очень редко. Поэтому опыт маленький и знания обрывочные. Стоит задача в Решении...

проблема с DataAdapter.Update
вывожу при загрузке формы в datagrid табличку : Dim oCommand As New...

Обновление базы данных dataadapter.Update
знаю что таких тем было много но ни на одной из них я не нашел ответа на свой вопрос ...

16
Эксперт .NET
 Аватар для Wolfdp
3790 / 1767 / 371
Регистрация: 15.06.2012
Сообщений: 6,543
Записей в блоге: 3
09.04.2025, 08:33
Просто засуньте всё в один делегат.

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
private int GetContractCountByName(string tableName, string selectedItem)
        {
            int count = 0;
            int id = -1; // Идентификатор, который мы будем искать
 
            // Сначала получаем идентификатор по имени
            string idQuery = $"SELECT Id FROM {tableName} WHERE Name = @Name";
 
            ExecuteWithDataAdapter(idQuery, adapter =>
            {
                adapter.SelectCommand.Parameters.AddWithValue("@Name", selectedItem);
                DataTable resultTable = new DataTable();
                adapter.Fill(resultTable);
                if (resultTable.Rows.Count > 0)
                {
                    id = Convert.ToInt32(resultTable.Rows[0]["Id"]);
                }
 
                    // Если идентификатор найден, считаем количество договоров
                    if (id != -1)
                    {
                            string countQuery = $"SELECT COUNT(*) FROM Contract WHERE {tableName}Id = @ForeignKeyId";
 
                            adapter.SelectCommand.Parameters.Clear();
                            adapter.SelectCommand.Parameters.AddWithValue("@ForeignKeyId", id);
                            countTable = new DataTable();
                            adapter.Fill(countTable);
                            if (countTable.Rows.Count > 0)
                            {
                                count = Convert.ToInt32(countTable.Rows[0][0]);
                            }
                    }
            });
 
            return count;
        }

Не по теме:

С виду архитектура конечно тот ещё треш. Хотя для диплома наверное сгодиться, балов на 4 из 5.

0
 Аватар для Andrey-MSK
3339 / 2226 / 387
Регистрация: 14.08.2018
Сообщений: 7,515
Записей в блоге: 4
09.04.2025, 08:48
jkom-18rus, Если мне не изменяет память, то метод Fill() сам открывает и закрывает соединение.

Ну да, так и есть
Метод Fill извлекает строки из источника данных с помощью инструкции SELECT, заданной связанным SelectCommand свойством. Объект подключения, связанный с инструкцией SELECT, должен быть допустимым, но его не нужно открывать. Если соединение закрыто перед Fill вызовом, оно открывается для получения данных, а затем закрывается. Если подключение открыто до Fill вызова, оно остается открытым.
Так что вот это
Цитата Сообщение от jkom-18rus Посмотреть сообщение
У меня есть универсальный метод, который открывает подключение к БД
абсолютно лишнее. Создание объекта адаптера там где его нужно использовать не является дублированием кода. Наоборот, это гораздо удобнее, так как есть полный контроль над соединением и самим адаптером, и ты чётко знаешь что все ресурсы освободятся там где нужно.
C#
1
2
3
4
5
6
7
using (OleDbConnection excelConnection = new OleDbConnection(excelConnectionString))
{
    using (OleDbDataAdapter oleDbDataAdapter = new OleDbDataAdapter(excelQuery, excelConnection))
    {
        _ = oleDbDataAdapter.Fill(excelDataTable);
    }
}
Добавлено через 3 минуты
jkom-18rus, Вот пример работы с Command, без адаптера. Тут тоже самое, объекты создаются и закрываются там где нужно
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
public async Task<int> GetCounterAsync(EObject mainItem)
{
    int counter;
    string sqlText =
        "SELECT COUNT(*) " +
        "FROM dbo.tblGPlansN " +
        "WHERE ID_EObject = @eoID";
 
    try
    {
        using (SqlConnection sqlConnection = new SqlConnection(_connectionString))
        {
            using (SqlCommand sqlCommand = new SqlCommand(sqlText, sqlConnection))
            {
                SqlParameter parameterID = new SqlParameter
                {
                    ParameterName = "@eoID",
                    Value = mainItem.EObjectID,
                    SqlDbType = SqlDbType.Int,
                    Direction = ParameterDirection.Input
                };
                sqlCommand.Parameters.Add(parameterID);
 
                await sqlCommand.Connection.OpenAsync();
 
                return counter = (int)await sqlCommand.ExecuteScalarAsync();
            }
        }
    }
    catch (SqlException sqlEx)
    {
        throw new ApplicationException(string.Format("T-SQL #{0} - {1}", sqlEx.Number, sqlEx.Message), sqlEx);
    }
    catch (Exception ex)
    {
        throw new ApplicationException(ex.Message, ex);
    }
}
0
09.04.2025, 10:26

Не по теме:

Цитата Сообщение от Andrey-MSK Посмотреть сообщение
C#
1
return counter = (int)await sqlCommand.ExecuteScalarAsync();
counter -- это чтобы в дебаге можно было смотреть?

0
 Аватар для Andrey-MSK
3339 / 2226 / 387
Регистрация: 14.08.2018
Сообщений: 7,515
Записей в блоге: 4
09.04.2025, 10:30
Цитата Сообщение от Wolfdp Посмотреть сообщение
counter -- это чтобы в дебаге можно было смотреть?

Не по теме:

Не, мне было нужно количество подчинённых записей, вот и получаю его

0
 Аватар для jkom-18rus
88 / 33 / 8
Регистрация: 26.02.2016
Сообщений: 326
09.04.2025, 18:04  [ТС]
Цитата Сообщение от Wolfdp Посмотреть сообщение
С виду архитектура конечно тот ещё треш. Хотя для диплома наверное сгодиться, балов на 4 из 5.
Это курсовик
В чём треш? Я просто не грамотный. Как лучше сделать?

Добавлено через 32 минуты
Цитата Сообщение от Wolfdp Посмотреть сообщение
Просто засуньте всё в один делегат.
Что-т сработало только один раз. А потом стало ругаться на код.

ExecuteWithDataAdapter(idQuery, adapter =>
Ошибка CS0103 Имя "ExecuteWithDataAdapter" не существует в текущем контексте.

Написал с маленькой буквы - Ошибка CS0103 Имя "countTable" не существует в текущем контексте.

C#
1
2
3
4
adapter.SelectCommand.Parameters.Clear();
                    adapter.SelectCommand.Parameters.AddWithValue("@ForeignKeyId", id);
                    DataTable countTable = new DataTable(); // // Объявил countTable
                    adapter.Fill(countTable);
Он перестал считать количество. Вместо количества выдаёт id.

private int GetContractCountByName(string tableName, string selectedItem) лежит в отдельном классе GetReport.cs
private void ExecuteWithDataAdapter(string query, Action<SQLiteDataAdapter> action) лежит в классе формы

в классе формы объявляю GetReport.cs
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
public partial class Form1 : Form
    {
        private SetInterface setInterface; // настройки поведения элементов интерфейса
        private LoadReportData loadReportData; // загрузка данных для блока справок
        private GetReport getReport;
        private string connectionString = @"Data Source=|DataDirectory|\CarDistributionDB.db;Version=3;";
        private DataTable distributionTable;
 
        public Form1()
        {
             InitializeComponent();
             ...
             getReport = new GetReport(connectionString, ExecuteWithDataAdapter);
             ...
        }
...
0
Эксперт .NET
 Аватар для Wolfdp
3790 / 1767 / 371
Регистрация: 15.06.2012
Сообщений: 6,543
Записей в блоге: 3
09.04.2025, 20:08
Цитата Сообщение от jkom-18rus Посмотреть сообщение
В чём треш?
Цитата Сообщение от jkom-18rus Посмотреть сообщение
GetContractCountByName(string tableName
1. идея с использованием имени таблицы как индификатор чего-либо -- очень плохая. Практически всегда нужно вводить дополнительную таблицу и использовать внешний ключ в основной. Но это нужно пересматривать архитектуру БД вашего приложения, не думаю что у вас есть время на это.

2. класс отвечающий за реализацию взаимодействия в БД должен декларировать в контракте либо dto, либо явные логические значения без привязки к реализации. Т.е. нельзя писать "дай максимальное значение из таблицы А", нужно либо для таблицы А делать отдельный класс, либо делать общую реализацию через <T>

Это два основных пункта, которые я бы при проверке курсовой отметил. Возможно приймут и такое на ура, по сути всё зависит от проверяющего (порой и идеально правильный код заворачивают, потому что препод не шарит материал). А так улучшать можно до бесконечности.

чисто-ля-ля
Опуская идею с ORM например можно вынести названия БД в константы (а ещё лучше в статические readonly) значения, и реализовать общий метод через Command нечто такое
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
    public ScheduleTask[] LoadTasks(bool onlyWaiting = false)
    {
        var predicate = onlyWaiting
            ? $"WHERE {StatusColumn} = {(int)ScheduleTaskStatus.Waiting}"
            : string.Empty;
        var sql = @$"SELECT
            {IdColumn},
            {PathColumn},
            {AppNameColumn},
            {TimeColumn},
            {StatusColumn}
        FROM {TasksTable} {predicate};";
 
        return Execute(sql, DbRepositoryHelper.Parse);
    }
Т.е. для каждого метода вам нужно будет написать только sql запрос и парсер. И даже это пример несколько устарел, т.к. в современном C# есть строковые литералы, которые делают sql в коде ещё более читаемым.


Цитата Сообщение от jkom-18rus Посмотреть сообщение
Что-т сработало только один раз. А потом стало ругаться на код.
Значит криво написали. В ошибках рядовые вещи "забыл объявить переменную" или использование метода вне класса.

Переиспользуйте ExecuteWithDataAdapter, раз не можете написать сложный делегат. Сильно хуже не будет, в реальных приложениях вообще работают с orm и пулом соединений, так что текущий вариант реализации с вызовом ExecuteWithDataAdapter несколько раз конкретно для вашей практики сойдет.
0
 Аватар для jkom-18rus
88 / 33 / 8
Регистрация: 26.02.2016
Сообщений: 326
27.04.2025, 17:42  [ТС]
Всем привет.
Прошу прощения, что так долго пропадал. Доделывал остальной функционал своей проги.

Цитата Сообщение от Wolfdp Посмотреть сообщение
1. идея с использованием имени таблицы как индификатор чего-либо
Возможно я Вас до конца не понимаю, но имя таблицы это просто имя таблицы. Оно не является идентификатором. Суть заключается в том, что запрос может обращаться к двум разным таблицам для подсчёта: "контракты, которые заключены с конкретной АЗС или конкретной автобазой"
private int GetContractCountByName(string АЗС или Автобаза, string Название данной АЗС/базы)
Параметры мы получаем из элементов на форме. АЗС или автобаза - radioButton, название - comboBox.

2 пункт вообще не понял.

Заочное обучение оно такое...


По теме. Проблему решил. Просто сделал из двух моих запросов один запрос с подзапросом.

C#
1
2
3
4
5
6
7
8
9
10
11
public static string ContractCount(string tableName)
        {
            return $@"
            SELECT COUNT(*) 
            FROM Contract 
            WHERE {tableName}Id = (
                SELECT Id 
                FROM {tableName} 
                WHERE Name = @OptionName
            )";
        }
и вызываю его

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
private void GetContractCount(Form1.ReportData reportData)
        {
            // Получаем количество договоров для выбранного элемента
            int contractCount = 0;
            string tableName = reportData.ContractOption == "АЗС" ? "GasStation" : "Base";
 
            string query = DBQuery.ContractCount(tableName); // Получаем SQL-запрос
 
            executeWithDataAdapter(query, adapter =>
            {
                adapter.SelectCommand.Parameters.AddWithValue("@OptionName", reportData.ContractOptionName);
                DataTable dataTable = new DataTable();
                adapter.Fill(dataTable);
                if (dataTable.Rows.Count > 0)
                {
                    contractCount = Convert.ToInt32(dataTable.Rows[0][0]);
                }
            });
 
            // Строка для изменения окончания в зависимости от значения ContractOption
            string optionText = reportData.ContractOption == "автобаза" ? "автобазы" : reportData.ContractOption;
            // Отображаем количество договоров
            MessageBox.Show($"Количество договоров для {optionText} '{reportData.ContractOptionName}': {contractCount} шт.");
        }
0
Эксперт .NET
 Аватар для Wolfdp
3790 / 1767 / 371
Регистрация: 15.06.2012
Сообщений: 6,543
Записей в блоге: 3
27.04.2025, 21:28

Не по теме:

Цитата Сообщение от jkom-18rus Посмотреть сообщение
Прошу прощения, что так долго пропадал.
Дык, никто особо по этому поводу и не страдал. Не недельный же рейд прогуливаете в L2.



Цитата Сообщение от jkom-18rus Посмотреть сообщение
Возможно я Вас до конца не понимаю, но имя таблицы это просто имя таблицы.
Не понимаете, и можете пока смело забить. Глядя на ваш код, много чего можно исправить, но время не резиновое.

Просто на будущее: если вы в метод для запроса передаете имя таблицы -- это явный признак что делаете неправильно. Бизнеслогика никогда не оперирует именами таблиц, более того -- она даже не знает о существовании таблиц. Для этого либо вводят enum (если количество типов статично или правится ооооочень редко и сопровождается полной правкой кода), либо вообще оперируют Data Transfer Object (DTO), которые эти типы и описывают.

Как можно было бы сделать вам:
- таблица "тип поставщика". Скажем ID + Name. В ней две записи "1 - АЗС", "2 - нефтебаза"
- таблица "поставщик". В ней тоже ID, имя, и FK на "тип поставщика"
- если для АЗС нужно добавить в "поставщики" специфическую инфу, которая не свойственная остальным поставщикам, делают дополнительную таблицу "АЗС поставщик" которая связана с "поставщик" по ID один-к-одному и имеет эти самые доп-поля. Это можно проворачивать для всех остальных типов
- когда вы хотите получить количество контрактов по определённому типу поставщика, вы передаете ID этого типа в метод.

Такая схема позволяет написать более универсальный фильтр запросов, безболезненно расширяться как по типам, так и по количеству, а также вводить специфические моменты для определённых типов записей. Таже при написании кода вы не вспоминаете строковое значение из таблицы, т.к. практически всегда у вас тянуться либо enum, либо ID и что главное -- сложнее сделать опечатку, которую пропустит компилятор (например "АЗС", "AЗC" и "AЗС" -- три совершенно разных значения и исполняемому коду совершенно пофиг что они выглядят одинаково. Про верхний/нижний регистр вообще молчу).
0
 Аватар для jkom-18rus
88 / 33 / 8
Регистрация: 26.02.2016
Сообщений: 326
28.04.2025, 17:45  [ТС]
Wolfdp, интересная информация

Вот так сразу сложно в понимании. Надеюсь понял хоть что-то, хотя бы основную мысль.

Не знаю чему так учат на очке. У нас на парах преподаватель ничего по делу не рассказывал. Сам сидел и разбирался, как программировать. Но не по нашим заданиям, а что-то другое.
0
 Аватар для Andrey-MSK
3339 / 2226 / 387
Регистрация: 14.08.2018
Сообщений: 7,515
Записей в блоге: 4
29.04.2025, 08:41
jkom-18rus, Почитайте про нормальные формы таблиц СУБД (нормализация данных), много интересного узнаете. И если работаете с СУБД, то разберитесь с её диалектом SQL, научитесь писать правильные запросы, создавать правильные индексы, связи и т.д.
0
Эксперт .NET
 Аватар для Usaga
14145 / 9374 / 1350
Регистрация: 21.01.2016
Сообщений: 35,299
11.05.2025, 02:41
jkom-18rus, я тебе настоятельно рекомендую забыть про DataTable и SqlDataAdapter. Это пережитки отдалённого прошлого.

И проблема с этими классами не в том, что это не "модно-молодёжно", а в том, что это не удобно. DataTable не типизированный. Глядя на код ты не можешь сказать сколько колонок оно содержит и каких они типов. Везде, где тебе к DT обратиться захочется, тебе придётся писать такую ахинею:

C#
1
contractCount = Convert.ToInt32(dataTable.Rows[0][0]);
Представь, что полей будет больше. Ты очень быстро заманаешься так делать. Да и вероятность ошибки высока. Точно ли это значение Int32 получится?

Чтобы вытащить ОДНО значение из базы можно использовать такой метод:

C#
1
var result = (int)command.ExecuteScalar();
Чтобы выгрузить набор полей, заведи класс с нужными свойствами нужных типов и через SqlDataReader прочитай в него эти поля. А лучше DapperNet используй. На дворе 2025й год уже. А ты работаешь как в 2001м...
0
Эксперт .NET
 Аватар для Wolfdp
3790 / 1767 / 371
Регистрация: 15.06.2012
Сообщений: 6,543
Записей в блоге: 3
11.05.2025, 18:02
Цитата Сообщение от Usaga Посмотреть сообщение
А лучше DapperNet используй.
Ну или любую другую ORM, их довольно много, но подход более-менее общий.
0
 Аватар для Andrey-MSK
3339 / 2226 / 387
Регистрация: 14.08.2018
Сообщений: 7,515
Записей в блоге: 4
12.05.2025, 09:29
Цитата Сообщение от Usaga Посмотреть сообщение
DataTable не типизированный.
Чего это вдруг? Если правильно его использовать, то вполне себе типизированный
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
DataTable excelDataTable = new DataTable();
 
excelDataTable.Columns.AddRange(new DataColumn[10]
{
    new DataColumn("ID_LaborHB_01", typeof(int)),
    new DataColumn("PosNum", typeof(int)),
    new DataColumn("NameOfWork", typeof(string)),
    new DataColumn("WorkCode", typeof(string)),
    new DataColumn("Labor", typeof(decimal)),
    new DataColumn("LaborAssembly", typeof(decimal)),
    new DataColumn("ErectCoeff", typeof(decimal)),
    new DataColumn("ID_Measure", typeof(int)),
    new DataColumn("ID_Branch", typeof(int)),
    new DataColumn("ID_EObject", typeof(int))
});
 
// ...
 
await ExcelDataTableFillAsync(excelConectionString, excelQuery, excelDataTable);
 
using (SqlBulkCopy sqlBulkCopy = new SqlBulkCopy(_connectionString, sqlBulkCopyOptions))
{
    sqlBulkCopy.DestinationTableName = "dbo.tblLaborHB_02";
 
    sqlBulkCopy.ColumnMappings.Add("ID_LaborHB_01", "ID_LaborHB_01");
    sqlBulkCopy.ColumnMappings.Add("PosNum", "PosNum");
    sqlBulkCopy.ColumnMappings.Add("NameOfWork", "NameOfWork");
    sqlBulkCopy.ColumnMappings.Add("WorkCode", "WorkCode");
    sqlBulkCopy.ColumnMappings.Add("Labor", "Labor");
    sqlBulkCopy.ColumnMappings.Add("LaborAssembly", "LaborAssembly");
    sqlBulkCopy.ColumnMappings.Add("ErectCoeff", "ErectCoeff");
    sqlBulkCopy.ColumnMappings.Add("ID_Measure", "ID_Measure");
    sqlBulkCopy.ColumnMappings.Add("ID_Branch", "ID_Branch");
    sqlBulkCopy.ColumnMappings.Add("ID_EObject", "ID_EObject");
 
    await sqlBulkCopy.WriteToServerAsync(excelDataTable);
}
0
Эксперт .NET
 Аватар для Usaga
14145 / 9374 / 1350
Регистрация: 21.01.2016
Сообщений: 35,299
12.05.2025, 11:01
Andrey-MSK, ты понял о чём я) Одно дело - класс со свойствами, где в коде всё видно. Другое дело DataTable, который в рантайме компонуется не пойми как.

С таким успехом можно и Dictionary<string, (object, Type)> назвать типизированным потому, что ему по ключу экземпляр типа передаётся.
1
 Аватар для jkom-18rus
88 / 33 / 8
Регистрация: 26.02.2016
Сообщений: 326
12.05.2025, 17:40  [ТС]
Цитата Сообщение от Wolfdp Посмотреть сообщение
Ну или любую другую ORM
запомнить бы ещё слова такие. Может и познакомлюсь на следующих курсах. Но надеюсь нет.
Хватит с меня этого программирования
0
Эксперт .NET
 Аватар для Usaga
14145 / 9374 / 1350
Регистрация: 21.01.2016
Сообщений: 35,299
13.05.2025, 01:59
Цитата Сообщение от jkom-18rus Посмотреть сообщение
Может и познакомлюсь на следующих курсах.
Я дал ссылку на самый простой вариант. Познакомиться тут - пару часов поковырять примеры, если не меньше.

Цитата Сообщение от jkom-18rus Посмотреть сообщение
Хватит с меня этого программирования
Тут стоило бы самому себе задать вопрос: "А какого ляха ты делаешь в отрасли, которую терпеть не можешь?"
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
13.05.2025, 01:59
Помогаю со студенческими работами здесь

Удаление записей(DataAdapter)
Здравствуйте! Пишу на C# , столкнулся с такой проблемой. Работаю с MS SQL Express, получаю данные...

Метод Fill у DataAdapter. Как с ним работать?
Здравствуйте все! Помогите разобраться, пожалуйста. Я использую в своей программе для заполнения...

потеряный DataAdapter
В методе была получена таблица из бд через адаптер. По завершению программы таблицу необходимо...

Обновление источников данных с п о м о щ ь ю объектов DataAdapter
Есть таблица в БД Access. Считываю все строки этой таблицы и отображаю их в dataGridView. После...

Как вы делаете Update данных в БД (при использовании DataGridView, DataSet, DataAdapter)
Доброго дня, форумчане. Отдельный привет знакомым форумчанам. Решил поднять я старую наболевшую...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
17
Ответ Создать тему
Новые блоги и статьи
Символьное дифференцирование
igorrr37 13.02.2026
/ * Логарифм записывается как: (x-2)log(x^2+2) - означает логарифм (x^2+2) по основанию (x-2). Унарный минус обозначается как ! */ #include <iostream> #include <stack> #include <cctype>. . .
Камера Toupcam IUA500KMA
Eddy_Em 12.02.2026
Т. к. у всяких "хикроботов" слишком уж мелкий пиксель, для подсмотра в ESPriF они вообще плохо годятся: уже 14 величину можно рассмотреть еле-еле лишь на экспозициях под 3 секунды (а то и больше),. . .
И ясному Солнцу
zbw 12.02.2026
И ясному Солнцу, и светлой Луне. В мире покоя нет и люди не могут жить в тишине. А жить им немного лет.
«Знание-Сила»
zbw 12.02.2026
«Знание-Сила» «Время-Деньги» «Деньги -Пуля»
SDL3 для Web (WebAssembly): Подключение Box2D v3, физика и отрисовка коллайдеров
8Observer8 12.02.2026
Содержание блога Box2D - это библиотека для 2D физики для анимаций и игр. С её помощью можно определять были ли коллизии между конкретными объектами и вызывать обработчики событий столкновения. . . .
SDL3 для Web (WebAssembly): Загрузка PNG с прозрачным фоном с помощью SDL_LoadPNG (без SDL3_image)
8Observer8 11.02.2026
Содержание блога Библиотека SDL3 содержит встроенные инструменты для базовой работы с изображениями - без использования библиотеки SDL3_image. Пошагово создадим проект для загрузки изображения. . .
SDL3 для Web (WebAssembly): Загрузка PNG с прозрачным фоном с помощью SDL3_image
8Observer8 10.02.2026
Содержание блога Библиотека SDL3_image содержит инструменты для расширенной работы с изображениями. Пошагово создадим проект для загрузки изображения формата PNG с альфа-каналом (с прозрачным. . .
Установка Qt-версии Lazarus IDE в Debian Trixie Xfce
volvo 10.02.2026
В общем, достали меня глюки IDE Лазаруса, собранной с использованием набора виджетов Gtk2 (конкретно: если набирать текст в редакторе и вызвать подсказку через Ctrl+Space, то после закрытия окошка. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru