Zum Inhalt springen

Empfohlene Beiträge

Geschrieben

Ein Problem,

wenn ich mit VC Assistent eine SDI Anwendung mit OLE DB Verbindung erstelle funktioniert die DB Verbindung , sobald ich aber ganz normalen Dialog erstelle und da die OLE DB Verbindung alleine tippen will funktioniert es nicht obwohl es ist alles gleich


CDBPropSet dbinit(DBPROPSET_DBINIT);
dbinit.AddProperty(DBPROP_AUTH_PASSWORD, "password");
dbinit.AddProperty(DBPROP_AUTH_PERSIST_SENSITIVE_AUTHINFO, false);
dbinit.AddProperty(DBPROP_AUTH_USERID, "sa");
dbinit.AddProperty(DBPROP_INIT_CATALOG,"DB");
dbinit.AddProperty(DBPROP_INIT_DATASOURCE, "SERVERNAME");
dbinit.AddProperty(DBPROP_INIT_LCID, (long)1031);
dbinit.AddProperty(DBPROP_INIT_PROMPT, (short)4);

hr = db.OpenWithServiceComponents("SQLOLEDB.1", &dbinit);//hier kriege ich Probleme
if (FAILED(hr))
return hr;

hr = session.Open(db);
if (FAILED(hr))
return hr;
[/PHP]

Geschrieben

-2147221008 ist 0x800401F0, und das ist CO_E_NOTINITIALIZED.

OLEDB basiert auf COM, d.h. du musst in jedem Thread, der COM benutzt, vorher CoInitialize (bzw. CoInitializeEx) aufrufen.

Sehr hilfreich bei allen HRESULTs und Rückgabewerten von GetLastError ist das Error LookUp Tool des Visual Studio. Das sagt zu -2147221008: "CoInitialize wurde nicht aufgerufen" ;)

Geschrieben
Original geschrieben von Klotzkopp

-2147221008 ist 0x800401F0, und das ist CO_E_NOTINITIALIZED.

OLEDB basiert auf COM, d.h. du musst in jedem Thread, der COM benutzt, vorher CoInitialize (bzw. CoInitializeEx) aufrufen.

Sehr hilfreich bei allen HRESULTs und Rückgabewerten von GetLastError ist das Error LookUp Tool des Visual Studio. Das sagt zu -2147221008: "CoInitialize wurde nicht aufgerufen" ;)

erstmal Danke

aber wo finde ich Error LookUp in Visual Studio ???:confused:

Geschrieben

Des weitere mache ich so :


CDBPropSet propset(DBPROPSET_ROWSET);
propset.AddProperty(DBPROP_CANFETCHBACKWARDS, true);
propset.AddProperty(DBPROP_IRowsetScroll, true);
propset.AddProperty(DBPROP_IRowsetChange, true);
propset.AddProperty(DBPROP_UPDATABILITY, DBPROPVAL_UP_CHANGE | DBPROPVAL_UP_INSERT | DBPROPVAL_UP_DELETE );
// wenn ich die Daten nicht verändern will was muß hier stehen ??

hr = CCommand<CAccessor<CRezept> >::Open(session, "SELECT * FROM dbo.Tabell", &propset);//hier dauert es zimmlich lange

if (FAILED(hr))
return hr;

return MoveNext();
[/PHP]

Wie kann ich jetzt diesen CCommand von die Tabelle benutzen, zB. ich will alles in einem List anzeigen wo kriege ich den Recordset

