Пожалуйста, помогите: Устаревшее программирование баз данных в Visual C ++ с ADODB - PullRequest
1 голос
/ 17 мая 2011

Я поддерживаю унаследованную кодовую базу и мне нужно написать небольшое консольное приложение на Visual C ++ 6, которое обращается к базе данных SQL Server через ADODB. Я опытный разработчик C / C ++, но я не проводил много времени с MS C ++, который, насколько я могу судить, совершенно отличается от g ++ и полон нестандартных языковых расширений.

Всякий раз, когда я пытаюсь следовать учебному пособию в Интернете, я получаю миллионы ошибок. Он не распознает целую кучу идентификаторов (например, CComPtr, HRESULT, _RecordsetPtr и т. Д.), И я почти уверен, что проблема в том, что я каким-то образом неправильно настроил свой проект. Я попробовал в основном все консольные приложения AppWizard, и ни один из них не помог мне найти демонстрационный код.

Может кто-нибудь объяснить мне, как я настраиваю приложение Visual C ++ 6, которое может, например, делать подсчет (*) из таблицы БД? Я думаю, что моя проблема как-то связана с неправильным включением различных ATL или любых других библиотек, от которых зависит ADODB ... Я понял, как #import msado15.dll, но все еще не играю в кости.

Пожалуйста, помогите !!! Заранее спасибо,

Jason

ОБНОВЛЕНИЕ: теперь получил его для компиляции, но при попытке открыть соединение ADO я получаю «Ошибка отладки». Это происходит из строки 474 atlbase.h и утверждение "p! = 0".

ОБНОВЛЕНИЕ 2: Вот мой код

#import "C:\Program Files\Common Files\System\ADO\msdo15.tlb" no_namespace rename("EOF","A_EOF") #include "stdafx.h"

#include <objbase.h>

#include <initguid.h>

#include <comdef.h>

#include <atlbase.h>

#include <adoid.h>

#include <adoint.h> int main (int argc, char * argv []) {

HRESULT hr;

CComPtr<ADORecordset> m_pSet;
CComPtr<ADOConnection> m_pConn;

char ret[128];

CComBSTR connstr = (CComBSTR) "driver=SQL Server;server=SQL1;uid=ffffddddd;pwd=aaaasss;database=MyDB";

CoCreateInstance(CLSID_CADOConnection, NULL, CLSCTX_INPROC_SERVER, IID_IADOConnection, (LPVOID *) &m_pConn);
CoCreateInstance(CLSID_CADORecordset, NULL, CLSCTX_INPROC_SERVER, IID_IADORecordset, (LPVOID *) &m_pSet);

printf("Here %d!\n", (int) &m_pConn);

m_pConn->Open(connstr, (CComBSTR) "", (CComBSTR) "", adOpenUnspecified);
//m_pConn->ConnectionString = connstr;
//m_pConn->Open("","","",NULL);

printf("Here!\n");
m_pSet->Open(CComVariant((CComBSTR) "SELECT COUNT(*) AS Cnt FROM VARIANCESWAP_INDIC"), CComVariant(m_pConn), adOpenKeyset, adLockOptimistic, adCmdText);

CComPtr<ADOFields> pFields = NULL;
m_pSet->get_Fields(&pFields);
CComPtr<ADOField> cnt = NULL;
pFields->get_Item(CComVariant(0), &cnt);
CComVariant dbValue;
cnt->get_Value(&dbValue);
sprintf(ret, "%S", dbValue.bstrVal);

if(m_pSet != NULL) m_pSet->Close();
if(m_pConn != NULL) m_pConn->Close();

printf("Hello World!\n");

return 0;

}

Ответы [ 3 ]

0 голосов
/ 17 мая 2011

Убедитесь, что вы проверяете возвращаемые значения HRESULT из вызовов функций, в частности, вызовов CoCreateInstance здесь.Я подозреваю, что они терпят неудачу, потому что похоже, что вы не позвонили CoInitialize, но проверьте, какой код ошибки вы получаете.

0 голосов
/ 18 мая 2011

Вы не инициализировали COM.

Кроме того, вы не проверяете возвращаемые значения COM-вызовов , таких как CoCreateInstance или Open. Вы должны проверить результат каждого COM-вызова.

Рекомендуемое чтение

0 голосов
/ 17 мая 2011

Если вы не получаете определение для HRESULT, то, вероятно, вы не включили.

Google - твой друг.Ищите пропущенные типы, и, как правило, какая-то добрая душа или MSDN подскажет, какой файл нужно включить в программу, чтобы она заработала.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...