Форум программистов, компьютерный форум, киберфорум
C#: Базы данных, ADO.NET
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.86/7: Рейтинг темы: голосов - 7, средняя оценка - 4.86
Каждому свое
533 / 219 / 81
Регистрация: 05.08.2013
Сообщений: 1,614
1

Неоднократная загрузка повторных таблиц в DataSet

16.07.2017, 07:55. Показов 1351. Ответов 9
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Доброго времени суток, Господа.
Есть база данных от Visual Fox Pro. Нужно с ней работать из программы на C#. Создал два класса:
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
    public static class Connection_OLEDB
    {
        static public OleDbConnection  connection { get; set; }
        static public string           pathToDB { get; set; }
 
        static public void              initialize(string path)
        {
            pathToDB = path;
            string connectionString =  @"Provider=vfpoledb;Data Source=" + pathToDB + @";Collating Sequence=machine;";
            connection = new OleDbConnection();
            connection.ConnectionString = connectionString;
        }
 
        public static void destroy()
        {
            connection.Close();
            connection.Dispose();
        }
    }
 
    public static class WorkTable_OLEDB
    {
        static private OleDbDataAdapter _adapter = null;
        static private OleDbCommand _command = null;
 
        public static void initialize()
        {
            _command = new OleDbCommand();
            _command.Connection = Connection_OLEDB.connection;
            _adapter = new OleDbDataAdapter();
            _adapter.SelectCommand = _command;
        }
 
        public static void destroy()
        {
            _command.Dispose();
            _adapter.Dispose();
        }
 
        public static void execute(string commandText, DataSet dataSet)
        {
            DataTable dt = new DataTable();
 
            if ((_command != null) | (_adapter != null))
            {
                try
                {
                    _command.CommandText = commandText;
                    Connection_OLEDB.connection.Open();
                    dt.Load(_command.ExecuteReader());
                    dataSet.Tables.Add(dt);
                    Connection_OLEDB.connection.Close();
                   
                }
                catch (Exception e)
                {
                    MessageBox.Show(e.Message);
                    Connection_OLEDB.connection.Close();
                }
            }
        }
    }
