Question

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

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

Note - application fonctionnait très bien avant nous avons migré vers nouveau serveur.

Était-ce utile?

La solution

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 a pu appeler la production serveur Sybase (grand système existant).

Si je l'ai essayé d'appeler Lire méthode de AseDataReader pour un seul enregistrement, tout allait bien. Mais si nous a permis à tous les enregistrements à lire, il lirait seulement 22 des 67 dossiers qui seraient récupérés si vous invoquez la procédure stockée via le client Sybase SQL Advandage. Je 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 avec bloc, vous auriez fait l'erreur suivante lorsque le lecteur est sorti de 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 remarquerez que le Dispose méthode de AseDataReader est lancer une exception, ce qui est un non-non. Pire encore est que si vous attrapez l'exception en tant que AseException et itérer sur Erreurs propriété de collection, la lecture ceux qui lancera des exceptions. Apparemment, vérifier les propriétés d'un AseError objet invoque en fait un code dynamique dans la propriété qui tente de regarder les choses d'une connexion active. Je ne suis pas particulièrement impressionné par cette version du code client .NET Sybase.

La question se résumait à un paramètre de taille de paquet qui était différent sur le serveur de production que sur les serveurs dev et test. Je n'ai pas accès admin, mais je crois qu'ils ont été mis à min et max 2048 4096 sur les serveurs dev et test, mais à la fois min et max jeu 4096 sur le serveur de production. C'est basé sur mon souvenir d'une conférence téléphonique, de sorte que votre kilométrage peut varier. Je voulais juste le mettre ici dans le cas où il aide quelqu'un d'autre plus tard. Il nous a fallu un certain temps pour suivre le problème vers le bas. Modification de la taille du paquet minimum et le redémarrage du serveur de base de données de production ne résoudre le problème pour nous.

Dans le cas où il aide, voici mon application console de test avec les chaînes de connexion brossées. Encore une fois, les lignes de commentaires au bas jetteraient des erreurs si décommentée. Espérons 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);
                //}
            }
        }
    }
}

Autres conseils

Jetez un oeil à cette ; semble que vous avez un problème dans vos données que Sybase est maintenant plus pointilleux sur.

Il y a quelques choses que vous pouvez vérifier. Tout d'abord vous obtenez cette erreur lorsque vous travaillez avec un smalldatetime qui est NOT NULL. Si oui pouvez-vous changer pour être NULLABLE et voir si cela résout le problème. D'autre part jeter un oeil à la taille du paquet DSN ODBC, si elle est 8192 essayer de le mettre vers le bas pour 4096.

J'espère que ça aide.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top