Eigenschafte einer Access Datenbank auslesen
-
Hallo Leute,
kann mir jemand sagen, wie man die Eigenschaften einer Datenbak (Access) mittels ADO ausliest ?
Ich bräcuhte z.b. Name der Tabellen , Namen der Spalten und deren eigenschaften (TEXT(255)) usw...
Gruß und Danke
andy_mann
-
also zum teil stehen diese daten in einer systemtabelle, die sich MSysObjects nennt. kannst du aktivieren über Extras->Optionen->ausgeblendete und systemtabellen anzeigen
-
Oh vielen Dank,
du meinst also, eine SELECT anweisung auf diese Tabelle erhalte ich die Namen der Tabellen und deren Spalten.
Wie komme ich jetzt allerdings an die Spalteneigenschaften TEXT, INT oder sonstiges ????
Gruß
andy_mann
-
mit welchem programm greifst du denn auf die datenbank zu? wenn du die namen der tabellen hast, kannst du ja im prinzip jede tabelle abfragen, welche spalten und welchen typ die haben
-
HAllo,
ich greiffe mittels c++ und ADO mit meinem eigen erstellten tool drauf.
Und in meinem tool benötige ich die eigenschaften der Tabelle....
Gruß
andy_mann
-
hast du dann auch mfc-klassen?
-
jip jip,
nur dort gibt es keine methoden über ADO die Eigenschaften der Tabellen auszulesen....
Gruß
andy_mann
-
es gibt eine mfc-klasse ccolumn, mit der man diese eigenschaften abfragen kann. vielleicht klappt das auch bei ado.
-
oh, vielen Dank,
da ich aber nicht weis wo ich ansetzen muß, kann ich dieses jetzt garnicht testen.
Bislang habe ich nur select, delete usw anweisungen gemact und habe meine classen selber geschrieben.
Hast Du eventuell ein Beispiel ?
Gruß
andy_mann
-
void DBSet::GetDBColumns() { m_act_db.OpenEx(_T("ODBC;DSN=EcoTool"), 0); //übergibt Zeiger auf CColumns-Objekt und bindet Datenbank an CColumns* m_DB_Columns = new CColumns(&m_act_db); m_DB_Columns->m_strTableNameParam = Tabellenname; m_DB_Columns->Open(CRecordset::dynaset); m_DB_Columns->MoveFirst(); //überträgt Spaltennamen in CArray-Objekt while (!m_DB_Columns->IsEOF()) { m_actColumns.Add(m_DB_Columns->m_strColumnName); m_typColumns.Add(m_DB_Columns->m_strTypeName); m_DB_Columns->MoveNext(); } }
also, das ist eine funktion, die in einer datenbank (hier allerdings über odbc) aus einer tabelle (parameter m_strTableNameParam) die spalten (m_strColumnName) und den Typ (m_strTypeName) in verschiedene CArrays einlesen. du brauchst dafür die beiden dateien ccolumnst.h und .cpp, musst du mal nach googlen, die hab ich im moment auch nicht hier. gibt auch in der msdn ganz gute dokus (stichwort: dynamisches binden von datenbankspalten)
-
ich Danke Dir,
werde ich mir mal reinziehen...
Gruß
andy_mann
-
Hallo,
Mit der ODBC bin ich nicht ganz zurecht gekommen da ich alles mit ADO mache und es anders aufgebaut habe.
Habe jetz aber weiter gesuch und folgenden source gefunden:
#include "stdafx.h" // BeginProcedureParametersCpp // ADO COM Komponente einbinden (-> steckt in der DLL msado15.dll) #import "C:\Programme\Gemeinsame Dateien\System\ado\msado15.dll" rename("EOF","ADOEOF") // #import "msado15.dll" #import "C:\Programme\Gemeinsame Dateien\System\ado\msadox.dll" no_namespace // #include "iostream.h" #include "stdio.h" #include "conio.h" using namespace std; //Function declarations inline void TESTHR(HRESULT x) {if FAILED(x) _com_issue_error(x);}; void ProcedureParametersX(void); ////////////////////////////////////////////////////////// // // // Main Function // // // ////////////////////////////////////////////////////////// void main() { if(FAILED(::CoInitialize(NULL))) return; ProcedureParametersX(); ::CoUninitialize(); } ////////////////////////////////////////////////////////// // // // ProcedureParametersX Function // // // ////////////////////////////////////////////////////////// void ProcedureParametersX() { HRESULT hr = S_OK; // Define ADOX object pointers. // Initialize pointers on define. // These are in the ADOX:: namespace. _CatalogPtr m_pCatalog = NULL; //Define ADODB object pointers. ADODB::_ConnectionPtr m_pCnn = NULL; ADODB::_CommandPtr m_pCommand = NULL; ADODB::_ParameterPtr m_pParameter = NULL; try { TESTHR(hr = m_pCnn.CreateInstance(__uuidof(ADODB::Connection))); //Open the Connection m_pCnn->Open("Provider='Microsoft.JET.OLEDB.4.0';" "Data Source='c:\\Nordwind.mdb';","","",NULL); TESTHR(hr = m_pCatalog.CreateInstance(__uuidof(Catalog))); //Open the catalog m_pCatalog->PutActiveConnection(_variant_t((IDispatch *)m_pCnn)); //Get the command object m_pCommand = m_pCatalog->Procedures->GetItem("Benutzer")->GetCommand(); _variant_t vIndex; //Retrieve Parameter information m_pCommand->Parameters->Refresh(); for (long lIndex = 0; lIndex < m_pCommand->Parameters->Count; lIndex ++) { vIndex = lIndex; m_pParameter = m_pCommand->Parameters->GetItem(vIndex); cout << m_pParameter->Name << ":" << m_pParameter->Type << "\n" << endl; } } catch(_com_error &e) { // Notify the user of errors if any. _bstr_t bstrSource(e.Source()); _bstr_t bstrDescription(e.Description()); printf("\n\tSource : %s \n\tdescription : %s \n ", (LPCSTR)bstrSource,(LPCSTR)bstrDescription); } catch(...) { cout << "Error occured in ProcedureParametersX...."<< endl; } } // EndProcedureParametersCpp
Er Kompeliert es und macht die verbindung zur Datenbank.
Aber bei:
m_pCommand = m_pCatalog->Procedures->GetItem("Benutzer")->GetCommand();
bricht er ab und sagt das er das Objekt nicht finden kann.
Die Tabelle existiert aber.Hat dazu jemand eine idee ??
Gruß und Danke
andy_mann