[C++] Update DBF via VFPOLEDB geeft foutmelding

Pagina: 1
Acties:

Onderwerpen


Acties:
  • 0 Henk 'm!

  • FireFox67
  • Registratie: Augustus 2005
  • Laatst online: 31-10-2022
Wat ik wil doen is een veld updaten in een DBF-file via de OLEDB Foxpro Driver van Microsoft.
Ik krijg echter de volgende foutmelding:
"Bij een bewerking die uit meerdere stappen bestaat, is een fout opgetreden. Controleer alle statuswaarden."

Ik heb al veel sites gevonden met deze foutmelding, echter nog nergens een goede oplossing.
Iemand een goede tip?


De ontwikkelomgeving is RAD C++ Builder 2010.

C++:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
void __fastcall Tdm::UpdateArticle() {
    String DBFconn =
    "Provider=VFPOLEDB.1;Mode=ReadWrite|Share Deny None;Password='';Collating Sequence=MACHINE;Data Source=\\srv123\data\dbf\";

    try {
        std::auto_ptr<TADODataSet>plg(new TADODataSet(NULL));
        plg->Connection     = dm->PLGconn;      // SQLOLEDB ADOconnection
        plg->LockType       = ltReadOnly;
        plg->CursorType     = ctOpenForwardOnly;
        plg->CommandText    = "SELECT id, price FROM PLG_Data WHERE id>0";
        plg->Open();

        std::auto_ptr<TADODataSet>dbf(new TADODataSet(NULL));
        dbf->Connection     = DBFconn;          // VFPOLEDB ADOconnection
        dbf->CursorLocation = clUseServer;
        // dbf->LockType    = ltOptimistic;
        // dbf->CursorType  = ctDynamic;

        for (plg->First(); !plg->Eof; plg->Next()) {
            dbf->Close();
            dbf->CommandText = "SELECT * FROM article.dbf WHERE ID = " + plg->FieldByName("id")->AsString;
            dbf->Open();
            if (!dbf->Eof) {
                dbf->First();
                dbf->Edit();
                dbf->FieldByName("price")->Value = 1.0;
                //dbf->FieldByName("price")->Value = plg->FieldByName("price")->Value;
                dbf->Post();                    // Hier gaat het fout !
            }
            else {
                // Append?
            }
        }
        dbf->Close();
        plg->Close();
    }
    catch(Exception & E) {}
    catch(...) {}
}

Acties:
  • 0 Henk 'm!

  • .oisyn
  • Registratie: September 2000
  • Nu online

.oisyn

Moderator Devschuur®

Demotivational Speaker

Zet allereerst je code eens tussen [code=c++]...[/code] tags :)

.edit: op welke regel krijg je de foutmelding? En het verbaast me dat je code überhaupt compilet. Zoals je aan de rode lijn onder je connectiestring kunt zien, die klopt niet. Je gebruikt \ tekens in het pad, maar die worden gebruikt voor escape sequences. Als je een enkele \ in je string wilt hebben, dan zul je \\ moeten gebruiken. Je sluit af met \", wat betekent dat je een " in je string krijgt, maar vervolgens wordt de string niet afgesloten (aangezien \" bij je string hoort, en de " dus niet als afsluiter dient).

C++:
1
"Provider=VFPOLEDB.1;Mode=ReadWrite|Share Deny None;Password='';Collating Sequence=MACHINE;Data Source=\\\\srv123\\data\\dbf\\"; 

[ Voor 105% gewijzigd door .oisyn op 02-08-2011 11:52 ]

Give a man a game and he'll have fun for a day. Teach a man to make games and he'll never have fun again.


Acties:
  • 0 Henk 'm!

  • FireFox67
  • Registratie: Augustus 2005
  • Laatst online: 31-10-2022
Klopt, het path voor de bewuste connectionstring komt uit een libraryfunctie, daar staat de '\\' wel goed.
Ik wil alleen maar aangeven dat het dus een path is dat ik zet en geen DBF name er aan vast.

De compiler geeft geen fouten.
Bij het aanroepen van de functie gaat het fout bij de Post();

Op dit moment heb ik een aanpassing gemaakt.

C++:
1
2
3
4
5
std::auto_ptr<TADODataSet>dbf(new TADODataSet(NULL));
dbf->Connection = AlohaDataConnection;
dbf->LockType   = ltPessimistic;
dbf->CursorLocation = clUseServer;
dbf->CursorType = ctUnspecified;


bij de Post() krijg ik nu "Error: Cannot modify a read-only dataset

Acties:
  • 0 Henk 'm!

  • FireFox67
  • Registratie: Augustus 2005
  • Laatst online: 31-10-2022
Het vreemde is dat als ik in de commandtext de update direct uitvoer, het wel goed gaat.
Lijkt dus een bug in de driver te zijn.

C++:
1
dbf->CommandText = "update article set name='test', price=1.25 where id=95091";

Acties:
  • 0 Henk 'm!

  • FireFox67
  • Registratie: Augustus 2005
  • Laatst online: 31-10-2022
Zijn er hier mensen met ADO ervaring die weten hoe het zit?

Een Edit(), Post() vind ik eigenlijk een betere methode, maar dat werkt op dit moment niet.

Acties:
  • 0 Henk 'm!

  • RobIII
  • Registratie: December 2001
  • Niet online

RobIII

Admin Devschuur®

^ Romeinse Ⅲ ja!

(overleden)
Gebruik a.u.b. de edit knop ( Afbeeldingslocatie: http://tweakimg.net/g/forum/images/icons/edit.gif ) als je iets toe te voegen hebt en je hebt als laatst gepost in een topic; je topic herhaaldelijk omhoogschoppen is niet nodig en die melding staat er niet voor niets:

Afbeeldingslocatie: http://tweakers.net/ext/f/93OGDVn8zio6RrIck1qYj8ne/full.png

[ Voor 5% gewijzigd door RobIII op 02-08-2011 16:13 ]

There are only two hard problems in distributed systems: 2. Exactly-once delivery 1. Guaranteed order of messages 2. Exactly-once delivery.

Je eigen tweaker.me redirect

Over mij

Pagina: 1