Pergunta

servidor de banco de dados é migrado da versão 12.5x para a versão 15.03 versão Sybase.Data.AseClient - 1.15.50.0

Estou ficando abaixo exceção quando eu executar alguns procedimentos armazenados por meio .Net aplicativo (utilizando 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 - Aplicação estava funcionando bem antes que migraram para o novo servidor.

Foi útil?

Solução

Estávamos correndo para esta questão com algum código em execução no .NET Framework 3.5 e usando Sybase.Data.AseClient.dll (versão 1.1.510.0) quando nós atualizamos nosso servidor de produção 12,5-15 . Tudo funcionou bem nos ambientes dev e teste após a atualização, mas não na produção, apesar de código ASP clássico e código PowerBuilder foi capaz de chamar o servidor Sybase produção (grande sistema legado).

Se Eu tentei ligar o Leia método da AseDataReader para um único registro, tudo estava bem . Mas se permitiu que todos os registros para ser lido, seria lido apenas 22 dos 67 registros que seriam recuperados se você invocado o procedimento armazenado através do cliente Sybase SQL Advandage. Eu fervida para baixo a um aplicativo de linha de comando brinquedo para reproduzir o problema. Aqui estão os detalhes do erro que iria sair do Leia :

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

Assumindo que você declarou seu IDataReader / AseDataReader em usando bloco, você realmente obter o seguinte erro quando o leitor saiu de escopo quando o erro original do Leia foi jogado:

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

Você notará que o Eliminar método do AseDataReader é lançar uma exceção, que é um grande não-não. Pior ainda é que, se você capturar a exceção como um AseException e iterar sobre os Erros coleta de propriedade, lendo aqueles vai lançar exceções. Aparentemente, verificando as propriedades de um AseError objeto realmente invoca algum código dinâmico na propriedade que tenta olhar as coisas de uma conexão ativa. Eu não estou particularmente impressionado com esta versão do código do cliente Sybase NET.

A questão se resumia a uma configuração de tamanho pacote que era diferente no servidor de produção do que nos servidores dev e teste. Eu não tenho acesso de administrador, mas eu acredito que eles foram criados para min 2048 e max 4096 nos servidores dev e teste mas ambos min e conjunto máximo para 4096 no servidor de produção. Que é baseada em minha lembrança de uma chamada de conferência, assim que sua milhagem pode variar. Eu só queria colocá-lo aqui no caso de ajuda alguém mais tarde. Demorou um tempo para rastrear o problema para baixo. Alterar o tamanho do pacote mínimo e reiniciar o servidor de banco de dados de produção fez solucione o problema para nós.

Em caso de ajuda, aqui está a minha aplicação de console de teste com as seqüências de conexão lavados. Mais uma vez, as linhas comentadas na parte inferior jogaria erros se uncommented. Espero que isso ajude você!

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

Outras dicas

Tenha um olhar em este ; Parece que você tem um problema em seus dados que Sybase é agora mais exigente quanto.

Há um par de coisas que você pode querer verificar. Em primeiro lugar você receber esse erro quando se trabalha com um smalldatetime que não é NULL. Se sim, você pode mudá-lo para ser NULLABLE e ver se isso resolve o problema. Em segundo lugar dar uma olhada no tamanho do pacote ODBC DSN, se é 8192 tentar defini-lo até 4096.

Espero que ajude.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top