Так вот база должна грузится при открытии программы, но если база данных необнаружена, или необнаружены конкретные таблицы из базы данных, программа должна открыть окно настроек, где пользователь вводит путь до базы данных.
Примерно у меня получилось вот так:
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
        public void loadDataBase()
        {
            // Открываем раздел реестра
            RegistryKey software = Registry.CurrentUser.CreateSubKey("Software");
            RegistryKey progovro = software.CreateSubKey("PROGOVRO");
 
            // Пытаемся получить ключ PathToDB
            object pathToDBKey = progovro.GetValue("PathToDB");
            if (pathToDBKey == null)
            {
                MessageBox.Show("Укажите путь до Базы Данных в Настройках");
                showSettingForm();
                return;
            }
 
            // Создаем объект соединения
            Connection_OLEDB.initialize(pathToDBKey.ToString());
            WorkTable_OLEDB.initialize();
 
            bindingSource1.DataSource = dataSet1;
            this.dataGridView1.DataSource = bindingSource1;
 
            if (!Tables_OLEDB.isTablesExists(pathToDBKey.ToString()))
            {
                MessageBox.Show("Не найдены некоторые таблицы. Проверьте путь до Базы Данных в Настройках");
                showSettingForm();
                return;
            }
 
            this.button1.Enabled = true;
            this.button2.Enabled = true;
            this.FunctionMenuItem.Enabled = true;
            this.textBox1.Enabled = true;
            this.dataGridView1.Enabled = true;
 
            // Грузим таблицы в dataSet1
            WorkTable_OLEDB.execute("SELECT Itemperson, Vfamily, Vname, Vlastname, Vdatar, Vnation, Vobrazov, Vmestorgos, Vmestorobl, Vmestorgor, Vnachsroka, Vkonecsrok, Vosudata, Vosustatia, Vsudname, Vsroklet, Vsrokmes, Vkolsudim FROM " + Tables_OLEDB.cardPath + " ORDER BY Vfamily", this.dataSet1);
            WorkTable_OLEDB.execute("SELECT Name, Item FROM " + Tables_OLEDB.nationPath, this.dataSet1);
            WorkTable_OLEDB.execute("SELECT Name, Item FROM " + Tables_OLEDB.obrazovPath, this.dataSet1);
            WorkTable_OLEDB.execute("SELECT Name, Item FROM " + Tables_OLEDB.gosudPath, this.dataSet1);
            WorkTable_OLEDB.execute("SELECT Name, Item FROM " + Tables_OLEDB.oblastPath, this.dataSet1);
            WorkTable_OLEDB.execute("SELECT Name, Item FROM " + Tables_OLEDB.gorodPath, this.dataSet1);
            WorkTable_OLEDB.execute("SELECT Name, Item FROM " + Tables_OLEDB.statPath, this.dataSet1);
            WorkTable_OLEDB.execute("SELECT Name, Item FROM " + Tables_OLEDB.sudPath, this.dataSet1);
            WorkTable_OLEDB.execute("SELECT Itemperson, Vnomsudim, Vdataosu, Vstatosuj, Vkemosuj, Vsroklet, Vsrokmes, Vosnovosv FROM " + Tables_OLEDB.sudimostPath, this.dataSet1);
            WorkTable_OLEDB.execute("SELECT Itemperson, Vvidpoosh, Vdataob, Vzachto FROM  " + Tables_OLEDB.pooshrenPath + "", this.dataSet1);
            WorkTable_OLEDB.execute("SELECT Name, Item FROM " + Tables_OLEDB.vidpooshPath, this.dataSet1);
            WorkTable_OLEDB.execute("SELECT Itemperson, Vvid, Vdata, Vprichiny, Vdatasnajt FROM  " + Tables_OLEDB.distiplPath, this.dataSet1);
            WorkTable_OLEDB.execute("SELECT Name, Item FROM " + Tables_OLEDB.viddistPath, this.dataSet1);
            WorkTable_OLEDB.execute("SELECT Name, Item FROM " + Tables_OLEDB.prichdistPath, this.dataSet1);
 
            // Задаем имена Таблицам
            this.dataSet1.Tables[0].TableName = "CARD";
            this.dataSet1.Tables[1].TableName = "NATION";
            this.dataSet1.Tables[2].TableName = "OBRAZOV";
            this.dataSet1.Tables[3].TableName = "GOSUD";
            this.dataSet1.Tables[4].TableName = "OBLAST";
            this.dataSet1.Tables[5].TableName = "GOROD";
            this.dataSet1.Tables[6].TableName = "STAT";
            this.dataSet1.Tables[7].TableName = "SUD";
            this.dataSet1.Tables[8].TableName = "SUDIMOST";
            this.dataSet1.Tables[9].TableName = "POOSHREN";
            this.dataSet1.Tables[10].TableName = "VIDPOOSHREN";
            this.dataSet1.Tables[11].TableName = "DISTIPL";
            this.dataSet1.Tables[12].TableName = "VIDDISTIPL";
            this.dataSet1.Tables[13].TableName = "PRICHDISTIPL";
 
            // Отображаем таблицу CARD
            this.dataGridView1.DataMember = "CARD";
        }
Вот обработчик по нажатию на кнопку настроек:
C#
1
2
3
4
5
6
7
        public void showSettingForm()
        {
            var settingForm = new SettingForm();
            settingForm.ShowDialog();
            if (settingForm.ShowDialog() == System.Windows.Forms.DialogResult.OK)
                loadDataBase();
        }
А теперь сама суть проблемы: Проблема заключается в том, что я могу неоднократно заходить в настройки, вводить преднамеренно правильный путь до базы данных, и нажимать на кнопку ок. Следовательно база, которая была ранее загружена в DataSet, будет опять грузиться в него, и увеличивать количество таблиц в твое, и тд. Это не есть хорошо, как Вы понимаете. Я конечно могу это исправить всякими костылями, но хотелось бы услышать более правильное решение этой проблемы, поэтому я обращаюсь к Вам, ув. форумчане

Добавлено через 10 часов 51 минуту
Еще актуально
0
Лучшие ответы (1)
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
16.07.2017, 07:55
Ответы с готовыми решениями:

Загрузка в DataSet нескольких таблиц
Здравствуйте. У меня возникло несколько вопросов. Как известно DataSet может содержать несколько...

