Форум программистов, компьютерный форум, киберфорум
C#: Базы данных
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.78/18: Рейтинг темы: голосов - 18, средняя оценка - 4.78
0 / 0 / 1
Регистрация: 12.12.2014
Сообщений: 10
.NET 4.x

Вернуть данные SqlDataReader из функции выполняющей запрос в БД

12.12.2014, 21:22. Показов 3842. Ответов 2
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Здравствуйте! Помогите новичку кто знает.
Есть функция которая должна возвращать List объектов запроса в базу данных.
Набросал код ниже. Данные из массива объектов tabl (строка из БД) записываются в конец листа rezult,
но в итоге в возвращаемом листе rezult содержатся во всех строках (индексах) одинаковые значения, считанные при
последнем заполнении массива объектов tabl, т.е если из БД считаны две строки то в rezult находятся два одинаковых объекта из последней стоки объектов tabl, если в БД 3 строки, то 3 одинаковых значения в rezult и т. д.
Такое ощущение что в лист rezult записываются не сами данные а ссылки на tabl и в итоге возвращается лист rezult
с одинаковыми строками. Как это исправить?
Может есть другие способы сохранить выборку из базы данных в коллекции с возможность далее обрабатывать ее
в памяти как таблицу по индексам, именам полей, значениям. Интересует именно ADO.NET, с LINQ и маппингом разобрался боле менее. Да и почему-то в Visual Studio Web 2013 Express у меня отсутствует поддержка
коллекции HashTable она отсутствует и в InteliSens?

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
static private List<object> GetListFromDb(String connectionString, string sqlQuery)
    {
        SqlConnection sqlCon = new SqlConnection(connectionString);
        List<object> rezult = new List<object>();
        try
        {
            sqlCon.Open();
            SqlCommand sqlCom = new SqlCommand(sqlQuery, sqlCon);
            SqlDataReader Reader = sqlCom.ExecuteReader();
            Object[] tabl = new Object[Reader.FieldCount];
            while (Reader.Read())
            {
                Reader.GetValues(tabl);//запись массива объектов в tabl
                rezult.Add(tabl);//запись tabl в конец List
            }
        }
        catch
        {
            throw (new Exception(
                 String.Format("Выдано исключение [{0}].", sqlQuery)));
        }
        finally
        {
            sqlCon.Close();
        }
        return (rezult);
    }
Добавлено через 1 час 41 минуту
Как всегда полез в дебри, надо так:
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
static private DataTable GetTableFromDb(String connectionString, string sqlQuery)
    {
        SqlConnection sqlCon = new SqlConnection(connectionString);
        DataTable rezult = new DataTable();
        try
        {
            sqlCon.Open();
            SqlCommand sqlCom = new SqlCommand(sqlQuery, sqlCon);
            SqlDataReader Reader = sqlCom.ExecuteReader();
            rezult.Load(Reader);
            Reader.Close();
        }
        catch
        {
            throw (new Exception(
                 String.Format("Выдано исключение [{0}].", sqlQuery)));
        }
        finally
        {
            sqlCon.Close();
        }
        return (rezult);
    }
Все же вопрос с методом .Add() остался в силе, почему массив не добавляется в конец листа (как написано в справке к данной функции), а перезаписывает все строки?
0
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
12.12.2014, 21:22
Ответы с готовыми решениями:

SqlDataReader и запрос Compute
Собственно как при помощи SqlDataReader извлечь данные полученные посредством выполнения запроса Compute? Вот запрос: SELECT...

