0 / 0 / 0
Регистрация: 14.12.2022
Сообщений: 8
1
SQLite

Считать только 3 элемента строки, при этом не создавая отдельный конструктор

07.06.2023, 23:19. Показов 785. Ответов 4
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Необходимо считать только 3 элемента строки, при этом не создавая отдельный конструктор. Соответственно, запрос SQL должен выглядеть следующим образом:
SQL
1
SELECT Name, Genre, Poster FROM 'Event'
Исходный код:
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
            Event[] events = new Event[20];
            string query = "SELECT * FROM 'Event'";
            SQLiteConnection connection = new SQLiteConnection("Integrated Security = SSPI; Data Source = Films.db");
            connection.Open();
            SQLiteCommand command = new SQLiteCommand(query, connection);
            using (var dr = command.ExecuteReader())
            {
                int k = 0;
                while (dr.Read())
                {
                    events[k] = new Event(dr.GetString(0), dr.GetString(1), dr.GetString(2), dr.GetString(3), (byte[])dr.GetValue(4), dr.GetString(5), dr.GetString(6));
                    k++;
                }
            }
            connection.Close();
            EventdataGridView.DataSource = events;
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
07.06.2023, 23:19
Ответы с готовыми решениями:

Найти в строке самое короткое слово и удалить его, не создавая при этом новых строк
Ввести символьную строку. Найти в строке самое короткое слово и удалить его из строки. Новых строк...

Как можно объединить в одну структуру стек (очередь) и дек, при этом не создавая 2 структуры?
Доброго всем вечера! У меня возник вопрос такой)) Как я могу объединить в одну структуру...

Чтение из файла с заданной строки [text] до [text] при этом не читать строки [text] а только всё что между ними
Чтение из файла с заданной строки до при этом не читать строки а только всё что между ними ...

Записать в третий файл только те строки, которые есть и в первом и во втором файлах. При этом нужно
Помогите пожалуйста записать в третий файл только те строки, которые есть и в первом и во втором...

4
Администратор
Эксперт .NET
17569 / 13790 / 5300
Регистрация: 17.03.2014
Сообщений: 28,274
Записей в блоге: 1
07.06.2023, 23:42 2
ss1zaa, так исправьте запрос на нужный, в чем проблема? Или если ваш вопрос о том как получить значение колонки по имени, то это делается так
C#
1
dr.GetString(dr.GetOrdinal("Name"))
0
0 / 0 / 0
Регистрация: 14.12.2022
Сообщений: 8
08.06.2023, 11:45  [ТС] 3
OwenGlendower, вопрос заключается в том, как необходимо изменить код программы, ведь если я вбиваю необходимый запрос вместо исходного, при этом ничего другого в коде не трогая, при запуске программы я получаю ошибку System.IndexOutOfRangeException: "Индекс находился вне границ массива." на следующей строчке:
C#
1
events[k] = new Event(dr.GetString(0), dr.GetString(1), dr.GetString(2), dr.GetString(3), (byte[])dr.GetValue(4), dr.GetString(5), dr.GetString(6));
, так как конструктор принимает больше значений, нежели берёт команда, я это так понимаю.
Но и конструктор я заменить не могу на другой, который будет принимать лишь три значения, ведь остальные данные мне тоже нужны, хоть их я и не собираюсь выводить в dataGridView. Надеюсь, понятно объяснил
0
Администратор
Эксперт .NET
17569 / 13790 / 5300
Регистрация: 17.03.2014
Сообщений: 28,274
Записей в блоге: 1
08.06.2023, 12:34 4
Нерабочий вариант
ss1zaa, ага, понял. Я бы сначала изменил класс Event:
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
class Event
{
    public string? Name { get; init; }
    public string? Genre { get; init; }
    public string? Poster { get; init; }
    // Остальные свойства ...
    
    public Event(IDataRecord data)
    {
        Name = GetString(data, "Name");
        Genre = GetString(data, "Genre");
        Poster = GetString(data, "Poster");
        // Инициализация остальных свойств ...
    }
    
    private static string? GetString(IDataRecord data, string columnName)
    {
        int index = data.GetOrdinal(columnName);
        return index == -1 ? null : data.GetString(index);
    }
}
Тогда создание экземпляра Event будет всегда выглядеть так:
C#
1
                    events[k] = new Event(dr);