:( :eek:

Geschrieben
Original geschrieben von 007ski

aber wo finde ich Error LookUp in Visual Studio ???:confused:

Ich habe hier leider nur die englische Version von VC++.NET, da ist es unter Tools->Error Lookup

hr = CCommand<CAccessor<CRezept> >::Open(session, "SELECT * FROM dbo.Tabell", &propset);//hier dauert es zimmlich lange

Mich wundert, dass der Compiler das überhaupt schluckt. AFAIK ist CCommand::Open nicht statisch. Ich mache das normalerweise so:


CCommand<MeinAccessor> cmd;
HRESULT hr = cmd.Open(...);
while(S_OK == cmd.MoveNext())
{
// hier sind dann über cmd die Member des Accessors zugänglich.
}
[/CODE]

Geschrieben
Original geschrieben von Klotzkopp

Mich wundert, dass der Compiler das überhaupt schluckt. AFAIK ist CCommand::Open nicht statisch. Ich mache das normalerweise so:



CCommand<MeinAccessor> cmd;

HRESULT hr = cmd.Open(...);

while(S_OK == cmd.MoveNext())

{

    // hier sind dann über cmd die Member des Accessors zugänglich.

}

moment also ich habe so

class CTabell

{

public:

    CTabell()

    {

          memset( (void*)this, 0, sizeof(*this) );

			};

// Die variablen von CTabell

BEGIN_COLUMN_MAP(CTabell)

//Die Spalten von CTabell

END_COLUMN_MAP()

};

class testSet : public CCommand<CAccessor<CTabell> >

{

public:


	HRESULT Open()

	{

                  // Hier öfne ich den CCommand

                  .......

                 CCommand<CTabell> cmd;//das stürt ihn ?!?

                hr = CCommand<CAccessor<CTabell> >::Open(session, "SELECT * FROM dbo.Tabell", &propset); // so geht es ?


                }

Geschrieben
Original geschrieben von 007ski

ach so ich benutze VC++ 6.0 vileich liegt es daran !?

Nein, hab gerade eben nochmal nachgesehn, da gibt es das auch, an der gleichen Stelle.

Was bei HRESULTs auch hilft:

Den Wert mit angehängtem ",hr" ins Watchfenster des Debuggers eingeben:

-2147221008,hr

Anzeige:

0x800401f0 CoInitialize wurde nicht aufgerufen.

Geschrieben
Original geschrieben von Klotzkopp

Nein, hab gerade eben nochmal nachgesehn, da gibt es das auch, an der gleichen Stelle.

Was bei HRESULTs auch hilft:

Den Wert mit angehängtem ",hr" ins Watchfenster des Debuggers eingeben:

-2147221008,hr

Anzeige:

0x800401f0 CoInitialize wurde nicht aufgerufen.

ok ich habe gefunden

es heist auf Deutsch

Fehlermeldung suchen :OD

Geschrieben
Original geschrieben von 007ski

moment also ich habe so



class CTabell

{

public:

    CTabell()

    {

          memset( (void*)this, 0, sizeof(*this) );

    };

// Die variablen von CTabell

BEGIN_COLUMN_MAP(CTabell)

//Die Spalten von CTabell

END_COLUMN_MAP()

};

class testSet : public CCommand<CAccessor<CTabell> >

{

public:


	HRESULT Open()

	{

                  // Hier öfne ich den CCommand

                  .......

                 CCommand<CTabell> cmd;//das stürt ihn ?!?

                hr = CCommand<CAccessor<CTabell> >::Open(session, "SELECT * FROM dbo.Tabell", &propset); // so geht es ?


                }

die CTabell ist doch in meinem Fall MeinAccessor , oder ??

Geschrieben
Original geschrieben von Klotzkopp

Mach daraus mal:



CCommand<CAccessor<CTabell> > cmd;

hr = cmd.Open(session, "SELECT * FROM dbo.Tabell", &propset);

habe gemacht in hr steht 0, allerdings wenn ich die Variablen von der Tabelle abfragen möchte steht immer 0 obwohl in DB stehen werte ?

Geschrieben
Original geschrieben von Klotzkopp

Hast du MoveNext aufgerufen?

So mache ich es:


OpenDB opendb;
opendb.SetDBParams(....);
opendb.OpenDataSource();
while(S_OK == opendb.cmd.MoveNext())
{
int k = opendb.m_ver;
}
[/PHP]

Es ist sehr mehrwürdig denn wenn ich so mache

[PHP]
hr = cmd.Open(session, "SELECT TOP 10 * FROM dbo.Tabell", &propset);


OpenDB opendb;
opendb.SetDBParams(....);
opendb.OpenDataSource();
int zeahler = 0;
while(S_OK == opendb.cmd.MoveNext())
{
zeahler++;
int k = opendb.m_ver;
}
[/PHP]

Kriege ich auch in zeahler 10 zurück

Geschrieben

Ja, das sieht gut aus. Sind in der Tabelle mehrere Felder?

Falls ja, schreib bitte mal die tatsächlichen Feldnamen statt des * in das Select-Statement. Kann sein, dass die Reihenfolge in der COLUMN_MAP nicht auf die Reihenfolge der Felder passt, wie das Select sie liefert.

Geschrieben
Original geschrieben von Klotzkopp

Ja, das sieht gut aus. Sind in der Tabelle mehrere Felder?

Falls ja, schreib bitte mal die tatsächlichen Feldnamen statt des * in das Select-Statement. Kann sein, dass die Reihenfolge in der COLUMN_MAP nicht auf die Reihenfolge der Felder passt, wie das Select sie liefert.

Es sind mehre Spalte und die stehen in COLUMN_MAP habe auch richtige Reihenfolge

Ich habe auch die tatsächlichen Feldnamen statt des * in das Select-Statement angegeben !?

Egal welchen Feldname ich aufrufe steht nur 0 ?!?!?

Irgend wie verstehe ich es nicht ;(

Geschrieben
Original geschrieben von 007ski

int k = opendb.m_ver;

Mir fällt gerade auf: Die Feldinhalte sollten in den Membervaraiblen des Accessors stehen. Wenn OpenDB nicht gerade von deiner Accessorklasse abgeleitet ist (was nicht gut wäre), sollte da

int k = opendb.cmd.m_ver;

stehen.

Geschrieben

Hallo,

also jetzt funktioniert obwohl ich es nicht verstehe warum ;(

so hat nicht funktioniert:

das habe ich in Heder


CCommand<CAccessor<CTabell> > cmd;
[/PHP]

Das in cpp

[PHP]
hr = cmd.Open(session, "SELECT * FROM dbo.Tabell ", &propset);

if (FAILED(hr))
return hr;

return hr;
// return MoveNext(); wenn so dann kriege ich Fehler

so funkt nur cpp:


hr = CCommand<CAccessor<CTabell> >::Open(session, "SELECT * FROM dbo. Tabell", &propset);

if (FAILED(hr))
return hr;

return MoveNext();

[/PHP]

Irgend wie ist es komisch, oder ?

Geschrieben
Original geschrieben von Klotzkopp

Ich kann mir das nur so erklären, dass dieser Code in einer Memberfunktion einer Klasse steht, die von CCommand abgeleitet ist. Ist das der Fall?

ja es ist der Fall, aber trozd verstehe ich es nicht und ist es überhaupt sauber ?

Geschrieben

Noch einen Problem mit OLE DB

Ich muß mit dem Progi auf SQL Server 2000 sowohl mit auch ohne Partitionierten Sichten.

Wenn ich die DB ohne Partitionierten Sichten auswähle als verbindungs- DB dann funk wunder bar sobald ich aber auf die Partitionierte Sichten gehen knack hier


hr = CCommand<CAccessor<CTabell> >::Open(session, "SELECT * FROM dbo.Tabell", &propset);

, in hr steht

-2147217887

Dein Kommentar

Du kannst jetzt schreiben und Dich später registrieren. Wenn Du ein Konto hast, melde Dich jetzt an, um unter Deinem Benutzernamen zu schreiben.

Gast
Auf dieses Thema antworten...

×   Du hast formatierten Text eingefügt.   Formatierung wiederherstellen

  Nur 75 Emojis sind erlaubt.

×   Dein Link wurde automatisch eingebettet.   Einbetten rückgängig machen und als Link darstellen

×   Dein vorheriger Inhalt wurde wiederhergestellt.   Editor leeren

×   Du kannst Bilder nicht direkt einfügen. Lade Bilder hoch oder lade sie von einer URL.

Fachinformatiker.de, 2024 by SE Internet Services

fidelogo_small.png

Schicke uns eine Nachricht!

Fachinformatiker.de ist die größte IT-Community
rund um Ausbildung, Job, Weiterbildung für IT-Fachkräfte.

Fachinformatiker.de App

Download on the App Store
Get it on Google Play

Kontakt

Hier werben?
Oder sende eine E-Mail an

Social media u. feeds

Jobboard für Fachinformatiker und IT-Fachkräfte

×
×
  • Neu erstellen...