Справочник функций

Ваш аккаунт

Войти через: 
Забыли пароль?
Регистрация
Информацию о новых материалах можно получать и без регистрации:

Почтовая рассылка

Подписчиков: -1
Последний выпуск: 19.06.2015

компонент для доступа к данным

284
23 декабря 2005 года
michael_is_98
587 / / 25.02.2005
Здравствуйте!

Скажите, кто-нибудь создавал подобный компонент? В Visual Studio. Назначение - выборка данных с SQL-сервера, из текстового файла.
Набросал примерно такой класс:

Код:
class CIstochnikDannih
{
public:
    CIstochnikDannih();
    ~CIstochnikDannih();
    double* ZagruzitDannie(char*); //çàãðóçèü äàííûå èç ôàéëà

    double PoluchitElement(int);
    int PoluchitRazmer(void);
    double* PoluchitDannie(void);
private:
    double *data;
    int n;
};

Метод ZagruzitDannie служит для загрузки данных из текстового файла (имя его задается при вызове метода). Данные - одномерный массив - записываются в массив *data. В n - помещается размер массива. В деструкторе массив освобождается.
 
Код:
double* CIstochnikDannih::PoluchitDannie(void)
{
    assert(data!=NULL);
    return data;
}

В общем простой класс, есть идеи как его усовершенстовать? И как использовать для выборки данных с SQL-сервера?
2.4K
24 декабря 2005 года
dinasok51
219 / / 12.11.2005
Для доступа к БД вообще и к SQL-серверу в часности
IMHO лучше всего использовать ADO.
(ADO.NET поддерживает С# и VB, но не С++ )
Там уже есть то, что ты хочешь сам написать.
В MSDN хорошее описание с примерами.
284
26 декабря 2005 года
michael_is_98
587 / / 25.02.2005
Цитата:
Originally posted by dinasok51
Для доступа к БД вообще и к SQL-серверу в часности
IMHO лучше всего использовать ADO.
(ADO.NET поддерживает С# и VB, но не С++ )
Там уже есть то, что ты хочешь сам написать.
В MSDN хорошее описание с примерами.


В MSDN описана поддержка подключения через классы библиотеки MFC - DAO, ODBC.
Цитата:
?

Цитата:
MFC has two kinds of database classes: those based on Open Database Connectivity (ODBC) and those based on Data Access Objects (DAO).


Это С++.
Смотрим раздел Visual Studio.NET->Developing with Visual Studio .NET->Visual C++->Visual C++ Samples->Managed Extensions for C++ Samples
Пример Data

или

Visual Studio.NET->Developing with Visual Studio .NET->Visual C++->Managed Extensions for C++ Programming->Inside the .NET Framework->.NET Framework Class Library ->System.Data

реализовано подключение через ADO.NET. Это классы System.Data.SQLClient, System.Data.ODBC, System.Data.OleDB. Это Managed C++.

Путаешься в этих подходах. Что лучше?
везде ли будет работать программа на MFC и ADO.NET?

284
26 декабря 2005 года
michael_is_98
587 / / 25.02.2005
Можно ли создать MS Visual C++ Project на MFC и использовать в нем возможности ADO.NET?
2.4K
27 декабря 2005 года
dinasok51
219 / / 12.11.2005
Здесь найдешь ADO, описание и множество примеров на VB, VJ, C++ ...

ODBC - универсальный, но довольно сложный в использовании интерфейс к БД
DAO - доступ к Access

ADO - универсальный интерфейс к БД, на основе СОМ
Для разработки и исполнения! необходимо установить MDAC

Цитата:
(ADO.NET поддерживает С# и VB, но не С++ )


Цитата:
Можно ли создать MS Visual C++ Project на MFC и использовать в нем возможности ADO.NET?

IMHO нет.
На уровне С++ ADO и ADO.NET не совместимы

284
06 января 2006 года
michael_is_98
587 / / 25.02.2005
Я понял, что мне нужно - создать простой компонент, который позволял бы работать с таблицами.
Файл с данными может иметь такой формат

2 3
a b c
11 12 13
21 22 23

Т.е. указывается число строк, столбцов в матрице, затем идут заголовки столбцов, затем сами данные.

Есть идеи, как это можно сделать на Си++ и что лучше для этого использовать - .NET компоненты или компоненты на основе MFC?

Т.е. нужно выбрать виз. компонент, в который будут записываться и отображаться данные пользователю и создать класс для доступа к данным - чтение / запись числовых данных из/в файл, получить/установить кол-во строк/столбцов.
Может кто-то работал с подобными задачами? Интересует подобный класс для доступа к данным.
2.4K
06 января 2006 года
dinasok51
219 / / 12.11.2005
Не понятно, хочешь ли ты создавать свой файл своего уникального формата или использовать напр. MDB-файл?
Короче, где хранятся данные и много ли их?
284
08 января 2006 года
michael_is_98
587 / / 25.02.2005
Цитата:
Originally posted by dinasok51
Не понятно, хочешь ли ты создавать свой файл своего уникального формата или использовать напр. MDB-файл?
Короче, где хранятся данные и много ли их?


Уникальный простой формат. В файлах этого формата, данных - до 1000000 вещ. чисел

2.4K
08 января 2006 года
dinasok51
219 / / 12.11.2005
Цитата:
Originally posted by michael_is_98
Уникальный простой формат. В файлах этого формата, данных - до 1000000 вещ. чисел



1. Для уникального хотя и простого формата нужен свой опять же уникальный и не всегда простой инструмент доступа к данным, навигации и заполнения визуального элемента( CListCtrl, FlexGrid и тд ). Для относительно больших наборов ( > 100000 ) данных все это работает медленно.
Если данные могут меняться, а не только отображаться, то редактирование файла "уникального простого формата" занятие ИМНО неблагодарное.

2. Если и использовать напр. MDB то проблема решается очень просто:

На форму устанавливаешь DataGrid и AdoDc, настраиваешь и привязываешь их к твоему MDB и все! Получаешь весь набор, не написав ни одной строчки кода! Работает это очень быстро

Это на С++, при этом неважно VS или .NET
Если нужна какая-либо обработка, то ИМХО лучше всего использовать ADO. см выше.


3. Все это же можно сделать и на С#, но для больших наборов визуализация данных работает ооооочень медленно. Microsoft что-то недоделала

284
08 января 2006 года
michael_is_98
587 / / 25.02.2005
Цитата:
Originally posted by dinasok51
1. Для уникального хотя и простого формата нужен свой опять же уникальный и не всегда простой инструмент доступа к данным, навигации и заполнения визуального элемента( CListCtrl, FlexGrid и тд ). Для относительно больших наборов ( > 100000 ) данных все это работает медленно.
Если данные могут меняться, а не только отображаться, то редактирование файла "уникального простого формата" занятие ИМНО неблагодарное.

2. Если и использовать напр. MDB то проблема решается очень просто:

На форму устанавливаешь DataGrid и AdoDc, настраиваешь и привязываешь их к твоему MDB и все! Получаешь весь набор, не написав ни одной строчки кода! Работает это очень быстро

Это на С++, при этом неважно VS или .NET
Если нужна какая-либо обработка, то ИМХО лучше всего использовать ADO. см выше.


3. Все это же можно сделать и на С#, но для больших наборов визуализация данных работает ооооочень медленно. Microsoft что-то недоделала


я сделал две процедуры, одна читает данные из файла в обычный массив типа double, другая - записывает из массива в файл. Да, для больших объемов действительно важна скорость чтения/записи. Частично ее решил:
- для чтения, вызвав функцию MapViewOfFile (), далее работаю с файлом как со строкой, читаю целые, вещ. числа.
- для записи - используя буфер строк, когда в файл записывается сразу несколько строк, а не одна.
(есть у кого-то есть еще идеи, как ускорить чтение/запись?)

Насчет компонента отображения - здесь есть соседняя тема, где рассматривается подобный компонент, можно поэкспериментировать. Но мне интересно, если данные считаны и записаны в одномерный массив, насколько долго они будут записываться в визуальный компонент? По идее, самая долгая операция - это чтение/запись данных из/в файл (вместе с преобразованием "число-строка" и наоборот). Поэтому вывод считанных данных в грид не должен занять много времени, хотя нужно смотреть...

Насчет баз данных - думал над этим, но
1) во-первых, для редактирования, добавления данных придется использовать СУБД или его компоненты (здесь же можно использовать простой формат и простой текстовый редактор)
2) не знаю, как считать из базы данных числа в массив вещ.чисел на уровне Си/Си++
3) идея с простым текстовым файлом реализована в программе matrixer (nsu.ru/ef/tsy) и там это работает очень быстро.