Асинхронное загрузка таблиц в DataSet
Можно ли реализовать глобальную и асинхронную загрузку таблиц в DataSet ? Т.е Мы подключаемся к БД...

Обновление таблиц в DataSet
Здравствуйте! Пишу БД. Столкнулся с такой проблемой: В БД Access 2007 имеется несколько...

Связи таблиц DataSet
Добрый день. При первом чтении данных из источника в DataSet (myDB) считываются все таблицы, затем...

9
Администратор
Эксперт .NET
17558 / 13780 / 5299
Регистрация: 17.03.2014
Сообщений: 28,258
Записей в блоге: 1
16.07.2017, 16:14 2
Лучший ответ Сообщение было отмечено Bretbas как решение

Решение

Bretbas, что-то мешает удалить все таблицы из DataSet перед загрузкой? Таблицы не связаны так что проблем быть не должно
C#
1
dataSet1.Tables.Clear();
длинный postscriptum
P.S. Код очень неряшливый. Пока не поздно стоит заняться рефакторингом.
1) В первую очередь нужно избавиться от static полей и свойств. Они здесь неуместны. Кроме разве что строки соединения.
2) Соединение нет нужды постоянно хранить. Открыли, поработали, закрыли.
3) Не нужно изобретать собственные методы для очистки состояния. Имею в виду методы destroy(). Если класс владеет каким-то ресурсами, то правильнее делать их освобождение в реализации IDisposable. Это заодно заставит избавиться от static
4) При работе с реестром нужно не забывать закрывать ключи. И не нужно создавать ветки если задача только прочитать значение.
5) Непоняно зачем метод showSettingForm() два раза показывает форму SettingForm. Опечатка?
6) Методы loadDataBase() делает слишком много действий. Его нужно разбить и упростить, отделив при этом работу с БД от взаимодействия с UI.
Чуть лучшенный вариант смотри ниже. Его не получится просто так вставить взамен старого - наверняка в коде есть куча зависимостей от "старых" классов, но по крайней мере покажет направление для улучшения.
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
static class MySettings
{
    public static string ConnectionString { get; private set; }
    
    public const string cardPath = "??";
    public const string nationPath = "??";
    public const string obrazovPath = "??";
    public const string gosudPath = "??";
    public const string oblastPath = "??";
    public const string gorodPath = "??";
    public const string statPath = "??";
    public const string sudPath = "??";
    public const string sudimostPath = "??";
    public const string pooshrenPath = "??";
    public const string vidpooshPath = "??";
    public const string distiplPath = "??";
    public const string viddistPath = "??";
    public const string prichdistPath = "??";
 
    public static void SetDbPath(string path)
    {
        if (path == null) throw new ArgumentNullException(nameof(path));
        
        ConnectionString = "Provider=vfpoledb; Data Source=" + path + "; Collating Sequence=machine;";
    }
}
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
// Класс вместо Connection_OLEDB и WorkTable_OLEDB
static class OleDbHelper
{
    public static DataTable GetDataTable(string connectionString, string query)
    {
        using (var dbConn = new OleDbConnection(connectionString))
        {
            return GetDataTable(dbConn, query);
        }
    }
 
