Pregunta

servidor de base de datos se migra desde la versión 12,5x a la versión 15.03 Sybase.Data.AseClient versión - 1.15.50.0

Me estoy haciendo a continuación una excepción cuando corro unos procedimientos almacenados a través .Net aplicación (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 - La aplicación estaba funcionando bien antes de que emigraron a nuevo servidor.

¿Fue útil?

Solución

Estábamos corriendo en este tema con algo de código se ejecuta en .NET Framework 3.5 y el uso de Sybase.Data.AseClient.dll (versión 1.1.510.0) cuando nos cambiamos de servidor de producción 12,5-15 . Todo ha funcionado bien en los entornos de pruebas y desarrollo después de la actualización, pero falló en la producción, a pesar de que ASP clásico código y el código de PowerBuilder era capaz de llamar al servidor Sybase producción (gran sistema heredado).

Si tratara de llamar a la Leer método de la AseDataReader para un solo registro, todo estaba bien. Pero si permitimos que todos los registros que se leen, se leería sólo 22 de los 67 registros que se recuperarían si se invoca el procedimiento almacenado a través del cliente de Sybase SQL Advandage. Herví abajo a una aplicación de línea de comandos juguete para reproducir el problema. Aquí están los detalles de error que saldría de la Leer

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

Si se asume que usted declaró que su IDataReader / AseDataReader en un mediante bloque, en realidad se obtendría el siguiente error cuando el lector salió de ámbito de aplicación cuando el error original de la Leer fue arrojado:

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

Se dará cuenta de que el Desechar método de la AseDataReader es una excepción, que es un gran no-no. Lo que es peor es que si se captura la excepción como un AseException y iterar sobre los Errores propiedad de colección, leyendo los va a lanzar excepciones. Al parecer, comprobando las propiedades de un AseError objeto realidad invoca algo de código dinámico en la propiedad que trata de mirar las cosas desde una conexión activa. No estoy particularmente impresionado por esta versión del código de cliente Sybase .NET.

El problema se reducía a un ajuste de tamaño de paquete que era diferente en el servidor de producción que en los servidores de pruebas y desarrollo. No tengo acceso de administrador, pero creo que se establecieron a min 2048 y 4096 como máximo en los servidores de pruebas y desarrollo, pero ambos min y max conjunto en 4096 en el servidor de producción. Que se basa en mi recuerdo de una conferencia telefónica, por lo que su experiencia puede variar. Sólo quería ponerlo aquí en caso de que ayuda a alguien más tarde. Nos tomó un tiempo para rastrear el problema hacia abajo. Cambiar el tamaño mínimo de paquetes y reiniciar el servidor de base de datos de producción hizo arreglar el problema para nosotros.

En caso de que ayuda, aquí está mi aplicación de consola de prueba con las cadenas de conexión fregados. Una vez más, las líneas de comentarios en la parte inferior tirarían errores si no comentada. Espero que esto ayude!

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

Otros consejos

Tenga una mirada en este ; parece que tiene un problema en los datos que Sybase es ahora más exigente con.

Hay un par de cosas que usted puede ser que desee comprobar. En primer lugar no se obtiene este error cuando se trabaja con un smalldatetime, que no es nulo. Si es así puede cambiarlo a ser nullable y ver si se soluciona el problema. En segundo lugar echar un vistazo al tamaño del paquete ODBC DSN, si es 8192 intenta establecer que hasta 4096.

espero que ayude.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top