Domanda

server di database viene migrato dalla versione 12,5x alla versione 15.03 Sybase.Data.AseClient versione - 1.15.50.0

io sono sempre al di sotto di eccezione quando corro qualche stored procedure tramite App NET (usando 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

Nota - Applicazione stava lavorando bene, prima abbiamo migrato al nuovo server.

È stato utile?

Soluzione

Siamo stati in esecuzione in questo problema con un certo codice in esecuzione in .NET Framework 3.5 e l'utilizzo di Sybase.Data.AseClient.dll (versione 1.1.510.0) quando abbiamo aggiornato il nostro server di produzione 12,5-15 . Tutto ha funzionato bene negli ambienti dev e prova dopo l'aggiornamento, ma non è riuscito in produzione, anche se ASP classico codice e il codice PowerBuilder è stato in grado di chiamare il server Sybase di produzione (grande sistema legacy).

Se ho provato a chiamare il Leggi il metodo del AseDataReader per un singolo record, tutto è andato bene. Ma se permettessimo tutti i record da leggere, sarebbe solo leggere 22 dei 67 record che sarebbero recuperati se è stata richiamata la stored procedure tramite il client Sybase SQL Advandage. Ho bollito giù ad una riga di comando di giocattoli app per riprodurre il problema. Ecco i dettagli di errore che sarebbe venuto fuori dalla Leggi :

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

Supponendo che hai dichiarato IDataReader / AseDataReader in con di blocco, si sarebbe in realtà il seguente errore quando il lettore è andato fuori portata quando l'errore originale dal Leggi è stato gettato:

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

Si noterà che il Smaltire il metodo del AseDataReader è un'eccezione, che è un grande no-no. Ancora peggio è che se si cattura l'eccezione come AseException e iterazioni su Errori proprietà della raccolta, la lettura di quelli getterà le eccezioni. A quanto pare, il controllo delle proprietà di un AseError oggetto richiama in realtà un po 'di codice dinamico nella proprietà che cerca di guardare le cose da una connessione attiva. Io non sono particolarmente colpito da questa versione del codice del client Sybase NET.

Il problema si riduceva ad un'impostazione del formato pacchetto che era diverso sul server di produzione che sui server dev e di test. Non ho accesso come amministratore, ma credo che sono stati fissati a min 2048 e max 4096 sui server dev e test, ma sia min e max impostato a 4096 sul server di produzione. Che si basa sul mio ricordo di una chiamata in conferenza, così il vostro chilometraggio può variare. Volevo solo mettere fuori qui nel caso aiuta qualcun altro più tardi. C'è voluto un po 'per monitorare il problema verso il basso. Modifica della dimensione minima del pacchetto e riavviare il server di database di produzione ha risolvere il problema per noi.

In caso aiuta, ecco la mia prova console app con le stringhe di connessione lavati. Anche in questo caso, le righe di commento in fondo getterebbero errori se non commentata. Spero che questo ti aiuta!

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);
                //}
            }
        }
    }
}

Altri suggerimenti

Date un'occhiata a questo ; Sembra che tu abbia un problema nella vostra dati che Sybase è ora più schizzinosi riguardo.

Ci sono un paio di cose che si potrebbe desiderare di controllare. In primo luogo si ottiene questo errore quando si lavora con uno smalldatetime che non è NULL. Se sì si può cambiare a essere NULLABLE e vedere se questo risolve il problema. In secondo luogo prendere uno sguardo alla dimensione del pacchetto DSN ODBC, se si tratta di 8192 tenta di impostare il basso per 4096.

Spero che aiuta.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top