Ado: mdb vers txt structure par tab (win32)

Soyez le premier à donner votre avis sur cette source.

Vue 7 388 fois - Téléchargée 896 fois

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

Ajouter un commentaire Commentaires
Messages postés
1137
Date d'inscription
lundi 17 novembre 2003
Statut
Membre
Dernière intervention
23 janvier 2016
21
Très utile et très lisible. (9/10) pour ne pas mettre 10 !!!
Messages postés
15
Date d'inscription
lundi 7 juin 2004
Statut
Membre
Dernière intervention
28 juin 2004

ok merci beaucoup c super de m'avoir répondu aussi vite
Messages postés
21042
Date d'inscription
jeudi 23 janvier 2003
Statut
Modérateur
Dernière intervention
21 août 2019
29
Regarde voir si tu as un dossier
C:\Program Files\Fichiers communs\System\ado
tu devrais y trouver la DLL donc dossier devrait aller pour #import
C'est juste que comme je dois souvent faire pour differents Windows et differentes fonctionnalites, j'ai groupe les versions de dll dans des dossiers specifiques.
Messages postés
15
Date d'inscription
lundi 7 juin 2004
Statut
Membre
Dernière intervention
28 juin 2004

Salut BruNews

Désolé de te dérranger mais j'aimerais savoir comment je pourrais adapter mon dossier à mon projet comme tu le dis pour

// adapter le dossier de msado15.dll

Par exemple je suis sous OFFICE 2003 je ne voit pas comment faire.

Merci de ta réponse.

Ps : garslouche a entièrement raison en parlant de toi @++.
Messages postés
584
Date d'inscription
mardi 26 novembre 2002
Statut
Membre
Dernière intervention
29 mai 2015

J'ajouterais que BruNews est le plus actif sur ce site et sur tous les sites CodeS-SourceS !!!
http://www.cppfrance.com/topmembres.aspx
Afficher les 7 commentaires

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.