문제

데이터베이스 서버는 버전 12.5x에서 버전 15.03 Sybase.data.aseclient 버전으로 마이그레이션됩니다.

.NET 앱 (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 클래식 코드와 PowerBuilder 코드가 생산 Sybase Server를 호출 할 수 있었음에도 불구하고 업그레이드 후 DEV 및 테스트 환경에서 모든 것이 잘 작동했지만 생산에 실패했습니다. (큰 레거시 시스템).

내가 전화를 시도했다면 읽다 방법의 방법 asedatareader 단일 레코드의 경우 모든 것이 괜찮 았습니다. 그러나 모든 레코드를 읽을 수있게되면 Sybase SQL Advandage 클라이언트를 통해 저장된 절차를 호출하면 검색 될 67 개의 레코드 중 22 개만 읽을 수 있습니다. 문제를 재현하기 위해 장난감 명령 라인 앱으로 끓였습니다. 다음은 읽다:

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 예외를 던지고 있습니다. 더 나쁜 것은 당신이 예외를 Aseexection 그리고 반복 오류 수집 속성, 읽는 것은 예외를 던질 것입니다. 분명히, an의 속성을 확인합니다 Aseerror 객체는 실제로 활성 연결에서 물건을 찾으려고 시도하는 속성의 일부 동적 코드를 호출합니다. 이 버전의 Sybase .NET 클라이언트 코드에 특히 깊은 인상을받지 않습니다.

이 문제는 Dev 및 테스트 서버와는 다른 프로덕션 서버에서 다른 패킷 크기 설정으로 요약되었습니다. 관리자 액세스 권한은 없지만 DEV 및 테스트 서버에서 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가 더 까다로운 문제가있는 것 같습니다.

확인하고 싶은 몇 가지가 있습니다. 먼저 Null이 아닌 작은 시간을 작업 할 때이 오류가 발생합니까? 그렇다면, 당신은 그것을 무효화 할 수 있도록 변경하고 그것이 문제를 해결하는지 확인할 수 있습니다. 둘째, 8192 인 경우 ODBC DSN 패킷 크기를 살펴보십시오. 4096으로 설정하십시오.

도움이되기를 바랍니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top