مشكلة في استخدام/عرض الأحرف الخاصة من Oracle db في تطبيق .Net

StackOverflow https://stackoverflow.com/questions/1222529

سؤال

لدي تطبيق C#.Net يصل إلى البيانات من تطبيق تجاري مدعوم بـ Oracle 10 db.يحتوي حقلان في قاعدة بيانات التطبيق التجاري (المُشار إليهما بـ varchar2(n)) على أحرف خاصة.على سبيل المثال، الفاصلة العليا "الاقتباس الذكي".يعرض تطبيق العميل التجاري هذه الأحرف بشكل صحيح، لكن تطبيقي يعرضها كعلامة استفهام مقلوبة.مجموعة أحرف Oracle هي "WE8ISO8859P1".

يقرأ تطبيقي قاعدة البيانات التجارية باستخدام System.Data.OracleClient.OracleDataAdapter، ويتم تحويله إلى جدول عبر DataSet.Tables.يتم تحويل صفوف الطاولة إلى كائنات، ويتم تخزين الحقول المعنية كسلاسل.

إذا قمت بفحص (في مصحح الأخطاء) البيانات الموجودة في DataSet مباشرة بعد قراءتها من قاعدة البيانات، فسيتم بالفعل عرض الأحرف الخاصة بشكل غير صحيح.لا أستطيع معرفة كيفية فحص البيانات بالبايتات السداسية لمعرفة ما هو موجود بالفعل، كما أنني لست متأكدًا مما يجب أن أبحث عنه.

لقد لاحظت أيضًا أن Toad يعرض الشخصيات كعلامات استفهام مقلوبة أيضًا.

يقوم أحد جوانب تطبيقنا بكتابة هذه السجلات في جدول منفصل في قاعدة البيانات الخاصة بنا؛عندما يحدث ذلك، يتم تعديل الأحرف الخاصة، ثم يتم عرضها كمربعات بدلاً من علامات الاستفهام المقلوبة.

يمكنني تقديم مزيد من المعلومات إذا لزم الأمر.شكرا لك لأي مساعدة ولكل مساعدة!

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

المحلول 2

بوستسكريبت لكل من يتصفح هذا الموضوع:

لقد كان بوجدان مفيدًا للغاية في إيصالي إلى "الإجابة" (كما هي) ولكن كما أشار، قد لا تكون لديك ظروف متطابقة.

  1. لقد تواصلنا مع الفريق المسؤول عن استخدام البرنامج التجاري.لقد كانوا يقومون بالنسخ/اللصق من Word وExcel، وهذه هي الطريقة التي تم بها إدراج الأحرف الخاصة.

  2. حدثت المشكلة في ترجمة الحرف بين قاعدة البيانات البعيدة وقاعدة البيانات الخاصة بنا.تستخدم قاعدة البيانات المضيفة مجموعة الأحرف WE8ISO8859P1، حيث تستخدم قاعدة بياناتنا WE8MSWIN1252.نظرًا للمخاوف على مستوى الشركة، فإن تعديل أي من مجموعتي الأحرف ليس ممكنًا في الوقت الحالي.

  3. لقد استخدمت SYS.UTL_RAW.CAST_TO_RAW(fieldname) لتحويل الحقل المصدر للبحث عن "BF" (الرمز السداسي لعلامة الاستفهام المقلوبة في مجموعة الأحرف لدينا).هذا على الأقل اسمحوا لي أن التعرف على سجل المشكلة والشخصية.ومع ذلك، يمكن/يمكن ترجمة العديد من الأحرف الخاصة المختلفة الموجودة في السجلات البعيدة إلى BF.على سبيل المثال، الواصلات في Word ليست عبارة عن أحرف "شرطة" بسيطة، ويتم ترجمتها أيضًا إلى علامة استفهام مقلوبة.

  4. dump(fieldname) يتم تحويله بطريقة ما إلى رموز أحرف عشرية قبل الترجمة، إلا إذا استخدمت أيضًا SYS.UTL_RAW.CAST_TO_RAW في نفس الاستعلام.تسبب هذا في صداع مذهل.dump() في حد ذاته قد يكون مفيدًا في تحديد أحرف معينة مترجمة مسبقًا من قاعدة البيانات المصدر.

أفضل حل هو استخدام نفس مجموعة الأحرف في كلا قاعدة البيانات.نظرًا لأن ذلك غير ممكن بالنسبة لنا، فقد قمنا يدويًا باستبدال كافة تكرارات الحرف الخاص على المصدر (البعيد) db بمكافئات غير خاصة (فاصلة عليا عادية أو واصلة).ومع ذلك، نظرًا لأن البرنامج التجاري لا يصحح الأحرف الخاصة أو يضع علامة عليها، فقد نواجه هذه المشكلة في المستقبل.لذلك، سيقوم تطبيق التحديث الخاص بنا بالبحث عن علامة الاستفهام المقلوبة وإرسال إشعار إلى مالك النظام بمعرف السجل السيئ.وهذا، مثل العديد من مواقف الشركات الأخرى، يجب أن يتم.؛-)

شكرا مرة أخرى، بوجدان!

نصائح أخرى

وبعض الأحرف في مجموعة الأحرف WE8ISO8859P1 لها تمثيل ثنائي آخر من نفس الحرف في UTF8.

وماذا أقترح عدد 2 السبل الممكنة

1) حاول استخدام أوراكل مقدمي البيانات الأصلي ل. NET (ODP.NET). قد يكون هناك خلل / الميزة في System.Data.OracleClient مكتبة مايكروسوفت أن هذا المحول لا تدعم تلقائيا تحويل WE8ISO8859P1 إلى يونيكود. هنا هو وجود صلة لODP.NET

وآمل أن يكون هناك دعم لهذا الترميز في ODP (ولكن القول صحيح أنني لم تحديد هذا، فمن مجرد اقتراح)

2) الحل: في مجموعة بيانات، يجب عليك إنشاء حقل ثنائي (تعيينها إلى حقل جدول الأصلي)، وحقل سلسلة (لم يتم تعيين إلى قاعدة البيانات). عند تحميل البيانات إلى مجموعة البيانات، تكرار لكل صف وperfrom التحويل من مجموعة الثنائية إلى سلسلة.

ويجب أن يكون الرمز شيئا من هذا القبيل

Encoding e = Encoding.GetEncoding("iso-8859-1");
foreach(DataRow row in dataset.Tables["MyTable"])
{
    if (!row.IsNull("MyByteArrayField"))
        row["MyStringField"] = e.GetString((row["MyByteArrayField"] as byte[]));
}
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top