brauche hilfe mit ADO und WinApi ohne MFC
-
Hm.
Es gibt 2 Möglichkeiten, wobei ich hier keine als besser darstellen möchte -- beide haben diverse Vor- und Nachteile.-
Du verwendest einfach SQL zum Daten einfügen/ändern/löschen, also einfach "INSERT"/"UPDATE"/"DELETE". SQL Statements führst du einfach mit Connection::Execute aus, oder mit Recordset::Open -- je nachdem ob du Daten zurückbekommst oder nicht, bzw. was für weitere Parameter du mitgeben musst ("LockType" z.B. kannst du bei Connection::Execute nicht mitgeben). Und, hätte ich fast vergessen, du kannst ein Command Objekt verwenden - da kann man dann noch nett Parameter dranbinden etc.
Tables/View/... erzeugen geht auch direkt über SQL, dazu musst du natürlich die entsprechenden DLL statements ("CREATE TABLE", "CREATE VIEW", ...) verwenden.
Ein klarer Nachteil hier ist dass du den SQL Dialekt der zu Grunde liegenden Datenbank verwenden musst, wenn du dann mal eine andere Datenbank verwendest musst du u.U. einiges umschreiben. Wenn du allerdings bloss einfaches Standard-SQL verwendest kannst du den Aufwand hier minimieren bzw. u.U. für die wichtigsten Datenbanken sogar komplett eliminieren. -
Du verwendest die ADO Funktionen AddNew/Update/Delete. Wie man DDL (also Tables etc. erstellen/ändern/löschen) über ADO direkt macht weiss ich nicht, habe ich nie gemacht. Nachteil hierbei ist u.a. dass einfache Batch Operationen ("UPDATE bar SET foo = 0 WHERE baz = 123") nicht performant laufen, kann u.U. einiges an Unterschied ausmachen.
-
-
also ich befor ich die frage gestellt habe gegoogled und hab volgenden aufruf gefunden.
[code] void Database::AddItemToTable(const _bstr_t &table_name, const _bstr_t &field, const _bstr_t &item, const _bstr_t &primaryKey, const _bstr_t &newKey) { CoInitialize(NULL); _ConnectionPtr p("ADODB.Connection"); pConnectWrite = p ; // Open Connection pConnectWrite->Open(connectionString, "", "", adConnectUnspecified); tableName = table_name; key = newKey; commandString = "INSERT INTO " + tableName + " (" + field + ", " + primaryKey + ") VALUES (" + item + "," + key + ");"; try { pConnectWrite->Execute(commandString, NULL, adCmdText); } catch( _com_error e) { throw DataException((char*)e.ErrorMessage()); } pConnectWrite->Close(); } [/code]nur fuegt er keinen eintrag in die Datenbank

achja die frage zu c# is die das ich nur buecher ueber ADO in c# programmierung gefunden habe
-
Naja, was bekommst du denn für eine Fehlermeldung?
Und wie sieht die Tabelle aus mit der du das Versuchst? Und die Parameter die du an die Funktion mitgibst?
Grundsätzlich sieht der Code nämlich nicht falsch aus.Auf jeden Fall solltest du wenn du mit ADO arbeitest etwas SQL lernen, dann kannst du solche einfachen Inserts ganz einfach selbst schreiben...
-
mhm Die Fehlermeldeung er bringt eigentlich nur symbole und wenn ich sie in einen int wert umwandle bringt er eine zahl 1483280
das ist der wert den ich einfuegen wollte
data.AddItemToTable("Data","Password,Age,EmailAddress","'lime','29','Troy@hotmail.com'","User", "'spike'");
Achja die Tabelle:
Die Tabelle heist: Data
Feld 1 : User
Feld 2 : Passwort
Feld 3 : Age
Feld 4 : EmailAddressin der tabelle ist kein wert eingefuegt wurden
-
Hm, weiss nicht, sieht nicht falsch aus (abgesehen davon dass der Code etwas schrecklich ist, aber funktionieren müsste es eigentlich denke ich).
Du solltest aber auf jeden Fall den _com_error by Reference fangen, und den cast auf char* wegmachen. Du bekommst von _com_error::ErrorMessage entweder ein const char* oder ein const wchar_t* zurück -- damit sollte die DataException eigentlich glücklich sein.
Ansonsten, du bekommst mit _com_error::Description oft eine gute Beschreibung was nicht gepasst hat. Je nach Provider halt, SQL Server z.B. liefert da sehr hilfreiche Sachen.
Sonst probier doch einfach den Code Schritt für Schritt im Debugger durchzusteppen, und guck dir z.B. "commandString" an bevor das weggeschickt wird.
-
mhm hast recht probier mal alles durch? :xmas1:
-
Wenn Du schon low-Level arbeitest würde ich Dir OLEDB statt ADO empfehlen.
-
Verstehe nich ganz

-
Verstehe nich ganz

-
ADO ist eine ActiveX COntrol das auf OLEDB basiert. Du willst Win32 pur haben ohne MFC, dann kannst Du auch im Datenbank Zugriff einen Level tiefer gehen auf OLEDB.
Ich würde Dir in jedem Falle raten zumindest ATL zu verwenden, sonst wird der Umgang sowohl mit ADO als auch mit OLEDB zum K(r)ampf.
-
Du Scheinst dich da auszukennen winapi pur scheint mir momentan noch leicht hab mal mit MFC Herumexperimentiert aber hab total abgeloost, mit datenbank programmierung hab ich erst angefangen habs erst mit ner txt Db versucht doch mit der zeit brauchte ich doch ne etwas bessere version access schien mir da richtig da ich mfc nich besonders gut kann hab nur mal im internet nur ADO oder ODBC Beschreibung gefunden hast zum Tehma OLEDB nen guten tip bsp.: Buch
THX :xmas1:
ATL? Bin Beginner - Hab den begriff schon mehrmals gehoert aber weis nicht was es so recht ist,wie mann schon sagt programmieren lernt mann nicht im handumdrehen und ich versuch mein glueck darin, das erklaert vieleicht meinen schlechten ?oder Schrecklichen code, aussagen im internet zu folge braucht mann ohne vorkenntnisse mehr als 40 wochen die ich bei weiten ueberschritten hab , hab aber auch nicht immer zeit
thx
-
habe mir mal mühsehlich eine Funktion zusammengestellt, wo ich mein Prog mit einem SQL-Server verbinden kann. Sollte je nach DNS auch mit anderen DB's funktionieren.
Wobei sich mit der Datenbank zu verbinden ist noch das kleinste Übel dabei. Schwierig wird es, wenn es um Daten geht. Wenn du hier noch einen Bsp. brauchst - einfach melden.
Gruß, Winnie
PS: Für den Code übernehme ich natürlich keine Haftung :), da ich mir es selber "zusammengezimmert" habe (abgeschaut beim Logging vom ODBC und nur die wichtigsten genommen).
bool MyODBC::Connect(SQLCHAR * scDNS) { short iStrLen2; char sOutCnnString[1000]; SQLRETURN hr; // // Treiber // hr = SQLAllocHandle(SQL_HANDLE_ENV, SQL_NULL_HANDLE, &hEnv); if (SqlSuccess(hr) != true) { MessageBox(mParentApp , "ODBC-Treiber - Fehler!", "ODBC" , MB_OK | MB_ICONERROR ); return false; } // // ODBC-Version // hr = SQLSetEnvAttr(hEnv, SQL_ATTR_ODBC_VERSION, (void *)SQL_OV_ODBC3, 0); if (SqlSuccess(hr) != true) { MessageBox(mParentApp , "ODBC-Version - Fehler!", "ODBC" , MB_OK | MB_ICONERROR ); Disconnect(); return false; } // // Connection // hr = SQLAllocHandle(SQL_HANDLE_DBC, hEnv, &hDbc); if (SqlSuccess(hr) != true) { MessageBox(mParentApp , "ODBC-Connection - Fehler!", "ODBC" , MB_OK | MB_ICONERROR ); Disconnect(); return false; } // // Verbindung zur Datenbank // hr = SQLDriverConnect( hDbc, NULL, scDNS, SQL_NTS , (SQLCHAR *)sOutCnnString, 100 , &iStrLen2, SQL_DRIVER_COMPLETE ); if (SqlSuccess(hr) != true) { MessageBox(mParentApp , "Verbindung fehlgeschlagen!", "SQL-Server" , MB_OK | MB_ICONERROR ); Disconnect(); return false; } return true; } void MyOdbc::Disconnect() { if (hDbc != NULL) { SQLDisconnect(hDbc); SQLFreeHandle(SQL_HANDLE_DBC, hDbc); } if (hEnv != NULL) SQLFreeHandle(SQL_HANDLE_ENV, hEnv); }
-
Ascharan schrieb:
da ich mfc nich besonders gut kann hab nur mal im internet nur ADO oder ODBC Beschreibung gefunden hast zum Tehma OLEDB nen guten tip bsp.: Buch
Ich kenne nicht ein gutes Buch bzgl. DB-Zugriff und C++. Alle haben irgend einen Hau!
OLEDB and ODBC von Wood steht bei mir im Schrank.
Database prohgramming with VC6 in 21 Days von Robinson, steht auch hier rum. Aber gut? Na ja!Ascharan schrieb:
ATL? Bin Beginner - Hab den begriff schon mehrmals gehoert aber weis nicht was es so recht ist,wie mann schon sagt programmieren lernt mann nicht im handumdrehen und ich versuch mein glueck darin, das erklaert vieleicht meinen schlechten ?oder Schrecklichen code, aussagen im internet zu folge braucht mann ohne vorkenntnisse mehr als 40 wochen die ich bei weiten ueberschritten hab , hab aber auch nicht immer zeit
thxAls Beginner Dich auf templates wie ATL loszulassen ist natürlich heftig. Aber dennoch. Die Wizards machen viel.
Wenn man weiß wie es geht, ist es simpel und effektiv
:xmas1:
-
habe im msdn mal nach atl geschaut das hats in sich ,hey Winnie01 gutes angebot komme gern darauf zurueck werd heut mal alles durchdenken meld mich spaeter nochmal
-
@ Martin Richter
Kann das sein das bei der parameter uebergabe fehler sind zum einfuegen hat das bsp. den code gehabtData.AddItemToTable("Data","Password,Age,EmailAddress","'lime','29','Troy@hotmail.com'","User", "'spike'");