компонент для доступа к данным
Скажите, кто-нибудь создавал подобный компонент? В Visual Studio. Назначение - выборка данных с SQL-сервера, из текстового файла.
Набросал примерно такой класс:
{
public:
CIstochnikDannih();
~CIstochnikDannih();
double* ZagruzitDannie(char*); //çàãðóçèü äàííûå èç ôàéëà
double PoluchitElement(int);
int PoluchitRazmer(void);
double* PoluchitDannie(void);
private:
double *data;
int n;
};
Метод ZagruzitDannie служит для загрузки данных из текстового файла (имя его задается при вызове метода). Данные - одномерный массив - записываются в массив *data. В n - помещается размер массива. В деструкторе массив освобождается.
{
assert(data!=NULL);
return data;
}
В общем простой класс, есть идеи как его усовершенстовать? И как использовать для выборки данных с SQL-сервера?
IMHO лучше всего использовать ADO.
(ADO.NET поддерживает С# и VB, но не С++ )
Там уже есть то, что ты хочешь сам написать.
В MSDN хорошее описание с примерами.
Для доступа к БД вообще и к SQL-серверу в часности
IMHO лучше всего использовать ADO.
(ADO.NET поддерживает С# и VB, но не С++ )
Там уже есть то, что ты хочешь сам написать.
В MSDN хорошее описание с примерами.
В MSDN описана поддержка подключения через классы библиотеки MFC - DAO, ODBC.
Цитата:
?
Это С++.
Смотрим раздел 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?
ODBC - универсальный, но довольно сложный в использовании интерфейс к БД
DAO - доступ к Access
ADO - универсальный интерфейс к БД, на основе СОМ
Для разработки и исполнения! необходимо установить MDAC
IMHO нет.
На уровне С++ ADO и ADO.NET не совместимы
Файл с данными может иметь такой формат
2 3
a b c
11 12 13
21 22 23
Т.е. указывается число строк, столбцов в матрице, затем идут заголовки столбцов, затем сами данные.
Есть идеи, как это можно сделать на Си++ и что лучше для этого использовать - .NET компоненты или компоненты на основе MFC?
Т.е. нужно выбрать виз. компонент, в который будут записываться и отображаться данные пользователю и создать класс для доступа к данным - чтение / запись числовых данных из/в файл, получить/установить кол-во строк/столбцов.
Может кто-то работал с подобными задачами? Интересует подобный класс для доступа к данным.
Короче, где хранятся данные и много ли их?
Не понятно, хочешь ли ты создавать свой файл своего уникального формата или использовать напр. MDB-файл?
Короче, где хранятся данные и много ли их?
Уникальный простой формат. В файлах этого формата, данных - до 1000000 вещ. чисел
Уникальный простой формат. В файлах этого формата, данных - до 1000000 вещ. чисел
1. Для уникального хотя и простого формата нужен свой опять же уникальный и не всегда простой инструмент доступа к данным, навигации и заполнения визуального элемента( CListCtrl, FlexGrid и тд ). Для относительно больших наборов ( > 100000 ) данных все это работает медленно.
Если данные могут меняться, а не только отображаться, то редактирование файла "уникального простого формата" занятие ИМНО неблагодарное.
2. Если и использовать напр. MDB то проблема решается очень просто:
На форму устанавливаешь DataGrid и AdoDc, настраиваешь и привязываешь их к твоему MDB и все! Получаешь весь набор, не написав ни одной строчки кода! Работает это очень быстро
Это на С++, при этом неважно VS или .NET
Если нужна какая-либо обработка, то ИМХО лучше всего использовать ADO. см выше.
3. Все это же можно сделать и на С#, но для больших наборов визуализация данных работает ооооочень медленно. Microsoft что-то недоделала
1. Для уникального хотя и простого формата нужен свой опять же уникальный и не всегда простой инструмент доступа к данным, навигации и заполнения визуального элемента( CListCtrl, FlexGrid и тд ). Для относительно больших наборов ( > 100000 ) данных все это работает медленно.
Если данные могут меняться, а не только отображаться, то редактирование файла "уникального простого формата" занятие ИМНО неблагодарное.
2. Если и использовать напр. MDB то проблема решается очень просто:
На форму устанавливаешь DataGrid и AdoDc, настраиваешь и привязываешь их к твоему MDB и все! Получаешь весь набор, не написав ни одной строчки кода! Работает это очень быстро
Это на С++, при этом неважно VS или .NET
Если нужна какая-либо обработка, то ИМХО лучше всего использовать ADO. см выше.
3. Все это же можно сделать и на С#, но для больших наборов визуализация данных работает ооооочень медленно. Microsoft что-то недоделала
я сделал две процедуры, одна читает данные из файла в обычный массив типа double, другая - записывает из массива в файл. Да, для больших объемов действительно важна скорость чтения/записи. Частично ее решил:
- для чтения, вызвав функцию MapViewOfFile (), далее работаю с файлом как со строкой, читаю целые, вещ. числа.
- для записи - используя буфер строк, когда в файл записывается сразу несколько строк, а не одна.
(есть у кого-то есть еще идеи, как ускорить чтение/запись?)
Насчет компонента отображения - здесь есть соседняя тема, где рассматривается подобный компонент, можно поэкспериментировать. Но мне интересно, если данные считаны и записаны в одномерный массив, насколько долго они будут записываться в визуальный компонент? По идее, самая долгая операция - это чтение/запись данных из/в файл (вместе с преобразованием "число-строка" и наоборот). Поэтому вывод считанных данных в грид не должен занять много времени, хотя нужно смотреть...
Насчет баз данных - думал над этим, но
1) во-первых, для редактирования, добавления данных придется использовать СУБД или его компоненты (здесь же можно использовать простой формат и простой текстовый редактор)
2) не знаю, как считать из базы данных числа в массив вещ.чисел на уровне Си/Си++
3) идея с простым текстовым файлом реализована в программе matrixer (nsu.ru/ef/tsy) и там это работает очень быстро.
я сделал две процедуры, одна читает данные из файла в обычный массив типа double, другая - записывает из массива в файл. Да, для больших объемов действительно важна скорость чтения/записи. Частично ее решил:
- для чтения, вызвав функцию MapViewOfFile (), далее работаю с файлом как со строкой, читаю целые, вещ. числа.
- для записи - используя буфер строк, когда в файл записывается сразу несколько строк, а не одна.
(есть у кого-то есть еще идеи, как ускорить чтение/запись?)
Как я понимаю, тебе нужен инструмент для хранения, отображения и редактирования больших объемов информации. ИМХО обычные файлы для этого наименее пригодны, тк плохо приспособлены для произвольного доступа. Можно конечно создать нечто свое уникальное, но в конце концов все опять сведется к подобию БД. Можно пытаться оптимизировать это нечто, используя кэширование и т.п. Но по моим представлениям это не решение прооблемы.
Насчет компонента отображения - здесь есть соседняя тема, где рассматривается подобный компонент, можно поэкспериментировать. Но мне интересно, если данные считаны и записаны в одномерный массив, насколько долго они будут записываться в визуальный компонент? По идее, самая долгая операция - это чтение/запись данных из/в файл (вместе с преобразованием "число-строка" и наоборот). Поэтому вывод считанных данных в грид не должен занять много времени, хотя нужно смотреть...
DataGrid вместе AdoDB делают все это и делает очень быстро и хорошо и очень гибки в настройке
Насчет баз данных - думал над этим, но
1) во-первых, для редактирования, добавления данных придется использовать СУБД или его компоненты (здесь же можно использовать простой формат и простой текстовый редактор)
2) не знаю, как считать из базы данных числа в массив вещ.чисел на уровне Си/Си++
3) идея с простым текстовым файлом реализована в программе matrixer (nsu.ru/ef/tsy) и там это работает очень быстро.
1) Я плохо представляю себе как можно приспособить "простой текстовый редактор" для редактирования БД
2) Для этого используется очень простой SQL-запрос нечто вроде SELECT "имя столбца" FROM "имя таблицы"
3) Не могу ничего сказать по поводу эффективности тк нет исходников, а выходные данные очень малы по объему
Вопрос скорее заключен в другом - как на основе функций чтения/записи создать свой собственный класс, который позволил бы работать с данными на более высоком уровне абстракции. И как обеспечить взаимодействие этого класса с каким-нибудь визуальным компонентом "таблица".
Насчет БД - видимо проще будет просто экспортировать данные из таблиц по запросу в простой текстовый формат, который я описал:
1) не всегда знаешь каков запрос, и его создание и выполнение лучше целиком возложить на сервер
2) результаты запроса можно отфильтровать средствами сервера и затем передать в текстовый файл
Есть несколько БД, выборка и обработка данных которых может быть востребована, но я не могу сказать, что именно может понадобиться из этих баз. Поэтому создание запросов лучше отложить.
И использовать простой формат, в который можно в случае необходимости экспортировать данные (например, посредством буфера обмена)
Вопрос скорее заключен в другом - как на основе функций чтения/записи создать свой собственный класс, который позволил бы работать с данными на более высоком уровне абстракции. И как обеспечить взаимодействие этого класса с каким-нибудь визуальным компонентом "таблица".
Как вариант
{
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. Научить БД работать с буфером обмена и класть в него нужные данные в нужное время
Я не могу с тобой согласиться, что это проще чем в течение нескольких минут средствами визуального проектирования получить эквивалентный по фунциональности конечный результат.
А класс то как раз и нужен, чтобы читать/записывать данные из/в файл, т.е. это промежуточное звено между визуальным элементом и самими данными. Для простоты можно положить, что данные считываются один раз при показе виз. элемента, записываются при его закрытии (т.е. не как в клиент-сервере - понятно, что для этого проще использовать соотв. компоненты). При редактировании чисел меняется массив вещ. чисел, при добавлении - меняется размерность массива, а данные берутся из виз.элемента.
Вот это промежуточное звено представляю так:
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 млн. чисел?
Синтаксический котроль просто реализовать - если при чтении обнаружена ошибка - не открывать данные, при сохранении все должно записываться правильно.
...чтобы не привязываться к БД ...
ADO(.NET), ODBC, JDBC именно для того и разработаны, чтобы делать приложения независимыми от конкретных БД
Заполнение CListCtrl таким количеством эл-тов длится раздражающе долго( на 1ГГЦ - многие десятка сек). Можно организовать визуализацию мелкими порциями напр. по 100 строк, но тогда нужно достраивать навигацию по данным.
Речь шла о редактировании данных "простым текстовым редактором". Мой вопрос относился к нему: как ты предполагал проводить синтактический анализ в этом "простом текстовом редакторе"?
ADO(.NET), ODBC, JDBC именно для того и разработаны, чтобы делать приложения независимыми от конкретных БД
Заполнение CListCtrl таким количеством эл-тов длится раздражающе долго( на 1ГГЦ - многие десятка сек). Можно организовать визуализацию мелкими порциями напр. по 100 строк, но тогда нужно достраивать навигацию по данным.
Речь шла о редактировании данных "простым текстовым редактором". Мой вопрос относился к нему: как ты предполагал проводить синтактический анализ в этом "простом текстовом редакторе"?
Понятно, визуальный компонент на Си++ - такой как таблица еще стоит поискать или создавать самому, но на это нужно много времени (такого компонента нет). Ну да ладно. Хотя бы на программном уровне работать.
Все очень просто - при чтении данных, т.к. они записаны в виде
1.222
1.43
-1.4e+003
...
нужно их записать в строку а затем функцией типа strtod преобразовать в вещ. число.
Поэтому здесь и возникает синт. анализ - выделить подстроку, содержащую вещ. число. И получить само число.
Здесь выше я привел примерный вид класса для чтения данных, но теперь я вижу его недостаток - он хорошо работает при чтении данных из файла.
Но мне нужно обеспечить еще и запись в файл такого же формата. Т.е.
<наимен1столбца> <наимен2столбца> ...
число11 число12 число13...
число21 число22 число23...
..........................
Возможно для этого придется создавать класс, который работает на запись данных в файл, задаваемый пользователем. Только как получить в итоге один класс, работающий на вход и выход?
Понятно, визуальный компонент на Си++ - такой как таблица еще стоит поискать или создавать самому, но на это нужно много времени (такого компонента нет).
CListCtrl, FlexGrid, HFlexgrid, DataGrid-Это уже 2 раза обсуждали.
Возможно для этого придется создавать класс, который работает на запись данных в файл, задаваемый пользователем. Только как получить в итоге один класс, работающий на вход и выход?
Добавь в свой класс симметричные ф-ции вывода и будет также хорошо работать и при записи данных в файл.
CListCtrl, FlexGrid, HFlexgrid, DataGrid - Это уже 2 раза обсуждали.
Вот еще хороший Grid:
http://www.codeproject.com/miscctrl/gridctrl.asp