Так мы сможем прочитать любые колонки, в любом порядке. Для колонок которые могут быть NULL в БД можно добавить еще метод GetDbNullString. По хорошему метод GetString и GetDbNullString лучше сделать методами расширения для IDataRecord чтобы в классе Event (и других аналогичных) не было лишнего кода.

Добавлено через 5 минут
Цитата Сообщение от OwenGlendower Посмотреть сообщение
index == -1
СТОП! Тут я ошибку допустил. Метод GetOrdinal выбрасывает IndexOutOfRangeException если колонка не найдена.


Добавлено через 14 минут
ss1zaa, начал писать новый код, но понял что проще на Dapper переключиться чем снова изобретать велосипед.
0
2851 / 1971 / 367
Регистрация: 14.08.2018
Сообщений: 6,366
Записей в блоге: 4
13.06.2023, 10:37 5
ss1zaa, А вот так не проще? Пример для FW 4.8, для Core использовать string?
Класс данных
C#
1
2
3
4
5
6
7
8
9
10
11
namespace DALModels.Models
{
    public class CPSHeader
    {
        public int HeaderID { get; set; }
        public int? PositionNumber { get; set; }
        public string PositionName { get; set; }
        public string Measure { get; set; }
        public int ContractID { get; set; }
    }
}
Метод чтения, в котором можно прочитать любое количество полей запроса, остальные в классе будут просто null
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
public async Task<List<CPSHeader>> GetCPSHadersAsync(CPSContract contract)
{
    List<CPSHeader> headers = new List<CPSHeader>();
    string sqlText = "SELECT ID_CPSHeader, ID_CPSContract, PosNumber, PosName, Measure " +
        "FROM dbo.tblCPSHeaders WHERE ID_CPSContract = @idCPSContract";
 
    try
    {
        using (SqlConnection sqlConnection = new SqlConnection(_connectionString))
        {
            await sqlConnection.OpenAsync();
 
            using (SqlCommand sqlCommand = new SqlCommand(sqlText, sqlConnection))
            {
                SqlParameter pEObjectID = new SqlParameter
                {
                    ParameterName = "@idCPSContract",
                    Value = contract.ContractID,
                    SqlDbType = SqlDbType.Int,
                    Direction = ParameterDirection.Input
                };
                sqlCommand.Parameters.Add(pEObjectID);
 
                using (SqlDataReader sqlDataReader = await sqlCommand.ExecuteReaderAsync())
                {
                    if (sqlDataReader.HasRows)
                    {
                        while (await sqlDataReader.ReadAsync())
                        {
                            headers.Add(new CPSHeader
                            {
                                HeaderID = (int)sqlDataReader["ID_CPSHeader"],
                                ContractID = (int)sqlDataReader["ID_CPSContract"],
                                PositionNumber = sqlDataReader["PosNumber"]
                                    == DBNull.Value ? null : (int?)sqlDataReader["PosNumber"],
                                PositionName = (string)sqlDataReader["PosName"],
                                Measure = (string)sqlDataReader["Measure"]
                            });
                        }
                    }
                }
            }
        }
 
        return headers;
    }
    catch (Exception ex)
    {
        throw new ApplicationException("Ошибка загрузки списка заголовков ВДЦ.", ex);
    }
}
0
13.06.2023, 10:37
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
13.06.2023, 10:37
Помогаю со студенческими работами здесь

Удаление видимого элемента на странице, но при этом сохранение данных в этом элементе
Функция, которая вызывается на сайте должна удалить видимый элемент input, но при этом должны...

Из файла удалить все слова, содержащие от трех до пяти символов, но при этом из каждой строки должно быть удалено только
Из файла удалить все слова, содержащие от трех до пяти символов, но при этом из каждой строки...

Как считать каждую строку в отдельный массив, таким образом что бы каждая цифра записывалась в отдельный элемент массива
У меня есть поле Memo, в котором записан примерно такой текст: 123456 234667 234567 234590...

Строки: считать текст из файла и вывести в другой файл и на экран только строки, не содержащие цифр
Написать программу, которая считывает текст из файла и выводит в другой файл и на экран только...

Считать данные из бд в DataGridView не удаляя при этом родные столбцы
Можно ли считать данные из бд в dataGridView не удаляя при этом родные столбцы ??? Дело в том, что...

Нужно вывести в отдельный файл только уникальные строки, сравнивая два файла
Приветствую! Начну сразу с дела: нужно вывести в отдельный файл только уникальные строки,...


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

Или воспользуйтесь поиском по форуму:
5
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru