2015-11-02 1 views
0

J'utilise le code suivant pour collecter des données à partir d'un fichier de base de données BTrieve 6.15 basé sur le WBTRV32.dll Je récupère toujours le code d'erreur 22 à la position lisant la prochaine ligne de données - est-ce un problème? mon fichier BTrieve n'a pas fixé la largeur des colonnes?C# Erreur Btrieve 6.15 22

// Open file 
RecordBuffer dataBuffer = new RecordBuffer(); 
int bufferLength = System.Runtime.InteropServices.Marshal.SizeOf(dataBuffer); 
short status = (short)BTRCALL(0, positionBlock, ref dataBuffer, ref bufferLength, fileNameArray, 0, 0); 

     if (status == 0) <== Here Status = 0 
     { 
      // Get first record 
      dataBuffer = new RecordBuffer(); 
      status = (short)BTRCALL(12, positionBlock, ref dataBuffer, ref bufferLength, fileNameArray, 0, 0); //BGETFIRST 

      if (status == 0) <== Here Status = 0 
      { 
       ...     
      } 

      // Get subsequent records 
      while (status == 0) // BReturnCodes.END_OF_FILE or an error will occur 
      { 
       dataBuffer = new RecordBuffer(); 
       status = (short)BTRCALL(6, positionBlock, ref dataBuffer, ref bufferLength, fileNameArray, 0, 0); //BGETNEXT 

       if (status == 0) <=== Here Status = 22 data buffer length overrun 
       { 

       } 
      } 

}

Répondre

1

Le statut 22 signifie "mémoire tampon de données trop court". Selon le documentation:

Situé à une valeur supérieure ou égale à la longueur de l'enregistrement que vous souhaitez récupérer la mémoire tampon de données Longueur.

Vous devez vous assurer que la longueur du tampon de données est définie sur la valeur appropriée avant chaque appel. Dans votre code, vous définissez uniquement la variable bufferLength une fois. Si vous avez des enregistrements de longueur variable, cette valeur est définie sur retour à la longueur de l'enregistrement afin que vous, en tant que développeur, sachez combien de données ont été renvoyées. Avant l'appel GET suivant, vous devez le réinitialiser au maximum que vous prévoyez de renvoyer.