سؤال

يتم ترحيل خادم قاعدة البيانات من الإصدار 12.5x إلى الإصدار 15.03 Sybase.data.aseclient الإصدار - 1.15.50.0

أحصل على استثناء أقل عندما أقوم بتشغيل بعض الإجراءات المخزنة من خلال تطبيق .NET (باستخدام aseclient)

خطأ داخلي: 30016 غير معروف Dataitem Dataitem Stack Trace - في Sybase.Data.aseclient.asedatareader.checkresult (INT32 RES) في Sybase.Data.aseclient.asedatareader.retrievenextresult () في Sybase.data.aseclient.asedatareader.getnextresult () في Sybase .data.aseclient.asedatareader.nextresult () في sybase.data.aseclient.asedatareader.closeurshandle () في sybase.data.aseclient.asedatareader.close () في sybase.data.aseclient.asedatareader.dispose (Boolean Trading) في Sybase .data.aseclient.asedatareader.dispose () في system.data.common.dbdataadapter.fillInternal (DataSet DataSet، DataTable [] DataTables، Int32 Startstrecord، Int32 MaxRecords، String SRCTable، CommandBehavior السلوك، سلوك CommandBehavior) في System.Data.Common .dbdataadapter.fillfill (DataSet DataSet، Int32 Starttrecord، Int32 MaxRecords، String SRCTable، IDBCommand Command، سلوك CommandBehavior) في System.Data.common.dbdataAdapter.fill (DataSet DataSet، String SRCTable) في HSBCSTPMAPPER.SYBASEDAL.UTITION.SYBASEHELPER .EXUTEDATASET (CO. MMANDTYPE CommandType، String CommandText، DataSet DataSet، طاولة سلسلة، ASSEarameter [] CommandParameters) في C:  Utilities  Sybasehelper.cs: Line 119

ملاحظة - كان التطبيق يعمل بشكل جيد قبل أن نهمنا إلى خادم جديد.

هل كانت مفيدة؟

المحلول

كنا نواجه هذه المشكلة مع بعض التعليمات البرمجية قيد التشغيل تحت .NET Framework 3.5 واستخدام sybase.data.aseclient.dll. (الإصدار 1.1.510.0) عندما نقوم بترقية خادم الإنتاج لدينا من 12.5 إلى 15. كل شيء يعمل بشكل جيد في بيئات التطوير والاختبار بعد الترقية، لكنه فشل في الإنتاج، على الرغم من أن رمز ASP Classic Code و CodeBuilder كان قادرا على استدعاء خادم Sybase Server (نظام كبير كبير).

إذا حاولت الاتصال اقرأ طريقة 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

على افتراض أنك أعلنت شرط التعريفي / 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. وتكرر أكثر من أخطاء ملكية المجموعة، قراءة تلك سوف رمي الاستثناءات. على ما يبدو، التحقق من خصائص eserror. تم استدعاء الكائن في الواقع بعض التعليمات البرمجية الديناميكية في الخاصية التي تحاول أن تنظر إلى أشياء من اتصال نشط. أنا لا أعجب بشكل خاص بواسطة هذا الإصدار من رمز عميل Sybase .NET.

المشكلة المغلي لأسفل إلى إعداد حجم الحزمة كان مختلفا على خادم الإنتاج أكثر من خوادم Dev واختبار. ليس لدي إمكانية الوصول إلى المشرف، لكنني أعتقد أنه تم تعيينها إلى دقيقة 2048 و MAX 4096 على خوادم DEV واختبار ولكن تعيين كل من 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 الآن أكثر إرضاا صعبا.

هناك بضعة أشياء قد ترغب في التحقق منها. أولا هل تحصل على هذا الخطأ عند العمل مع الصلبة الصغيرة التي ليست فارغة. إذا كانت الإجابة بنعم، يمكنك تغييرها لتكون غير قابلة للنظر ومعرفة ما إذا كان ذلك يعمل المشكلة. ثانيا، إلقاء نظرة على حجم حزمة ODBC DSN، إذا كان 8192 محاولة تعيينه إلى 4096.

اتمني ان يكون مفيدا.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top