    public static DataTable GetDataTable(OleDbConnection connection, string query)
    {
        var command = new OleDbCommand(query, connection);
        var dataTable = new DataTable();
    
        if (connection.State != ConnectionState.Open)
        {
            connection.Open();
        }
        using (var dataReader = command.ExecuteReader())
        {
            dataTable.Load(dataReader);
        }
        return 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
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
static void execute(string tableName, DataSet dataSet, string query)
{
    DataTable dt = OleDbHelper.GetDataTable(MySettings.ConnectionString, query);
    dt.TableName = tableName;
    dataSet.Tables.Add(dt);
}
 
public void loadDataBase()
{
    string pathToDB = (string)Registry.GetValue(@"HKEY_CURRENT_USER\Software\PROGOVRO", "PathToDB", null);
    if (pathToDB == null)
    {
        MessageBox.Show("Укажите путь до Базы Данных в Настройках");
        showSettingForm();
        return;
    }
    
    MySettings.SetDbPath(pathToDB);
 
 
    if (!Tables_OLEDB.isTablesExists(pathToDB))
    {
        MessageBox.Show("Не найдены некоторые таблицы. Проверьте путь до Базы Данных в Настройках");
        showSettingForm();
        return;
    }
 
    // Грузим таблицы в dataSet1
    execute("CARD"        , dataSet1, "SELECT Itemperson, Vfamily, Vname, Vlastname, Vdatar, Vnation, Vobrazov, Vmestorgos, Vmestorobl, Vmestorgor, Vnachsroka, Vkonecsrok, Vosudata, Vosustatia, Vsudname, Vsroklet, Vsrokmes, Vkolsudim FROM " + MySettings.cardPath + " ORDER BY Vfamily");
    execute("NATION"      , dataSet1, "SELECT Name, Item FROM " + MySettings.nationPath);
    execute("OBRAZOV"     , dataSet1, "SELECT Name, Item FROM " + MySettings.obrazovPath);
    execute("GOSUD"       , dataSet1, "SELECT Name, Item FROM " + MySettings.gosudPath);
    execute("OBLAST"      , dataSet1, "SELECT Name, Item FROM " + MySettings.oblastPath);
    execute("GOROD"       , dataSet1, "SELECT Name, Item FROM " + MySettings.gorodPath);
    execute("STAT"        , dataSet1, "SELECT Name, Item FROM " + MySettings.statPath);
    execute("SUD"         , dataSet1, "SELECT Name, Item FROM " + MySettings.sudPath);
    execute("SUDIMOST"    , dataSet1, "SELECT Itemperson, Vnomsudim, Vdataosu, Vstatosuj, Vkemosuj, Vsroklet, Vsrokmes, Vosnovosv FROM " + MySettings.sudimostPath);
    execute("POOSHREN"    , dataSet1, "SELECT Itemperson, Vvidpoosh, Vdataob, Vzachto FROM  " + MySettings.pooshrenPath);
    execute("VIDPOOSHREN" , dataSet1, "SELECT Name, Item FROM " + MySettings.vidpooshPath);
    execute("DISTIPL"     , dataSet1, "SELECT Itemperson, Vvid, Vdata, Vprichiny, Vdatasnajt FROM  " + MySettings.distiplPath);
    execute("VIDDISTIPL"  , dataSet1, "SELECT Name, Item FROM " + MySettings.viddistPath);
    execute("PRICHDISTIPL", dataSet1, "SELECT Name, Item FROM " + MySettings.prichdistPath);
 
    bindingSource1.DataSource = dataSet1;
    this.dataGridView1.DataSource = bindingSource1;
    
    this.button1.Enabled = true;
    this.button2.Enabled = true;
    this.FunctionMenuItem.Enabled = true;
    this.textBox1.Enabled = true;
    this.dataGridView1.Enabled = true;
    
    // Отображаем таблицу CARD
    this.dataGridView1.DataMember = "CARD";
}
1
Каждому свое
533 / 219 / 81
Регистрация: 05.08.2013
Сообщений: 1,614
16.07.2017, 17:35  [ТС] 3
OwenGlendower,
Цитата Сообщение от OwenGlendower Посмотреть сообщение
что-то мешает удалить все таблицы из DataSet перед загрузкой? Таблицы не связаны так что проблем быть не должно
Да я так делал dataSet1.Tables.Clear();, но почему-то не срабатывало это. Может быть из-за моего неряшливого кода. Я плохо знаю C#, приходится делать как попало. Принцип вашего приведенного кода, с приминением рефакторинга, мне понятен, внедрить в свой код смогу. Единственное мне не понятно вот эта функция:
C#
1
2
3
4
5
6
7
    public static DataTable GetDataTable(string connectionString, string query)
    {
        using (var dbConn = new OleDbConnection(connectionString))
        {
            return GetDataTable(dbConn, query);
        }
    }
Каждый раз, когда вызываешь функцию
C#
1
2
3
4
5
6
static void execute(string tableName, DataSet dataSet, string query)
{
    DataTable dt = OleDbHelper.GetDataTable(MySettings.ConnectionString, query);
    dt.TableName = tableName;
    dataSet.Tables.Add(dt);
}
Вызывается функция GetDataTable(string connectionString, string query), и та в свою очередь, вызывает создание объекта типа OleDbConnection? Зачем оборачивать создание этого объекта в using:
C#
1
using (var dbConn = new OleDbConnection(connectionString))
скорее всего в этом тайна и кроется моего вопроса
0
Администратор
Эксперт .NET
17558 / 13780 / 5299
Регистрация: 17.03.2014
Сообщений: 28,258
Записей в блоге: 1
16.07.2017, 17:53 4
Цитата Сообщение от Bretbas Посмотреть сообщение
Зачем оборачивать создание этого объекта в using
Чтобы соединение с БД закрылось и в случае успешного выполнения запроса и в случае исключения.
0
Каждому свое
533 / 219 / 81
Регистрация: 05.08.2013
Сообщений: 1,614
16.07.2017, 20:35  [ТС] 5
OwenGlendower,
Чтобы соединение с БД закрылось и в случае успешного выполнения запроса и в случае исключения.
Понял. Но я все-таки имел ввиду другое. Каждый раз, когда вызывается функция execute(string tableName, DataSet dataSet, string query), создается НОВЫЙ объект типа OleDbConnection. Вызов execute неоднократный.

Добавлено через 2 часа 8 минут
Все вроде поправил свой код в более менее нормальный вид. Остались также два вопроса:
1. При неоднократном вызове execute(string tableName, DataSet dataSet, string query) создается постоянно объект OleDbConnection, если это так, то это не есть хорошо.
2. Если пользователь будет нажимать неоднократно настройки, выбирать тот же путь, по которому уже ранее были загружены таблицы в DataSet, то таблицы будут заново грузится в DataSet и увеличивать его в двое и тд(это я уже писал выше). OwenGlendower, как Вы написали выше, достаточно просто перед вызовом loadDataBase() вызывать dataSet1.Tables.Clear();. Я так и сделал, и до этого делал, только у меня не получалось. А именно после этого вызова datagridview перестает отображать таблицу CARD, вообще перестает отображать все. Хотя в DataSet таблицы имеются
0
Эксперт .NET
12502 / 8687 / 1310
Регистрация: 21.01.2016
Сообщений: 32,633
17.07.2017, 08:19 6
Цитата Сообщение от Bretbas Посмотреть сообщение
создается постоянно объект OleDbConnection, если это так, то это не есть хорошо.
Помещайте все вызовы execute в одном блоке using или не используйте using, в ручную закрывайте подключение, когда это будет возможно.

Цитата Сообщение от Bretbas Посмотреть сообщение
Если пользователь будет нажимать неоднократно настройки, выбирать тот же путь, по которому уже ранее были загружены таблицы в DataSet, то таблицы будут заново грузится в DataSet и увеличивать его в двое и тд(это я уже писал выше).
Загружайте настройки только в первый раз (кешируйте) или очищайте таблицу.
1
Каждому свое
533 / 219 / 81
Регистрация: 05.08.2013
Сообщений: 1,614
17.07.2017, 09:22  [ТС] 7
Usaga,
Цитата Сообщение от Usaga Посмотреть сообщение
Помещайте все вызовы execute в одном блоке using или не используйте using, в ручную закрывайте подключение, когда это будет возможно.
Мне нужно несколько раз вызвать функцию execute, чтобы подгрузить все таблицы. Каждый раз когда я вызываю execute, создается новый объект OleDbConnection. Что тут нужно помещать в using? Или каждый раз когда прошел успешный вызов execute, нужно закрывать соединение?

Цитата Сообщение от Usaga Посмотреть сообщение
Загружайте настройки только в первый раз (кешируйте) или очищайте таблицу.
Я очищал, но после этого перестает отображать DataGridView
0
Эксперт .NET
12502 / 8687 / 1310
Регистрация: 21.01.2016
Сообщений: 32,633
17.07.2017, 09:27 8
Цитата Сообщение от Bretbas Посмотреть сообщение
Или каждый раз когда прошел успешный вызов execute, нужно закрывать соединение?
Нет. Просто соединение закрывать нужно принципиально, но не обязательно после каждого запроса. Либо все вызовы в одном блоке Using делайте (если возможно), либо вообще не используйте using и вручную закрывайте соединение (Close() или Dispose()), когда оно уже станет ненужным.
1
Администратор
Эксперт .NET
17558 / 13780 / 5299
Регистрация: 17.03.2014
Сообщений: 28,258
Записей в блоге: 1
17.07.2017, 15:07 9
Цитата Сообщение от Bretbas Посмотреть сообщение
При неоднократном вызове execute(string tableName, DataSet dataSet, string query) создается постоянно объект OleDbConnection, если это так, то это не есть хорошо.
Ключевое здесь скорее постоянное открытие и закрытие соединения, а не создание объекта. Тем не менее оба момента несложно обойти создав соединение один раз.
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
static void execute(string tableName, DataSet dataSet, OleDbConnection connection, string query)
{
    DataTable dt = OleDbHelper.GetDataTable(connection, query);
    dt.TableName = tableName;
    dataSet.Tables.Add(dt);
}
 
...
 
    // Грузим таблицы в dataSet1
    using (var dbConn = new OleDbConnection(MySettings.ConnectionString))
    {
        execute("CARD"        , dataSet1, dbConn, "SELECT Itemperson, Vfamily, Vname, Vlastname, Vdatar, Vnation, Vobrazov, Vmestorgos, Vmestorobl, Vmestorgor, Vnachsroka, Vkonecsrok, Vosudata, Vosustatia, Vsudname, Vsroklet, Vsrokmes, Vkolsudim FROM " + MySettings.cardPath + " ORDER BY Vfamily");
        execute("NATION"      , dataSet1, dbConn, "SELECT Name, Item FROM " + MySettings.nationPath);
        execute("OBRAZOV"     , dataSet1, dbConn, "SELECT Name, Item FROM " + MySettings.obrazovPath);
        // Далее по аналогии
        // ...
    }
Еще лучше будет не грузить все данные в память, а обращаться к таблицам БД по мере необходимости.

Цитата Сообщение от Bretbas Посмотреть сообщение
А именно после этого вызова datagridview перестает отображать таблицу CARD, вообще перестает отображать все. Хотя в DataSet таблицы имеются
Видимо нужно заново перебиндить данные к dataGridView1.
0
Каждому свое
533 / 219 / 81
Регистрация: 05.08.2013
Сообщений: 1,614
17.07.2017, 18:58  [ТС] 10
Цитата Сообщение от Usaga Посмотреть сообщение
Нет. Просто соединение закрывать нужно принципиально, но не обязательно после каждого запроса. Либо все вызовы в одном блоке Using делайте (если возможно), либо вообще не используйте using и вручную закрывайте соединение (Close() или Dispose()), когда оно уже станет ненужным.
Цитата Сообщение от OwenGlendower Посмотреть сообщение
Ключевое здесь скорее постоянное открытие и закрытие соединения, а не создание объекта. Тем не менее оба момента несложно обойти создав соединение один раз.
Спасибо, так и сделал У меня просто параноя начинается, когда я вижу неоднократное создание одинаковых, ненужных объектов. Это C++ виноват...

Цитата Сообщение от OwenGlendower Посмотреть сообщение
Видимо нужно заново перебиндить данные к dataGridView1.
Да, но он тогда сбивает все настройки столбцов DataGridView, которые я сделал в конструкторе, и приходится все ручками кодом писать, чтобы восстановить все как было
Пришлось применить альтернативное решение:
C#
1
2
3
4
5
6
7
8
9
        void execute(string tableName, DataSet dataSet, string query)
        {
            if( dataSet.Tables.Contains(tableName))
                return;
 
            DataTable dt = OleDbHelper.GetDataTable(MySettings.ConnectionString, query);
            dt.TableName = tableName;
            dataSet.Tables.Add(dt);
        }
0
17.07.2017, 18:58
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
17.07.2017, 18:58
Помогаю со студенческими работами здесь

Произведение таблиц из dataset
товарищи, подскажите как быть: засунул в датасет две таблицы из БД, нужно получить произведение...

Изменение порядка таблиц в dataSet
В dataSet добавлено много таблиц. Добавлялись изначально в произвольном порядке, но появилась...

Создание и заполнение таблиц в DataSet
Здравствуйте! У меня есть запрос который возвращает что-то типа такого: ID string 1 <строка1>...

Отображение в DataGridView представления таблиц из DataSet
Здравствуйте! У меня такой вопрос. Есть уже заполненный DataSet со связанными таблицами. В главной...


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

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