Ado: mdb vers txt structure par tab (win32)

Description

Exemple pour ne plus en faire un a chaque demande.
ADO n'est pas foudre de guerre mais est tres simple d'emploi.
Malgre tout je montre qu'on peut aller assez vite.
Ceci en supprimant tout strcat, strlen et reparcours du tampon.
7544 lignes doivent sortir dans le txt.

Source / Exemple :


#include <windows.h>
#include "bnlib2c.h"
#include "McrAsm.h"

// adapter le dossier de msado15.dll
#import "D:\AdoDb\Ado25\msado15.dll" no_namespace rename("EOF", "EndOfFile")

struct InitOle {
  InitOle()  {CoInitialize(NULL);}
  ~InitOle() {CoUninitialize();}
} _init_InitOle_;

_ConnectionPtr  pdb = 0;  // pointeur database
_RecordsetPtr   prs;

char szappname[] = "Extract";
char szTXTPATIENTS[] = "Patients.txt";
char szCONNECT[] = "Provider=Microsoft.JET.OLEDB.4.0;Data source=Medical.mdb";
char szENTETE[] = "\"ID\"\t\"NOM\"\t\"PRENOM\"\t\"NAISSANCE\"\r\n";

inline void TESTHR(HRESULT x) {if FAILED(x) _com_issue_error(x);};

int ConnectBaseMdb()
{
  try {
    TESTHR(pdb.CreateInstance(__uuidof(Connection)));
    TESTHR(prs.CreateInstance(__uuidof(Recordset)));
    pdb->Mode = adModeShareExclusive;
    pdb->Open(szCONNECT, "", "", 0);
  }
  catch(_com_error &e) {
    MessageBox(0, (LPCSTR) e.Description(), szappname, MB_ICONEXCLAMATION);
    pdb = 0; return 0;
  }
  return 1;
}

//Table : Patients
// Fld(0) Nom, TEXT 50
// Fld(1) Prenom, TEXT 50, NULLABLE
// Fld(2) Naissance, DATE, NULLABLE
// Fld(3) PatientID, INT32 AutoIncr
void PatientsToTxt()
{
  SYSTEMTIME  sttm;
  HANDLE hfl;
  DWORD dwWrite;
  long  lval, lerror = 1; // presume erreur
  char szbuff[160]; // tampon pour chaque ligne du txt
  char *psz; // pointeur ecriture dans szbuff
  _variant_t var;
  _bstr_t bst;
  try {prs->Open("SELECT * FROM Patients", _variant_t((IDispatch *) pdb,true),
                adOpenStatic, adLockReadOnly, adCmdText);}
  catch(_com_error &e) {
    MessageBox(0, (LPCSTR) e.Description(), szappname, MB_ICONEXCLAMATION);
    return;
  }
  hfl = CreateFile(szTXTPATIENTS,GENERIC_WRITE,0,0,CREATE_ALWAYS, FILE_FLAG_SEQUENTIAL_SCAN, 0);
  if(hfl == INVALID_HANDLE_VALUE) {
    MessageBox(0, "TXT CREATION IMPOSSIBLE", szappname, MB_ICONEXCLAMATION);
    goto closeRS;
  }
  WriteFile(hfl, szENTETE, 33, &dwWrite, 0);
  try {
    // on mettra PatientID en 1er sur les lignes du txt
    // alors faire gaffe aux index de champs
    while(!prs->EndOfFile) {
      lval = prs->Fields->GetItem((long)3)->Value; // PatientID
      psz = bnultoa(lval, szbuff); // de ma dll pour vitesse

  • psz++ = '\t';
bst = prs->Fields->GetItem((long)0)->Value; // Nom
  • psz++ = '\"';
psz = bnstrcpy(psz, bst);
  • psz++ = '\"'; *psz++ = '\t';
var = prs->Fields->GetItem((long)1)->Value; // Prenom, NULLABLE !!! if(var.vt == VT_BSTR) { bst = var;
  • psz++ = '\"';
psz = bnstrcpy(psz, bst);
  • psz++ = '\"';
}
  • psz++ = '\t';
var = prs->Fields->GetItem((long)2)->Value; // Naissance, NULLABLE !!! if(var.vt != VT_NULL) { // champ DATE mdb (comme d'autres SGBD) est 64 bits virgule flottante VariantTimeToSystemTime(var.dblVal, &sttm); psz = bnSttmToFr(&sttm, psz); // de ma dll pour vitesse }
  • psz++ = '\r'; *psz++ = '\n';
WriteFile(hfl, szbuff, psz - szbuff, &dwWrite, 0); prs->MoveNext(); } } catch(_com_error &e) { MessageBox(0, (LPCSTR) e.Description(), szappname, MB_ICONEXCLAMATION); goto closeFL; } MessageBox(0, "FINI TXT", szappname, MB_ICONINFORMATION); lerror = 0; closeFL: CloseHandle(hfl); if(lerror) DeleteFile(szTXTPATIENTS); closeRS: prs->Close(); } int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE, PSTR, int) { if(!ConnectBaseMdb()) return 0; MessageBox(0, "Fichier txt au depart", szappname, MB_ICONINFORMATION); PatientsToTxt(); if(pdb) if(pdb->State != adStateClosed) pdb->Close(); return 0; }

Conclusion :


Tout dans le zip:
- proj format VS 2003
- Medical.mdb
- bnlib2c.dll

Codes Sources

A voir également

Vous n'êtes pas encore membre ?

inscrivez-vous, c'est gratuit et ça prend moins d'une minute !

Les membres obtiennent plus de réponses que les utilisateurs anonymes.

Le fait d'être membre vous permet d'avoir un suivi détaillé de vos demandes et codes sources.

Le fait d'être membre vous permet d'avoir des options supplémentaires.