2009-12-16 4 views
1

serveur de base de données est migré de la version 12.5x à la version 15.03 version Sybase.Data.AseClient - 1.15.50.0Erreur interne Sybase 30016

Je reçois ci-dessous exception lorsque je lance quelques procédures stockées dans l'application .Net (en utilisant AseClient)

 
Internal Error :30016 Unknown Dataitem Dataitem 

Stack Trace - 

    at Sybase.Data.AseClient.AseDataReader.CheckResult(Int32 res) 
    at Sybase.Data.AseClient.AseDataReader.RetrieveNextResult() 
    at Sybase.Data.AseClient.AseDataReader.GetNextResult() 
    at Sybase.Data.AseClient.AseDataReader.NextResult() 
    at Sybase.Data.AseClient.AseDataReader.CloseUrsHandle() 
    at Sybase.Data.AseClient.AseDataReader.Close() 
    at Sybase.Data.AseClient.AseDataReader.Dispose(Boolean disposing) 
    at Sybase.Data.AseClient.AseDataReader.Dispose() 
    at System.Data.Common.DbDataAdapter.FillInternal(DataSet dataset, DataTable[] datatables, Int32 startRecord, Int32 maxRecords, String srcTable, IDbCommand command, CommandBehavior behavior) 
    at System.Data.Common.DbDataAdapter.Fill(DataSet dataSet, Int32 startRecord, Int32 maxRecords, String srcTable, IDbCommand command, CommandBehavior behavior) 
    at System.Data.Common.DbDataAdapter.Fill(DataSet dataSet, String srcTable) 
    at HSBC.STPMapper.SybaseDAL.Utilities.SybaseHelper.ExecuteDataset(CommandType commandType, String commandText, DataSet dataset, String table, AseParameter[] commandParameters) in C:\Utilities\SybaseHelper.cs:line 119 

Remarque - L'application fonctionnait correctement avant la migration vers un nouveau serveur.

Répondre

4

Nous courions dans cette question avec un code en cours d'exécution dans .NET Framework 3.5 et en utilisant Sybase.Data.AseClient.dll (version 1.1.510.0) lorsque nous avons amélioré notre serveur de production de 12,5 à 15. Tout a bien fonctionné dans les environnements de développement et de test après la mise à niveau, mais a échoué dans la production, même si le code ASP classique et le code PowerBuilder ont pu appeler le serveur Sybase de production (grand système hérité).

Si j'ai essayé d'appeler la méthode Lire du AseDataReader pour un seul enregistrement, tout allait bien. Mais si nous autorisions la lecture de tous les enregistrements, il ne lirait que 22 des 67 enregistrements qui seraient récupérés si vous appeliez la procédure stockée via le client Sybase SQL Advandage. Je l'ai fait bouillir jusqu'à une application de ligne de commande de jouet pour reproduire le problème. Voici les détails d'erreur qui sortiraient du Lire:

Type: Sybase.Data.AseClient.AseException 
Message: Internal Error: 30016 
StackTrace: at Sybase.Data.AseClient.AseDataReader.?(Int32 A_0) 
    at Sybase.Data.AseClient.AseDataReader.?(Boolean A_0) 
    at Sybase.Data.AseClient.AseDataReader.?() 
    at Sybase.Data.AseClient.AseDataReader.Read() 
    at SybaseError.Program.TestCall(String friendlyName, String connectionString) 
in C:\Projects\SybaseUpgradeError\SybaseError\Program.cs:line 42 

En supposant que vous avez déclaré votre IDataReader/AseDataReader dans un en utilisant le bloc, vous obtenez en fait l'erreur suivante lorsque le lecteur est sorti de la portée lorsque l'erreur d'origine de la Lire a été jeté:

Type: Sybase.Data.AseClient.AseException 
Message: Internal Error: 30016 
StackTrace: at Sybase.Data.AseClient.AseDataReader.?(Int32 A_0) 
    at Sybase.Data.AseClient.AseDataReader.?(Boolean A_0) 
    at Sybase.Data.AseClient.AseDataReader.?() 
    at Sybase.Data.AseClient.AseDataReader.?() 
    at Sybase.Data.AseClient.AseDataReader.?(Boolean A_0) 
    at Sybase.Data.AseClient.AseDataReader.NextResult() 
    at Sybase.Data.AseClient.AseDataReader.?() 
    at Sybase.Data.AseClient.AseDataReader.Close() 
    at Sybase.Data.AseClient.AseDataReader.?(Boolean A_0) 
    at Sybase.Data.AseClient.AseDataReader.Dispose() 
    at SybaseError.Program.TestCall(String friendlyName, String connectionString) 
in C:\Projects\SybaseUpgradeError\SybaseError\Program.cs:line 54 

