К списку форумов К списку вопросов
Как данные из ACESS перенести в свой формат используя C++?
Pavelius
28.09.2004 - 21:29
У меня есть аксесовский файл - в нем база. Мне надо эту базу затащить в мой проект, под своим форматом. Есть ли способ сделать это под Си, без использования MFC ?
Голос
1 - 29.09.2004 - 09:17
Ага, конечно можно! На чистом АПИ. Тока тебе придется написать библиотечку не меньше чем MFC =)
Pavelius
2 - 29.09.2004 - 09:25
Вообщето затащить я могу данные и из промежуточного файла. Я слышал где-то в инете валяются программы, которые могут конвертировать из ACESS в любой другой формат. Если кто с этим сталкивался - ответьте, плиз.
Cool Ace
3 - 29.09.2004 - 09:41
Преобразуй в XML, и потом его используй.
Голос
4 - 29.09.2004 - 10:00
#2 - а ты что, думаешь те программы не юзают MFC?? :)
Голос
5 - 29.09.2004 - 10:03
Хочу еще раз отметить, что автор собирается это все делать на _СИ_ без _MFC_
:)))
archimag
6 - 29.09.2004 - 10:03
Pavelius, не понял в чём проблема... Ты хочешь получить доступ к данным без MFC (это то легко) или что? что-то я туплю...
archimag
7 - 29.09.2004 - 10:04
Голос, а что тебя смущает?
Pavelius
8 - 29.09.2004 - 10:54
Архимаг: да, получить доступ без MFC. Как это лучше сделать?
Голос: #4 Я имел ввиду готовые приложения, которые на уровне интерфейса позволяют как-то перегонять из mdbf -> любой формат. Я где-то видел их в инете, но они были платные или нерабочие демо-версии.
archimag
9 - 29.09.2004 - 11:00
[8]Ну так, ADO или ODBC - поддержка MFC не нужна, если нужно просто прочитать данные, то вообще элементарно и требуется совсем немного кода...
archimag
10 - 29.09.2004 - 11:04
Вот самый элементарный пример использования ADO:
   