2.4K
09 января 2006 года
dinasok51
219 / / 12.11.2005
Цитата:
Originally posted by michael_is_98
я сделал две процедуры, одна читает данные из файла в обычный массив типа double, другая - записывает из массива в файл. Да, для больших объемов действительно важна скорость чтения/записи. Частично ее решил:
- для чтения, вызвав функцию MapViewOfFile (), далее работаю с файлом как со строкой, читаю целые, вещ. числа.
- для записи - используя буфер строк, когда в файл записывается сразу несколько строк, а не одна.
(есть у кого-то есть еще идеи, как ускорить чтение/запись?)


Как я понимаю, тебе нужен инструмент для хранения, отображения и редактирования больших объемов информации. ИМХО обычные файлы для этого наименее пригодны, тк плохо приспособлены для произвольного доступа. Можно конечно создать нечто свое уникальное, но в конце концов все опять сведется к подобию БД. Можно пытаться оптимизировать это нечто, используя кэширование и т.п. Но по моим представлениям это не решение прооблемы.

Цитата:

Насчет компонента отображения - здесь есть соседняя тема, где рассматривается подобный компонент, можно поэкспериментировать. Но мне интересно, если данные считаны и записаны в одномерный массив, насколько долго они будут записываться в визуальный компонент? По идее, самая долгая операция - это чтение/запись данных из/в файл (вместе с преобразованием "число-строка" и наоборот). Поэтому вывод считанных данных в грид не должен занять много времени, хотя нужно смотреть...