Vous Notez que la méthode Dispose du AseDataReader lève une exception, ce qui est un grand non-non. Pire encore, si vous attrapez l'exception comme AseException et parcourez la propriété Erreurs, la lecture de ceux-ci jettera des exceptions. Apparemment, vérifier les propriétés d'un objet AseError appelle en fait du code dynamique dans la propriété qui essaie de rechercher des choses à partir d'une connexion active. Je ne suis pas particulièrement impressionné par cette version du code client Sybase .NET.

Le problème s'est résumée à un paramètre de taille de paquet qui était différent sur le serveur de production que sur les serveurs de développement et de test. Je n'ai pas d'accès administrateur, mais je crois qu'ils ont été réglés sur min 2048 et max 4096 sur les serveurs de dev et de test mais les deux min et max ont été mis à 4096 sur le serveur de production.C'est basé sur mon souvenir d'une conférence téléphonique, donc votre kilométrage peut varier. Je voulais juste l'exposer ici au cas où cela aiderait quelqu'un d'autre plus tard. Il nous a fallu un certain temps pour suivre le problème. La modification de la taille minimale des paquets et le redémarrage du serveur de base de données de production ont résolu le problème pour nous. Au cas où cela serait utile, voici mon application de console de test avec les chaînes de connexion nettoyées. Encore une fois, les lignes commentées en bas pourraient renvoyer des erreurs si elles ne sont pas commentées. J'espère que cela vous aide!

using System; 
using System.Data; 
using Sybase.Data.AseClient; 

namespace SybaseError 
{ 
    public class Program 
    { 
     public static void Main(string[] args) 
     { 
      const string DevelopmentConnection = "Data Source='**********';Port='****';UID='**********';PWD='**********';Database='**********';"; 
      const string ReportConnection = "more secret stuff"; 
      const string ProductionConnection = "yet more secret stuff"; 

      TestCall("Development", DevelopmentConnection); 
      TestCall("Report", ReportConnection); 
      TestCall("Production", ProductionConnection); 

      Console.ReadKey(); 
     } 

     private static void TestCall(string friendlyName, string connectionString) 
     { 
      Console.WriteLine("Calling procedure on " + friendlyName + "."); 

      int recordsRead = 0; 

      try 
      { 
       using (var connection = new AseConnection(connectionString)) 
       { 
        connection.Open(); 

        using (var command = connection.CreateCommand()) 
        { 
         ConfigureCommand(command); 

         using (var reader = command.ExecuteReader(CommandBehavior.CloseConnection)) 
         { 
          try 
          { 
           while (reader.Read()) 
           { 
            // Would usually read things here... 
            recordsRead++; 
           } 
          } 
          catch (Exception exRead) 
          { 
           Console.WriteLine("Error on read:"); 
           ShowError(exRead); 
           throw; 
          } 
         } 
        } 
       } 

       Console.WriteLine("Success calling procedure on " + friendlyName + "."); 
      } 
      catch (Exception ex) 
      { 
       Console.WriteLine("Outer error:"); 
       ShowError(ex); 
       Console.WriteLine("Failure calling procedure on " + friendlyName + "."); 
      } 

      Console.WriteLine("Finished calling procedure on " + friendlyName + ". Read " + recordsRead + " records."); 
      Console.WriteLine(string.Empty); 
     } 

     private static void ConfigureCommand(AseCommand command) 
     { 
      command.CommandText = "sp_s_educator_route_tests"; 
      command.CommandType = CommandType.StoredProcedure; 

      var spidParameter = new AseParameter("@spid", AseDbType.Integer); 
      spidParameter.Value = 1355945; 
      command.Parameters.Add(spidParameter); 

      var vendorIdParameter = new AseParameter("@vendor_id", AseDbType.Integer); 
      vendorIdParameter.Value = 1; 
      command.Parameters.Add(vendorIdParameter); 
     } 

     private static void ShowError(Exception ex) 
     { 
      Console.WriteLine("Type: " + ex.GetType()); 
      Console.WriteLine("Message: " + ex.Message); 
      Console.WriteLine("StackTrace: " + ex.StackTrace); 

      var exAse = ex as AseException; 

      if (exAse != null) 
      { 
       //foreach (AseError error in exAse.Errors) 
       //{ 
       // Console.WriteLine("SqlState: " + error.SqlState); 
       // Console.WriteLine("State: " + error.State); 
       //} 
      } 
     } 
    } 
} 
0

Jetez un oeil à this; On dirait que vous avez un problème dans vos données que Sybase est maintenant plus difficile.

0

Il y a plusieurs choses que vous pourriez vouloir vérifier. Tout d'abord, obtenez-vous cette erreur lorsque vous travaillez avec un smalldatetime qui n'est pas NULL. Si oui pouvez-vous le changer pour être NULLABLE et voir si cela résout le problème. Deuxièmement, jetez un oeil à la taille du paquet ODBC DSN, si c'est 8192, essayez de le mettre à 4096.

J'espère que cela aide.