Вопрос

Сервер базы данных перенесен с версии 12.5x на версию 15.03 Sybase.Data.Дополнительная версия - 1.15.50.0

Я получаю приведенное ниже исключение, когда запускаю несколько хранимых процедур.Сетевое приложение (с использованием 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

Примечание - Приложение работало нормально до того, как мы перешли на новый сервер.

Это было полезно?

Решение

Мы столкнулись с этой проблемой из-за некоторого кода, работающего под .NET Framework 3.5 и использующего Sybase.Data.AseClient.dll (версия 1.1.510.0), когда мы обновили наш производственный сервер с 12.5 до 15.После обновления все работало хорошо в среде разработки и тестирования, но в рабочей среде произошел сбой, хотя код ASP classic и код PowerBuilder смогли вызвать производственный сервер Sybase (большая устаревшая система).

Если бы я попытался позвонить в Читать способ проведения AseDataReader - это программа для чтения для одной записи все было в порядке.Но если бы мы разрешили чтение всех записей, было бы прочитано только 22 из 67 записей, которые были бы извлечены, если бы вы вызвали хранимую процедуру через клиент Sybase SQL Advandage.Я свел это к игрушечному приложению командной строки, чтобы воспроизвести проблему.Вот подробные сведения об ошибке, которые могли бы появиться из Читать:

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

Предполагая, что вы заявили о своем IDataReader ( идентификатор пользователя ) / AseDataReader - это программа для чтения в используя блок, вы фактически получили бы следующую ошибку, когда считыватель вышел бы за пределы области видимости, когда исходная ошибка из Читать был выброшен:

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

Вы заметите, что Утилизировать способ проведения AseDataReader - это программа для чтения выдает исключение, которое является большим запретом.Еще хуже то, что если вы перехватите исключение как Исключение AseException и повторите процедуру по Ошибки свойство коллекции, чтение которого приведет к возникновению исключений.По-видимому, проверка свойств Ошибка AseError object фактически вызывает некоторый динамический код в свойстве, который пытается выполнить поиск из активного соединения.Я не особенно впечатлен этой версией клиентского кода Sybase .NET.

Проблема сводилась к настройке размера пакета, который отличался на производственном сервере от настроек на серверах разработки и тестирования.У меня нет прав администратора, но я полагаю, что для них были установлены значения min 2048 и max 4096 на серверах разработки и тестирования, но для min и max установлены значения 4096 на производственном сервере.Это основано на моих воспоминаниях о телефонной конференции, так что ваш пробег может отличаться.Я просто хотел выложить это здесь на случай, если позже это поможет кому-нибудь еще.Нам потребовалось некоторое время, чтобы разобраться в проблеме.Изменение минимального размера пакета и перезагрузка сервера производственной базы данных устранили проблему для нас.

На случай, если это поможет, вот мое тестовое консольное приложение с удаленными строками подключения.Опять же, закомментированные строки внизу будут выдавать ошибки, если их раскомментировать.Надеюсь, это поможет вам!

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

Другие советы

Взгляните на это;похоже, у вас возникла проблема с вашими данными, к которой Sybase теперь более придирчива.

Есть пара вещей, которые вы, возможно, захотите проверить.Во-первых, вы получаете эту ошибку при работе с smalldatetime, которое НЕ равно NULL.Если да, можете ли вы изменить его на ОБНУЛЯЕМЫЙ и посмотреть, решит ли это проблему.Во-вторых, взгляните на размер пакета ODBC DSN, если он равен 8192, попробуйте уменьшить его до 4096.

Я надеюсь, что это поможет.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top