Announcement

Collapse
No announcement yet.

SQL Server + COM bzw OLE

Collapse
X
  • Filter
  • Time
  • Show
Clear All
new posts

  • SQL Server + COM bzw OLE

    Hi an alle,

    ich möchte ein Word - Dokument an eine Datenbanktabelle übergeben.
    Und zwar soll es wie folgt funktionieren.

    Ich eröffne unter Access ein Datenbankprojekt und wähle SQL Server 7 als DBMS

    Nun erstelle ich mir eine Tabelle mit z.B. den Feldern ID (Int) und Dok(Image).

    Nun kann ich per Drag und Drop ein Word - Document in die Spalte Dok ziehen und es wird als Word - Dokument erkannt.
    Ich doppelklicke das Element in der Tabelle und das Word Dokument öffnet sich automatisch.

    Ich möchte nun ein Dokument auf die oben beschriebene Art über Visual C++ 6.0 an die Tabelle übergeben.
    Mit einem Stream - Objekt scheint es nicht zu funktionieren. Habe ich bereits versucht und bekomme immer von HRESULT "Interner Anwendungsfehler" zurück wenn ich einen Insert durchführe.
    Ich erzeuge ein neues ATL - Objekt und wähle meine Datenquelle (Das o.e. Datenbankprojekt) aus. Vorher wähle ich bei Datenzugriff Nutzer mit den Optionen Einfügen, Ändern und Löschen und bei Typ nehme ich Befehl.

    Jetzt hole ich mir die Datei(Word - Dokument) und schiebe dieses in einen Stream.

    Code:
    h = ::FindFirstFile(strPath, &fData);
    if(h == (HANDLE)0xFFFFFFFF)
    {
    AfxMessageBox("Verzeichnis nicht gefunden");
    return;
    }
    do
    {
    if(!::FindNextFile(h, &fData))
    {
    nStop = 0;
    }
    }while(strcmp(fData.cFileName, strFileName) != 0 && nStop != 0);

    if(nStop != 0)
    {

    VERIFY(::StgCreateDocfile(T2COLE(g_szRootStorageNa me),
    STGM_READWRITE | STGM_SHARE_EXCLUSIVE |
    STGM_CREATE, 0, &pStg) == S_OK);

    VERIFY(pStg->CreateStorage(T2COLE(szStorageName),
    STGM_CREATE | STGM_READWRITE |
    STGM_SHARE_EXCLUSIVE, 0, 0, &pStgFile)== S_OK);

    strcpy(szStreamName, fData.cFileName);

    VERIFY(pStg->CreateStream(T2COLE(szStreamName),
    STGM_CREATE | STGM_READWRITE |
    STGM_SHARE_EXCLUSIVE, 0,0, &lpStr) == S_OK);
    }
    Übergebe meine Werte und führe dann den Insert durch.
    Wie gesagt "Interner Anwendungsfehler".

    db.m_id = 1;
    db.m_image = lpStr;
    hRes = db.Insert();
    if(FAILED(hRes))
    AfxThrowOleException(hRes);

    Jemand schon einmal so etwas oder ähnliches gemacht der mir einen Tipp geben kann.
    Kann auch ein ganz anderer Weg sein als OLE DB.

    Mfg

    Karsten
Working...
X