DataGrid вместе AdoDB делают все это и делает очень быстро и хорошо и очень гибки в настройке

Цитата:

Насчет баз данных - думал над этим, но
1) во-первых, для редактирования, добавления данных придется использовать СУБД или его компоненты (здесь же можно использовать простой формат и простой текстовый редактор)
2) не знаю, как считать из базы данных числа в массив вещ.чисел на уровне Си/Си++
3) идея с простым текстовым файлом реализована в программе matrixer (nsu.ru/ef/tsy) и там это работает очень быстро.



1) Я плохо представляю себе как можно приспособить "простой текстовый редактор" для редактирования БД
2) Для этого используется очень простой SQL-запрос нечто вроде SELECT "имя столбца" FROM "имя таблицы"
3) Не могу ничего сказать по поводу эффективности тк нет исходников, а выходные данные очень малы по объему

284
09 января 2006 года
michael_is_98
587 / / 25.02.2005
Вопрос с форматом хранения данных для меня решен. Да, у него есть недостатки, но для хранения простых числовых данных с наименованиями столбцов его будет достаточно. Зачем усложнять?

Вопрос скорее заключен в другом - как на основе функций чтения/записи создать свой собственный класс, который позволил бы работать с данными на более высоком уровне абстракции. И как обеспечить взаимодействие этого класса с каким-нибудь визуальным компонентом "таблица".

Насчет БД - видимо проще будет просто экспортировать данные из таблиц по запросу в простой текстовый формат, который я описал:
1) не всегда знаешь каков запрос, и его создание и выполнение лучше целиком возложить на сервер
2) результаты запроса можно отфильтровать средствами сервера и затем передать в текстовый файл