Вернуть данные с функции
Добрый вечер форумчане 8-).Такая проблема как можно вернуть данные с функции function poisk(){ var pol= ...

Вернуть данные из функции
Подскажите пожалуйста, у меня есть функция в которой постоянно в одну из переменных капают различные числа, как мне по приказу кнопки...

2
Администратор
Эксперт .NET
 Аватар для OwenGlendower
18242 / 14156 / 5366
Регистрация: 17.03.2014
Сообщений: 28,846
Записей в блоге: 1
12.12.2014, 22:03
Цитата Сообщение от bvalex Посмотреть сообщение
Такое ощущение что в лист rezult записываются не сами данные а ссылки на tabl и в итоге возвращается лист rezult
Правильное ощущение. Переменная rezult объявлена как List<objeсt>. Ключевое слово objeсt это псевдоним для типа System.Objеct который является ссылочным типом. При вызове метода Add() в список добавляется ссылка на переданный элемент без копирования данных на которые он указывает. Далее т.к. переменная tabl инициализируется одни раз, то на каждой интерации ты перезаписываешь массив и добавляешь тот же элемент в список. Решить "проблему" очень просто - перенеси строку Object[] tabl = new Object[Reader.FieldCount]; внутрь цикла while. Плюс неплохо объявить rezult как List<objeсt[]> раз ты добавляешь массивы туда. И поменять тип возвращаемого значения функции, конечно.

Обрати также внимание что код обработки исключения написан некорректно. В случае когда мы ловим исключение и генерируем вместо него другое следует сохранять информацию об оригинальном исключении. Это необходимо для упрощения отладки.
C#
1
2
3
4
5
6
7
catch (Exception ex)
{
    throw new Exception(
                 String.Format("Выдано исключение [{0}].", sqlQuery)
                 , ex
    );
}
Цитата Сообщение от bvalex Посмотреть сообщение
Да и почему-то в Visual Studio Web 2013 Express у меня отсутствует поддержка
коллекции HashTable она отсутствует и в InteliSens?
using System.Collections есть? Ну и тип называется Hashtable (t маленькая!).
0
0 / 0 / 1
Регистрация: 12.12.2014
Сообщений: 10
13.12.2014, 01:23  [ТС]
Благодарю, за подробные разъяснения. Очень помогло.
Сейчас уже переделал так:
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
String constr = @"Строка подключения"
            SqlConnection sqlcon = new SqlConnection(constr);
            String sqlcom = "СтрокаSQLзапроса"
            String sqlcom1 = "СтрокаSQLзапроса";
            SqlDataAdapter adapter = new SqlDataAdapter(sqlcom, sqlcon);
            DataSet dataset = new DataSet("Baza");
            try
            {
                sqlcon.Open();
                adapter.Fill(dataset, "Context");
                adapter.SelectCommand.CommandText = sqlcom1;
                adapter.Fill(dataset, "Zapr");
            }
            catch (Exception ex)
            {
                throw new Exception(
                             String.Format("Выдано исключение [{0}].", "Запрос")
                             , ex
                );
            }
            finally
            {
                sqlcon.Close();
            }
            GridView1.DataSource = dataset.Tables["Context"];
            GridView1.DataBind();
            GridView2.DataSource = dataset.Tables["Zapr"];
            GridView2.DataBind();
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
13.12.2014, 01:23
Помогаю со студенческими работами здесь

SqlDataReader и бинарные данные
Уважаемое Эксперты помогите пожалуйста ! Я записываю двоичное данное на базе SQL 2000 обратно когда получаю по запросу SQL ...

Вернуть данные из ajax функции
Здравствуйте. Суть вопроса такова. Есть функция function ajax_build(id) { var http = createObject(); function loginReply() {...

Извлечь данные из SqlDatareader в строку
Нужно извлчь данные из дата ридера строкой представляющей собой одну запись таблицы в БД. Строка должна быть следующего вида: ...

Не работает SQL-запрос SELECT и SqlDataReader
Всем привет, проблема в следующем: Мне нужно получить 1 значение из БД, но ридер тупо не хочет читать, перепробовал много вариантов, вот...

Как передать данные из SqlDataReader в BindingSource?
При загрузке формы, с помощью SqlDataReader-а заполняется ComboBox. private void Form1_Load(object sender, EventArgs e) { ...


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

Или воспользуйтесь поиском по форуму:
3
Ответ Создать тему
Новые блоги и статьи
Thinkpad X220 Tablet — это лучший бюджетный ноутбук для учёбы, точка.
Programma_Boinc 23.12.2025
Thinkpad X220 Tablet — это лучший бюджетный ноутбук для учёбы, точка. Рецензия / Мнение/ Перевод https:/ / **********/ gallery/ thinkpad-x220-tablet-porn-gzoEAjs . . .
PhpStorm 2025.3: WSL Terminal всегда стартует в ~
and_y87 14.12.2025
PhpStorm 2025. 3: WSL Terminal всегда стартует в ~ (home), игнорируя директорию проекта Симптом: После обновления до PhpStorm 2025. 3 встроенный терминал WSL открывается в домашней директории. . .
Как объединить две одинаковые БД Access с разными данными
VikBal 11.12.2025
Помогите пожалуйста !! Как объединить 2 одинаковые БД Access с разными данными.
Новый ноутбук
volvo 07.12.2025
Всем привет. По скидке в "черную пятницу" взял себе новый ноутбук Lenovo ThinkBook 16 G7 на Амазоне: Ryzen 5 7533HS 64 Gb DDR5 1Tb NVMe 16" Full HD Display Win11 Pro
Музыка, написанная Искусственным Интеллектом
volvo 04.12.2025
Всем привет. Некоторое время назад меня заинтересовало, что уже умеет ИИ в плане написания музыки для песен, и, собственно, исполнения этих самых песен. Стихов у нас много, уже вышли 4 книги, еще 3. . .
От async/await к виртуальным потокам в Python
IndentationError 23.11.2025
Армин Ронахер поставил под сомнение async/ await. Создатель Flask заявляет: цветные функции - провал, виртуальные потоки - решение. Не threading-динозавры, а новое поколение лёгких потоков. Откат?. . .
Поиск "дружественных имён" СОМ портов
Argus19 22.11.2025
Поиск "дружественных имён" СОМ портов На странице: https:/ / norseev. ru/ 2018/ 01/ 04/ comportlist_windows/ нашёл схожую тему. Там приведён код на С++, который показывает только имена СОМ портов, типа,. . .
Сколько Государство потратило денег на меня, обеспечивая инсулином.
Programma_Boinc 20.11.2025
Сколько Государство потратило денег на меня, обеспечивая инсулином. Вот решила сделать интересный приблизительный подсчет, сколько государство потратило на меня денег на покупку инсулинов. . . .
Ломающие изменения в C#.NStar Alpha
Etyuhibosecyu 20.11.2025
Уже можно не только тестировать, но и пользоваться C#. NStar - писать оконные приложения, содержащие надписи, кнопки, текстовые поля и даже изображения, например, моя игра "Три в ряд" написана на этом. . .
Мысли в слух
kumehtar 18.11.2025
Кстати, совсем недавно имел разговор на тему медитаций с людьми. И обнаружил, что они вообще не понимают что такое медитация и зачем она нужна. Самые базовые вещи. Для них это - когда просто люди. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2025, CyberForum.ru