![]() |
![]() |
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) :-)) |