Есть несколько БД, выборка и обработка данных которых может быть востребована, но я не могу сказать, что именно может понадобиться из этих баз. Поэтому создание запросов лучше отложить.
И использовать простой формат, в который можно в случае необходимости экспортировать данные (например, посредством буфера обмена)
2.4K
11 января 2006 года
dinasok51
219 / / 12.11.2005
Цитата:
Originally posted by michael_is_98
Вопрос скорее заключен в другом - как на основе функций чтения/записи создать свой собственный класс, который позволил бы работать с данными на более высоком уровне абстракции. И как обеспечить взаимодействие этого класса с каким-нибудь визуальным компонентом "таблица".



Как вариант

Код:
class CYourData : public CListCtrl
{
public:
// Управление файлом
   Open();
   Close();
   Create();

// Редактирование
   Read();
   Update();
   Write();
   Add();

// Навигация по файлу
   Fist();
   Last();
   Next();
   Previous();
   Find();
   EOF();
   BOF();

// Управление визуальным компонентом
   SetColumnHeader();
   GetItem();
   SetItem();
   AddRow();
}



Цитата:

Вопрос с форматом хранения данных для меня решен. Да, у него есть недостатки, но для хранения простых числовых данных с наименованиями столбцов его будет достаточно. Зачем усложнять?
Насчет БД - видимо проще будет просто экспортировать данные из таблиц по запросу в простой текстовый формат, который я описал:
1) не всегда знаешь каков запрос, и его создание и выполнение лучше целиком возложить на сервер
2) результаты запроса можно отфильтровать средствами сервера и затем передать в текстовый файл

Есть несколько БД, выборка и обработка данных которых может быть востребована, но я не могу сказать, что именно может понадобиться из этих баз. Поэтому создание запросов лучше отложить.
И использовать простой формат, в который можно в случае необходимости экспортировать данные (например, посредством буфера обмена)



По поводу простоты

1. Создать свой интерфейс для управления и визуализации
2. Дорабатывать сервер и научить его:
- исполнять желания клиента, кот сам не знает чего хочет,
- экспортировать данные в текстовый файл.
- импортировать данные обратно в БД.
3. Редактировать простым текстовым редактором
А как быть с синтактическим контролем?
4. Научить БД работать с буфером обмена и класть в него нужные данные в нужное время


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

284
11 января 2006 года
michael_is_98
587 / / 25.02.2005
Мне больше нужен компонент для работы с числовыми вещественными данными - для статистики. И чтобы не привязываться к БД, достаточно использовать обычный одномерный массив вещественных чисел, из которого читаются данные и записываются. Одномерный - потому что любую матрицу можно записать в одномерный массив и считать значение любого элемента, так как нам будет известно число строк и столбцов (см. описание простого формата, в начале которого как раз и указаны эти числа+наименования столбцов).

А класс то как раз и нужен, чтобы читать/записывать данные из/в файл, т.е. это промежуточное звено между визуальным элементом и самими данными. Для простоты можно положить, что данные считываются один раз при показе виз. элемента, записываются при его закрытии (т.е. не как в клиент-сервере - понятно, что для этого проще использовать соотв. компоненты). При редактировании чисел меняется массив вещ. чисел, при добавлении - меняется размерность массива, а данные берутся из виз.элемента.

Вот это промежуточное звено представляю так:
Код:
typedef list<char*> SPISOKSTROK;

class CIstochnikDannih
{
public:
    CIstochnikDannih(char*);
    ~CIstochnikDannih();
    double PoluchitElement(const int, const int);
    int PoluchitKolvoStrok();
    int PoluchitKolvoStolbzov();

    //void Zapisat();

private:
    char *fn;

    int n;// число строк (наблюдений)
    int m;// число столбцов (признаков)
    SPISOKSTROK komment;
    SPISOKSTROK peremimena;
    SPISOKSTROK::iterator istr;
    double *data;// уложен по наблюдениям
// (i,j) (i=1,n;j=1,m) элемент имеет индекс j+m*(i-1)-1
};