#inсludе <sstream>
#inсludе <comdef.h>
#inсludе <adoid.h>
#inсludе <adoint.h>
typedef _com_ptr_t< _com_IIID<ADOConnection, &IID_IADOConnection > > ADOConnectionPtr;
typedef _com_ptr_t< _com_IIID<ADORecordset, &IID_IADORecordset > > ADORecordsetPtr;
typedef _com_ptr_t< _com_IIID<ADOFields, &__uuidof(ADOFields) > > ADOFieldsPtr;
typedef _com_ptr_t< _com_IIID<ADOField, &__uuidof(ADOField) > > ADOFieldPtr;
int WINAPI WinMain(HINSTANCE, HINSTANCE, LPSTR, int)
{
        _bstr_t init = "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=E:\\sampdata2.mdb;";
        _bstr_t query = "select EmployeeId, LastName, FirstName from Employees";
        CoInitialize(NULL);
        try
        {
                ADOConnectionPtr connect(CLSID_CADOConnection);
                connect->Open(init, _bstr_t("Admin"), _bstr_t(), adOpenUnspecified);
                _variant_t vNull;
                vNull.vt = VT_ERROR;
                vNull.scode = DISP_E_PARAMNOTFOUND;
        
                ADORecordsetPtr recordset(CLSID_CADORecordset);
                recordset->putref_ActiveConnection(connect);
                recordset->Open(_variant_t(query), vNull, adOpenStatic, adLockReadOnly, adCmdText);
                recordset->MoveFirst();
        
                ADOFieldsPtr fields;
                recordset->get_Fields(&fields);
        
                ADOFieldPtr fieldset[3];
                for( long field = 0; field < 3; field++ )
                        fields->get_Item(_variant_t(field), &fieldset[field] );
        
                std::basic_ostringstream< wchar_t, std::char_traits<wchar_t> > out;
        
                for( short eof = 0; recordset->get_EOF(&eof),!eof; recordset->MoveNext() ) {
                        _variant_t vals[3];
        
                        for( field = 0; field < 3; field++ ) fieldset[field]->get_Value(vals + field);
        
                        out << vals[0].lVal << L" " << vals[1].bstrVal << L" "
                                << vals[2].bstrVal << std::endl;
                }
        
                MessageBoxW(NULL, out.str().c_str(), L"Employees", MB_OK);
        }
        catch(_com_error&) {
                MessageBoxW(NULL, L"failed", NULL, MB_OK);
        }
        
        CoUninitialize();
            
        return 0;
}
archimag
11 - 29.09.2004 - 11:09
В этом примере читается таблица и выводиться на экран. Если хочешь, могу аналогичный пример с использованием ODBC привести, код, пожалуй, чуть поменьше будет
Pavelius
12 - 29.09.2004 - 18:22
Архимаг: Хочу. И еще, где можно почерпнуть информацию об ADO и ODBC и если уж на то пошло, что следует учить (если практически полный ноль в этом и хочешь выучить что-то переспективное и востребованое) из этих двух вещей?
Pavelius
13 - 29.09.2004 - 18:47
Если надо - вот мои координаты.
archimag
14 - 29.09.2004 - 22:25
[13]Насчёт того где можно посмотреть, то я в основном смотрю MSDN и поставляемые вместе с ней примеры (кстати, довольно полные). По сети разбросана куча всякой инфы - выбери свой любимый поисковик и вперёд... С помощью ADO полезный код начнёшь писать в конце первого дня знакомства.. ODBC - эта технология постепенно уходит, причём, по инициативе мягкотелых, так что можешь не забивать голову, но пример всё же приведу, только завтра :-)
CPU
15 - 30.09.2004 - 02:22
Ну, я как-то игрался с MASM+ODBC. Читал/редактировал строки через чистый API. В принципе, не так сложно. А на С++ вообще песня - в MSDN есть примеры работы с базами через ODBC на С++.
В чем проблема-то?
archimag
16 - 30.09.2004 - 09:52
Чтение таблицы с помощью ODBC выглядит примерно так:
   
SQLHENV environment;
::SQLAllocHandle(SQL_HANDLE_ENV, NULL, &environment);
::SQLSetEnvAttr(environment, SQL_ATTR_ODBC_VERSION, (void*) SQL_OV_ODBC3, SQL_IS_INTEGER);
       
SQLHDBC connection;
::SQLAllocHandle(SQL_HANDLE_DBC, environment, &connection);
::SQLConnect(connection, (SQLTCHAR*)"textbox", SQL_NTS, (SQLTCHAR*)"Admin", 5, (SQLTCHAR*)"", 0);
    
SQLHSTMT statement;
::SQLAllocHandle(SQL_HANDLE_STMT, connection, &statement);
     
char *SQL = "SELECT Id, FirstName, LastName FROM Employes";
SQLExecDirect(statement_ptr->hstmt, (SQLTCHAR*)SQL, strlen(statement) );
    
int id;
char first_name[50];
char last_name[50];
  
SQLBindCol(statement, 1, SQL_C_LONG, &id, 4, NULL);
SQLBindCol(statement, 6, SQL_C_CHAR, &first_name, 50, NULL);
SQLBindCol(statement, 6, SQL_C_CHAR, &last_name, 50, NULL);
   
while(SQLFetch(statement_ptr->hstmt) != SQL_NO_DATA )
     std::cout << id << "\t" << first_name << " " << last_name << std::endl;
   
Этот пример не компилировал (лень) - если что... И проверку ошибок пропустил :-)
Pavelius
17 - 30.09.2004 - 14:24
Вери биг сенкс.
archimag
18 - 30.09.2004 - 14:42
Вот блин, в последнем примере немного напутал (копировать/вставить)... Там где стоит statement_ptr->hstmt поставь statement, а вместо strlen(statement) - strlen(SQL) :-))

К списку вопросов на форуме Программирование

>>