Frage

Datenbank-Server ab Version 12.5x auf Version migriert 15.03 Sybase.Data.AseClient Version - 1.15.50.0

Ich bin unten Ausnahme bekommen, wenn ich einige gespeicherte Prozeduren durch .NET Anwendung ausführen (mit 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

Hinweis - Anwendung funktioniert gut, bevor wir auf den neuen Server migriert.

War es hilfreich?

Lösung

Wir waren in diesem Thema laufen mit einigen Code ausgeführt wird unter .NET Framework 3.5 und mit Sybase.Data.AseClient.dll (Version 1.1.510.0), wenn wir ein Upgrade unsere Produktionsserver 12,5-15 Alles. funktionierte gut in den Entwicklern und Testumgebungen nach dem Upgrade, aber in der Produktion gescheitert, obwohl ASP klassischer Code und Powerbuilder Code in der Lage war, die Produktion Sybase-Server (großes Legacy-System) zu nennen.

Wenn ich versuchte, die Lesen Aufruf Methode der AseDataReader für einen einzelnen Datensatz, war alles in Ordnung. Aber wenn wir alle Datensätze erlaubt zu lesen, wäre es nur 22 der 67 Datensätze ausgelesen, die abgerufen werden, wenn Sie die gespeicherte Prozedur über die Sybase SQL Advandage Client aufgerufen. Ich kochte es zu einer Spielzeug-Befehlszeile App herunter, um das Problem zu reproduzieren. Hier sind die Fehlerdetails, die von der herauskommen würde Lesen :

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

Unter der Annahme, dass Sie erklärt IDataReader / AseDataReader in einem mit Block, würden Sie tatsächlich die folgende Fehlermeldung erhalten, wenn der Leser ging aus Umfang, wenn der ursprüngliche Fehler aus der lesen wurde geworfen:

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

Sie werden bemerken, dass die Entsorgen Methode der AseDataReader ist eine Ausnahme zu werfen, die ein großes No-No. Noch schlimmer ist, dass, wenn Sie die Ausnahme als fangen AseException und Iterierte über die Fehler Sammlung Eigenschaft, werden diese zu lesen Ausnahmen werfen. Offenbar ein die Eigenschaften des Prüfen AseError Objekt ruft tatsächlich einige dynamischen Codes in der Eigenschaft, dass versucht zu sehen Dinge aus einer aktiven Verbindung auf. Ich bin nicht besonders beeindruckt von dieser Version des Sybase .NET-Client-Code.

gekocht Das Problem einer Paketgröße Einstellung nach unten, die auf dem Produktionsserver als auf den Entwickler und Test-Server anders war. Ich habe keinen Admin-Zugang, aber ich glaube, sie zu min 2048 eingestellt wurden und max 4096 an dem Entwickler und Test-Server aber sowohl Min- und Max-Satz bis 4096 auf dem Produktionsserver. Das ist auf Grund meiner Erinnerung an eine Telefonkonferenz, um die Leistung kann variieren. Ich wollte es nur hier bei löschte es später jemand anderes hilft. Es dauerte eine Weile, um das Problem auf die Spur. Ändern der minimalen Paketgröße und einen Neustart des Produktionsdatenbankserver das Problem für uns nicht beheben.

Falls es hilft, hier ist meine Testkonsolenanwendung mit den Verbindungszeichenfolgen geschrubbt. Auch hier würden die kommentierten Zeilen am unteren Fehler auslösen, wenn unkommentiert. Hoffe, das hilft Ihnen!

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

Andere Tipps

Haben Sie einen Blick auf diese ; Sieht aus wie Sie haben ein Problem in Ihren Daten, dass Sybase über nun mehr wählerisch ist.

Es gibt ein paar Dinge, die Sie überprüfen wollen könnten. Zum einen erhalten Sie diesen Fehler, wenn mit einem small arbeiten, die NOT NULL ist. Wenn ja können Sie es ändern NULLABLE und sehen, ob das behebt das Problem. nehmen Zweitens einen Blick auf die Paketgröße ODBC DSN, wenn es 8192 Versuch ist es auf 4096 nach unten.

Ich hoffe, es hilft.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top