Но это очень просто. И возможно имеет свои недостатки. Может проще не создавать такой класс, а вызывать функции чтения/записи из класса виз. элемента. Только подойдет ли CListCtrl для хранения скажем 1 млн. чисел?
Синтаксический котроль просто реализовать - если при чтении обнаружена ошибка - не открывать данные, при сохранении все должно записываться правильно.
2.4K
13 января 2006 года
dinasok51
219 / / 12.11.2005
Цитата:
Originally posted by michael_is_98
...чтобы не привязываться к БД ...


ADO(.NET), ODBC, JDBC именно для того и разработаны, чтобы делать приложения независимыми от конкретных БД

Цитата:
Только подойдет ли CListCtrl для хранения скажем 1 млн. чисел?

Заполнение CListCtrl таким количеством эл-тов длится раздражающе долго( на 1ГГЦ - многие десятка сек). Можно организовать визуализацию мелкими порциями напр. по 100 строк, но тогда нужно достраивать навигацию по данным.

Цитата:
Синтаксический котроль просто реализовать - если при чтении обнаружена ошибка - не открывать данные, при сохранении все должно записываться правильно.

Речь шла о редактировании данных "простым текстовым редактором". Мой вопрос относился к нему: как ты предполагал проводить синтактический анализ в этом "простом текстовом редакторе"?

284
16 января 2006 года
michael_is_98
587 / / 25.02.2005
Цитата:
Originally posted by dinasok51
ADO(.NET), ODBC, JDBC именно для того и разработаны, чтобы делать приложения независимыми от конкретных БД
Заполнение CListCtrl таким количеством эл-тов длится раздражающе долго( на 1ГГЦ - многие десятка сек). Можно организовать визуализацию мелкими порциями напр. по 100 строк, но тогда нужно достраивать навигацию по данным.

Речь шла о редактировании данных "простым текстовым редактором". Мой вопрос относился к нему: как ты предполагал проводить синтактический анализ в этом "простом текстовом редакторе"?


Понятно, визуальный компонент на Си++ - такой как таблица еще стоит поискать или создавать самому, но на это нужно много времени (такого компонента нет). Ну да ладно. Хотя бы на программном уровне работать.

Все очень просто - при чтении данных, т.к. они записаны в виде
1.222
1.43
-1.4e+003

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

Здесь выше я привел примерный вид класса для чтения данных, но теперь я вижу его недостаток - он хорошо работает при чтении данных из файла.
Но мне нужно обеспечить еще и запись в файл такого же формата. Т.е.

 
Код:
<кол-во строк> <кол-во столбцов>
<наимен1столбца> <наимен2столбца> ...
число11 число12 число13...
число21 число22 число23...
..........................

Возможно для этого придется создавать класс, который работает на запись данных в файл, задаваемый пользователем. Только как получить в итоге один класс, работающий на вход и выход?
2.4K
19 января 2006 года
dinasok51
219 / / 12.11.2005
Цитата:
Originally posted by michael_is_98
Понятно, визуальный компонент на Си++ - такой как таблица еще стоит поискать или создавать самому, но на это нужно много времени (такого компонента нет).

CListCtrl, FlexGrid, HFlexgrid, DataGrid-Это уже 2 раза обсуждали.

Цитата:

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

Добавь в свой класс симметричные ф-ции вывода и будет также хорошо работать и при записи данных в файл.

284
20 января 2006 года
michael_is_98
587 / / 25.02.2005
Цитата:
Originally posted by dinasok51
CListCtrl, FlexGrid, HFlexgrid, DataGrid - Это уже 2 раза обсуждали.


Вот еще хороший Grid:
http://www.codeproject.com/miscctrl/gridctrl.asp

Реклама на сайте | Обмен ссылками | Ссылки | Экспорт (RSS) | Контакты
Добавить статью | Добавить исходник | Добавить хостинг-провайдера | Добавить сайт в каталог