الرجوع إلى نفس اسم الجدول في مخططات مختلفة

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

  •  09-06-2019
  •  | 
  •  

سؤال

أواجه مشكلة مع Oracle Query في تطبيق Windows المستند إلى .net 2.0.انا استخدم System.Data.OracleClient للاتصال بقاعدة بيانات أوراكل.اسم قاعدة البيانات هو myDB.أسفل سلسلة الاتصال التي أستخدمها:

Data Source=(DESCRIPTION =(ADDRESS_LIST =(ADDRESS = (PROTOCOL = TCP)
(HOST =  172.16.0.24)(PORT = 1522)))(CONNECT_DATA =(SERVICE_NAME = ORCL)));
User ID=myDB;Password=myDB;Unicode=True

إذا قمت بتشغيل الاستعلام أدناه فسوف يعطيني نتيجة خاطئة (هنا النتيجة الخاطئة تعني بيانات غير صحيحة.البيانات لا تنتمي إلى myDB):

SELECT ID, NAME  
FROM MyTempTable
WHERE ID IN (10780, 10760, 11890)

ولكن إذا قمت بإلحاق اسم قاعدة البيانات معه فإنه يعطي النتيجة الصحيحة:

SELECT ID, NAME
FROM "myDB".MyTempTable
WHERE ID IN (10780, 10760, 11890)

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

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

المحلول

يبدو أن هذه مشكلة في تحليل الاسم، حاول إنشاء مرادف عام في الجدول:

إنشاء مرادف عام MyTempTable ل MyTempTable;

وأيضا ماذا تقصد بالضبط نتيجة خاطئة, ، بيانات غير صحيحة، رسالة خطأ؟


يحرر:ما اسم المخطط الذي ينتمي إليه الجدول المطلوب؟يبدو أن الجدول الذي تحاول الاختيار منه موجود في مخطط مختلف عن الجدول الذي ينتمي إلى المستخدم الذي تتصل به.

نصائح أخرى

عند الاتصال بقاعدة البيانات قضية صباحا

ALTER SESSION SET CURRENT_SCHEMA=abc;

حيث abc هو المستخدم الذي يملك الجداول.

بالنسبة للمبتدئين، أود أن أقترح عليك استخدام موفري بيانات .net من Oracle - إذا كان ذلك ممكنًا.إذا كنت تبدأ في مشروع ما، فسيكون ذلك أفضل طريقة لتوفير المزيد من الألم على نفسك.يمكنك الحصول عليهم من هنا

للتوسع في ما قاله stjohnroe، يبدو أن السبب وراء حصولك على نتائج مختلفة هو وجود جدولين مختلفين بنفس الاسم في مخططات مختلفة.
من خلال إضافة اسم مستخدم myDB إلى مقدمة الاستعلام، يمكنك الآن الوصول إلى الجدول الذي يحتوي على البيانات التي تتوقعها.(بما أنك تقول أن البيانات لا تنتمي إلى "myDB"، فهذا يعني على الأرجح أن التطبيق/المنتج الذي يكتب البيانات يكتب إلى الجدول الخطأ أيضًا).
القرار هو:
1.إذا كان الجدول لا ينتمي حقًا إلى "myDB"، فقم بإسقاطه من أجل الترتيب (الآن قد تحصل على أخطاء 904 لم يتم العثور على الجدول عند تشغيل التعليمات البرمجية الخاصة بك)
2.أنشئ مرادفًا للمخطط والجدول الذي تريد حقًا الوصول إليه (على سبيل المثال، CREATE SYNONYM myTable FOR aschema.myTable؛)
3.لا تنس منح حقوق الوصول من المخطط الذي يملك الجدول (على سبيل المثال:منح التحديد والإدراج والحذف على myTable إلى myDB؛(هنا يشير myDB إلى المستخدم/المخطط))

حاول إضافة

CONNECT_DATA=(SID=myDB)(SERVICE_NAME=ORCL)

في سلسلة الاتصال.

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