ผู้ให้บริการเข้ากันไม่ได้กับเวอร์ชันของไคลเอนต์ Oracle


157

ฉันกำลังพยายามใช้Oracle ODP.NET 11g (11.1.0.6.20) ไคลเอ็นต์ทันใจในโครงการ ASP.net ของฉันในฐานะผู้ให้บริการข้อมูลแต่เมื่อฉันเรียกใช้หน้า aspx ฉันได้รับ " ผู้ให้บริการไม่รองรับเวอร์ชันข้อความแสดงข้อผิดพลาด " ของลูกค้า Oracle ความช่วยเหลือใด ๆ ที่จะได้รับการชื่นชม

ฉันได้อ้างอิงผู้ให้บริการข้อมูลใน Visual Studio 2005 และรหัสที่อยู่เบื้องหลังมีลักษณะดังนี้:

using Oracle.DataAccess.Client;
..

OracleConnection oOracleConn = new OracleConnection();
oOracleConn.ConnectionString =
    "Data Source=MyOracleServerName;" +
    "Integrated Security=SSPI";
oOracleConn.Open();

//Do Something

oOracleConn.Close();

ข้อผิดพลาดสำหรับหน้ามีลักษณะดังนี้:

Exception Details: Oracle.DataAccess.Client.OracleException: The provider is not compatible with the version of Oracle client

Source Error: 
Line 21: 
Line 22: 
Line 23:             OracleConnection oOracleConn = new OracleConnection();
Line 24:             oOracleConn.ConnectionString =
Line 25:                 "Data Source=MyOracleServerName;" +

[OracleException (0x80004005): The provider is not compatible with the version of Oracle client]
   Oracle.DataAccess.Client.OracleInit.Initialize() +494
   Oracle.DataAccess.Client.OracleConnection..cctor() +483

Stack Trace: 
[TypeInitializationException: The type initializer for 'Oracle.DataAccess.Client.OracleConnection' threw an exception.]
   Oracle.DataAccess.Client.OracleConnection..ctor() +0
   Boeing.IVX.Web.RoyTesting.Page_Load(Object sender, EventArgs e) in C:\Documents and Settings\CE218C\Desktop\IVX.Net\Web\IVX\RoyTesting.aspx.cs:23
   System.Web.Util.CalliHelper.EventArgFunctionCaller(IntPtr fp, Object o, Object t, EventArgs e) +15
   System.Web.Util.CalliEventHandlerDelegateProxy.Callback(Object sender, EventArgs e) +33
   System.Web.UI.Control.OnLoad(EventArgs e) +99
   System.Web.UI.Control.LoadRecursive() +47
   System.Web.UI.Page.ProcessRequestMain(Boolean includeStagesBeforeAsyncPoint, Boolean includeStagesAfterAsyncPoint) +1436

คำตอบ:


91

ฉันได้รับการตรวจสอบปัญหานี้ต่อไปและคุณเพียงแค่ต้องคว้า DLL ที่เหมาะสมทั้งหมดจาก ODP.Net รุ่นดาวน์โหลดที่เหมือนกันและวางไว้ในโฟลเดอร์เดียวกับไฟล์ exe ของคุณเพราะ ODP.Net ยุ่งเกี่ยวกับการไม่ผสม หมายเลขรุ่น

ฉันได้อธิบายวิธีการทำที่นี่: http://splinter.com.au/using-the-new-odpnet-to-access-oracle-from-c นี่คือส่วนสำคัญของมันแม้ว่า:

  • ดาวน์โหลด ODP.Net
  • แตกไฟล์
  • เปิดเครื่องรูด JAR ทั้งหมดที่อยู่ในนั้น
  • คว้า dll เหล่านี้ที่เพิ่งซิป:
    • oci.dll (เปลี่ยนชื่อจาก 'oci.dll.dbl')
    • Oracle.DataAccess.dll
    • oraociicus11.dll
    • OraOps11w.dll
    • orannzsbb11.dll
    • oraocci11.dll
    • ociw32.dll (เปลี่ยนชื่อจาก 'ociw32.dll.dbl')
  • ใส่ DLLs ทั้งหมดไว้ในโฟลเดอร์เดียวกับ C # Executionable ของคุณ

4
โซลูชันของคุณใช้งานได้สำหรับฉัน - พบโพสต์บล็อกของคุณก่อนที่ฉันจะพบสิ่งนี้ คุณคือผู้ชาย ขอบคุณ! :-) นอกจากนี้การใช้ ODAC เวอร์ชันล่าสุดฉันไม่จำเป็นต้องแตกไฟล์ JAR ใด ๆ ... ไฟล์. dll นั้นอยู่ในไดเรกทอรีต่าง ๆ ในบ้านของ Oracle ค้นหาหน้าต่างง่าย ๆ เปิดขึ้นมาอย่างรวดเร็ว
Pandincus

10
นอกจากนี้ฉันใช้ ODAC รุ่นล่าสุด (11.2.0.1.2) บนเครื่องพัฒนาของฉันและไฟล์เดียวที่ฉันต้องการคือ oci.dll, Oracle.DataAccess.dll, oraociei11.dll, OraOps11w.dll ในฐานะที่เป็นคริสชี้ให้เห็นว่าพวกเขาอยู่ในโฟลเดอร์เดียวกันในฐานะที่เป็นของคุณ ;-)
Pandincus

1
เสียงเหมือนเวอร์ชั่นที่ใหม่กว่าช่วยให้ค้นหา dll ได้ง่ายขึ้น ที่ดี! ตอนนี้วิธีที่ยาวจนม้วน oracle พวกเขาเข้าไปใน dll ง่ายๆ ...
คริส

กลยุทธ์ของ Chris และชุดห้องสมุดของ Pandincus นั้นเหมาะกับฉัน ฉันกำลังเรียกลูกค้าออราเคิลผ่าน PowerShell ดังนั้นฉันจึงใส่ชุดไลบรารีในไดเรกทอรีที่ปฏิบัติได้ของ PowerShell
quillbreaker

1
คุณอาจจะใช้ C # การจัดการคนขับรถวันนี้ถ้าคุณสามารถ :)
คริส

47

คุณควร "เพิกเฉย" x86 / x64 ทั้งหมดคุยที่นี่เพื่อเริ่มและลองใช้ ODP.NET Managed Driver แทน (ถ้าคุณใช้. Net v4 +):

https://www.nuget.org/packages/Oracle.ManagedDataAccess/

https://www.nuget.org/packages/Oracle.ManagedDataAccess.EntityFramework/

Oracle ODP.net Managed vs Unmanaged Driver

หลีกเลี่ยงการ "ไม่ได้รับการจัดการ" ทั้งหมดใน DLL ปัญหาเกี่ยวกับสถาปัตยกรรม! : D (ประมาณเวลาของ Oracle)

แพ็คเกจ NuGet (ใช้งานได้ 11 กรัม):

ป้อนคำอธิบายรูปภาพที่นี่

วิธีเก่า / คู่มือ:

สำหรับข้อมูลเกี่ยวกับวิธีแปลงเป็นโดยใช้ไลบรารีที่ได้รับการจัดการ :

  • ก่อนอื่นนี่คือการเปรียบเทียบรหัสที่ยอดเยี่ยมของการจัดการ vs unmanaged : http://docs.oracle.com/cd/E51173_01/win.122/e17732/intro005.htm#ODPNT148
  • ตรวจสอบให้แน่ใจว่าคุณได้ดาวน์โหลดODP.NET เวอร์ชัน Managed Driver Xcopy เท่านั้น
  • จากไฟล์ zip ที่ดาวน์โหลดให้คัดลอกและวางลงในไดเรกทอรีโครงการของคุณ:
    • Oracle.ManagedDataAccessDTC.dll
    • Oracle.ManagedDataAccess.dll
  • เพิ่มการอ้างอิงถึงOracle.ManagedDataAccess.dll
  • ให้แน่ใจว่า exe ของคุณถูกปล่อยออกมา (เพิ่มไปยังApplication Folderใน VS2010) พร้อมทั้งที่กำลัง

3
ข่าวดีว่าในที่สุดออราเคิลก็มีไดร์เวอร์ที่มีการจัดการอย่างสมบูรณ์ ลองดูว่า 100mb dll นั้นเป็นภาระที่แท้จริง
Jafin

1
โปรแกรมควบคุมการบริหารจัดการการทำงานที่ดีสำหรับฉัน - ฉันไม่มีปัญหานับตั้งแต่ย้ายไปอยู่กับมัน / คุณสามารถตั้งค่าโครงการของคุณกลับไป AnyCPU ฯลฯ และการทำงานที่ดี :)
ท็อดทอมสัน

5
เพื่อให้ทุกคนตระหนักในขณะที่ผู้ให้บริการที่มีการจัดการดี แต่ขาดคุณสมบัติมากมายที่ผู้ให้บริการเต็มรูปแบบอนุญาต กล่าวคือการเข้ารหัสในตัวของออราเคิล
Justin Skiles

1
เอกสารของ Oracle มีแนวโน้มที่จะ "กระจัดกระจาย" เพื่อพูดให้น้อยที่สุด นี่คือการเชื่อมโยงที่ดีในบางส่วนวิธีการได้รับการสนับสนุน นอกจากนี้ไดรเวอร์ยังมาพร้อมกับreadmeข้อ จำกัด บางประการ
Justin Skiles

2
การใช้ไดรเวอร์ที่มีการจัดการเป็นทางออกสุดท้าย! ฉันเป็น nitghtmare ทุกครั้งที่ฉันคิดว่าเวลาที่ใช้ไปเมื่อฉันมีประเภทไม่ตรงกัน
ettore ct

35

ผมติดตั้งเพียงผู้ให้บริการ Oracle Data สำหรับ NET 2.0 (11.1.0.6.20)และผมไม่ได้ติดตั้งไคลเอ็นต์ Oracle Instant (11.1.0.6.0)

ฉันเพิ่งติดตั้งและข้อผิดพลาดหายไป!


3
คุณสามารถคัดลอก DLL ไคลเอ็นต์ด่วน 4 รายการลงในโฟลเดอร์เดียวกับ EXE ของคุณแทนที่จะติดตั้งไคลเอ็นต์ได้หรือไม่ (ไฟล์เหล่านี้: oci.dll orannzsbb11.dll oraocci11.dll oraociicus11.dll)
คริส

2
@Chris: ใช่คุณทำได้ จากประสบการณ์ของฉันคุณต้อง oci.dll, orannzsbb11.dll, oraociicus11.dll, oraops11w.dll และ oracle.dataaccess.dll
Pakman

วิธีอื่น ๆ สำหรับฉัน - ฉันติดตั้งไคลเอนต์ แต่ไม่ใช่ผู้ให้บริการ
Ev

33

ปัญหานี้อาจเกิดจากการรันรันไทม์ 64 บิต. NET กับไคลเอ็นต์ Oracle 32 บิต สิ่งนี้อาจเกิดขึ้นได้หากเซิร์ฟเวอร์ของคุณที่คุณใช้งานแอพอยู่นั้น 64 บิต มันจะเรียกใช้แอป. NET ด้วยรันไทม์ 64 บิต คุณสามารถตั้งค่าสถานะ CPU ในโครงการของคุณใน VS เพื่อให้ทำงานในรันไทม์ 32 บิต


เพิ่งวิ่งเข้าไปในนี้ ทำงานในแอปทดสอบ (32 บิต) แล้วล้มลงใน IIS แทนที่จะต้องการชุดประกอบทั้งหมดที่เกี่ยวข้องเป็น 32 บิตฉันเปลี่ยนเป็น AppPool 32 บิต
anton.burger

22

มาสรุปกันบ้าง:

ข้อความแสดงข้อผิดพลาด"ผู้ให้บริการเข้ากันไม่ได้กับเวอร์ชันของไคลเอ็นต์ Oracle"อาจเกิดจากหลายสาเหตุ

  • คุณไม่ได้ติดตั้ง Oracle Client ในกรณีนี้ข้อความแสดงข้อผิดพลาดทำให้เข้าใจผิดอย่างแน่นอน

    ผู้ให้บริการข้อมูลของ Oracle สำหรับ. NET (ODP.NET, เช่นไฟล์Oracle.DataAccess.dll) ไม่รวมอยู่ใน Oracle Instant Client จะต้องติดตั้งแยกต่างหาก (ดาวน์โหลดจากคอมโพเนนต์การเข้าถึงข้อมูล Oracle 32 บิต (ODAC)หรือคอมโพเนนต์การเข้าถึงข้อมูล Oracle 64 บิต ( ดาวน์โหลด ODAC) ) หรือคุณต้องเลือกตามตัวเลือกใน Oracle Universal Installer (OUI)

    หมายเหตุเมื่อติดตั้ง Oracle Data Provider> = 12.1 ผู้ให้บริการจะไม่ลงทะเบียนโดยอัตโนมัติใน GAC คุณต้องลงทะเบียนด้วยตนเองหากจำเป็นดูออราเคิลหมอ2,272,241.1

  • เวอร์ชันของ ODP.NET ไม่ตรงกับเวอร์ชันของไคลเอ็นต์ของ Oracle ที่ติดตั้ง คุณต้องตรวจสอบแม้กระทั่งหมายเลขรุ่นรอง! ตัวอย่างเช่นOracle.DataAccess.dllรุ่น4.112.3.0กันไม่ได้กับไคลเอ็นต์ของ Oracle 11.2.0.4 ตรวจสอบเวอร์ชั่นของ ODP.NET และ Oracle Client อย่างละเอียด คุณสามารถใช้sigcheck on oraociei*.dllและ / หรือOraOps*w.dllรับเวอร์ชันของ Oracle Client

    ระวังรูปแบบการกำหนดหมายเลขที่แตกต่างกัน รุ่นของแฟ้ม4.112.3.0หมายถึง: .NET Framework รุ่น 4, Oracle วางจำหน่าย 11.2.0.3.x

    มีรุ่น ODP.NET "1.x", "2.x" และ "4.x" ตัวเลขเหล่านี้เกี่ยวข้องกับ Microsoft .NET Framework เวอร์ชัน 1.0.3705 / 1.1.4322, 2.0.50727 และ 4.0.30319 รุ่น "1.x" มีให้บริการจนกว่า Oracle Client 11.1 เวอร์ชัน "4.x" ได้รับการแนะนำกับ Oracle Client 11.2

  • สถาปัตยกรรม (32 บิตหรือ 64 บิต) ของ ODP.NET ไม่ตรงกับสถาปัตยกรรมแอปพลิเคชันของคุณ แอปพลิเคชั่น 32 บิตทำงานได้กับ 32 บิต Oracle Client / ODP.NET ตามลำดับแอปพลิเคชัน 64 บิตต้องการ 64 บิต Oracle Client / ODP.NET (ยกเว้นว่าคุณใช้ODP.NET Managed Driver )

  • รุ่น. NET Framework ไม่ตรงกัน ตัวอย่างเช่นถ้าคุณรวบรวมแอปพลิเคชันของคุณด้วย Target .NET Framework 2.0 คุณจะไม่สามารถใช้ ODP.NET เวอร์ชัน 4.x เวอร์ชันเป้าหมาย. NET Framework ต้องเท่ากับหรือสูงกว่ารุ่น ODP.NET

  • เวอร์ชันของOracle.DataAccess.dllบนเครื่องที่กำลังพัฒนาของคุณ (เช่นเวอร์ชันที่โหลดขณะรวบรวม) สูงกว่าเวอร์ชันบนเครื่องเป้าหมาย

  • โปรดทราบว่าOracle.DataAccess.dllอาจโหลดจากGACซึ่งโดยค่าเริ่มต้นจะมีความสำคัญมากกว่าไฟล์ใด ๆ ที่ให้ไว้ในเครื่อง

โซลูชั่น

  • พิจารณาที่จะใช้ ODP.NET การจัดการไดร์เวอร์ก็สามารถดาวน์โหลดได้จาก Oracle หน้านี้: 64 บิตของ Oracle Data Access คอมโพเนนต์ (ODAC) ดาวน์โหลด คุณเพียงคัดลอกOracle.ManagedDataAccess.dllไฟล์ไปยังไดเรกทอรีแอปพลิเคชันของคุณไม่จำเป็นต้องมีอะไรอีก มันทำงานได้ทั้ง 32 บิตและ 64 บิต

  • ในการตอบ*.csprojสนองของคุณ *.vbprojแก้ไขการอ้างอิงของคุณไปยัง ODP.NET ดังนี้:

    <Reference Include="Oracle.DataAccess">
      <SpecificVersion>False</SpecificVersion>
      <Private>False</Private>
    </Reference>

    คุณสมบัติเช่นVersion=...หรือprocessorArchitecture=...ไม่จำเป็นต้องใช้ แอปพลิเคชันของคุณจะโหลดถูกต้องOracle.DataAccess.dllขึ้นอยู่กับสถาปัตยกรรมที่เลือกและเป้าหมาย. NET Framework (โดยมีการติดตั้งอย่างถูกต้อง) -> ไม่ผ่านการตรวจสอบ 100%

  • ในกรณีที่คุณไม่ทราบเวอร์ชันของ Oracle Client บนเครื่องเป้าหมาย (เช่นอาจเป็นเครื่องของลูกค้าของคุณ): ไปที่หน้าดาวน์โหลดที่กล่าวถึงข้างต้นและดาวน์โหลดส่วนประกอบ Oracle Data Access เวอร์ชันXCopyอย่างน้อยที่สุด แตกไฟล์ zip และคัดลอกOracle.DataAccess.dllไฟล์ไปยังเครื่องของคุณ ในโครงการ VS ของคุณทำการอ้างอิงถึง DLL นี้ (ที่ล้าสมัยมากที่สุด) รุ่นของ DLL นี้เป็นรุ่นที่น้อยที่สุดของ ODP.NET แอปพลิเคชันของคุณจะทำงานด้วย เมื่อคุณเรียกใช้แอปพลิเคชันของคุณนโยบายผู้เผยแพร่ใน GAC จะเปลี่ยนเส้นทางไปเป็นเวอร์ชันที่ติดตั้งจริง

  • ฉันไม่คิดว่ามันเป็นวิธีที่ชาญฉลาดในการใช้ DLL เดี่ยวและคัดลอกไปยังโฟลเดอร์บางโฟลเดอร์ อาจใช้งานได้กับเครื่อง "เปล่า" แต่หากเครื่องเป้าหมายของคุณติดตั้งผลิตภัณฑ์ใด ๆ ของออราเคิลจะมีความเสี่ยงสูงสำหรับเวอร์ชันที่ไม่ตรงกัน ถอนการติดตั้งผลิตภัณฑ์ Oracle ใด ๆ จากเครื่องของคุณและทำการติดตั้งใหม่ ดูที่วิธีถอนการติดตั้ง / ลบ Oracle 11g (ไคลเอ็นต์) อย่างสมบูรณ์หรือไม่ เพื่อที่จะได้เครื่องจักรที่สะอาดจริงๆ

  • ในกรณีที่คุณต้องทำงานกับแอพพลิเคชั่น 32 บิตและ 64 บิตในเวลาเดียวกันให้ทำตามคำแนะนำนี้เพื่อติดตั้งทั้งสองเวอร์ชันในเครื่องเดียว:

สมมติฐาน: Oracle Home ถูกเรียกใช้OraClient11g_home1, เวอร์ชันไคลเอ็นต์คือ 11gR2

  • เลือกลบไคลเอ็นต์ Oracle ใด ๆ ที่ติดตั้ง

  • ดาวน์โหลดและติดตั้ง Oracle x86 Client เช่น C:\Oracle\11.2\Client_x86

  • ดาวน์โหลดและติดตั้ง Oracle x64 Client ลงในโฟลเดอร์อื่นเช่น C:\Oracle\11.2\Client_x64

  • เปิดเครื่องมือบรรทัดคำสั่งไปที่โฟลเดอร์% WINDIR% \ System32 โดยทั่วไปแล้วC:\Windows\System32สร้างลิงก์สัญลักษณ์ora112ไปยังโฟลเดอร์C:\Oracle\11.2\Client_x64(ดูด้านล่าง)

  • เปลี่ยนเป็นโฟลเดอร์% WINDIR% \ SysWOW64 โดยทั่วไปแล้วC:\Windows\SysWOW64สร้างลิงก์สัญลักษณ์ora112ไปยังโฟลเดอร์C:\Oracle\11.2\Client_x86(ดูด้านล่าง)

  • ปรับเปลี่ยนPATHตัวแปรสภาพแวดล้อมแทนที่รายการที่ทุกคนชอบC:\Oracle\11.2\Client_x86และC:\Oracle\11.2\Client_x64โดยC:\Windows\System32\ora112, ตน\binโฟลเดอร์ย่อย หมายเหตุ: C:\Windows\SysWOW64\ora112ต้องไม่อยู่ในสภาพแวดล้อม PATH

  • หากจำเป็นต้องตั้งค่าORACLE_HOMEตัวแปรสภาพแวดล้อมเล็กน้อยเป็นC:\Windows\System32\ora112

  • เปิดตัวแก้ไขรีจิสทรีของคุณ ตั้งค่ารีจิสทรีHKLM\Software\ORACLE\KEY_OraClient11g_home1\ORACLE_HOMEเป็นC:\Windows\System32\ora112

  • ตั้งค่ารีจิสทรีHKLM\Software\Wow6432Node\ORACLE\KEY_OraClient11g_home1\ORACLE_HOMEเป็นC:\Windows\System32\ora112(ไม่C:\Windows\SysWOW64\ora112)

  • คุณทำเสร็จแล้ว! ตอนนี้คุณสามารถใช้ไคลเอนต์ Oracle x86 และ x64 ได้อย่างกลมกลืนเช่นแอพพลิเคชั่น x86 จะโหลดไลบรารี่ x86 แอพพลิเคชั่น x64 โหลดไลบรารี่ x64 โดยไม่ต้องทำการดัดแปลงใด ๆ เพิ่มเติมในระบบของคุณ

คำสั่งเพื่อสร้างลิงก์สัญลักษณ์:

cd C:\Windows\System32
mklink /d ora112 C:\Oracle\11.2\Client_x64
cd C:\Windows\SysWOW64
mklink /d ora112 C:\Oracle\11.2\Client_x86

หมายเหตุบางส่วน:

  • ora112ทั้งการเชื่อมโยงสัญลักษณ์ต้องมีชื่อเดียวกันเช่น

  • ในกรณีที่คุณต้องการติดตั้ง ODP.NET ด้วยตนเองหลังจากนั้นให้ระมัดระวังในการเลือกโฟลเดอร์ที่เหมาะสมสำหรับการติดตั้ง

  • แม้จะมีโฟลเดอร์ชื่อของพวกเขาC:\Windows\System32มีห้องสมุด x64 ในขณะที่C:\Windows\SysWOW64มีห้องสมุดx86 (32- บิต) อย่าสับสน

  • บางทีมันอาจจะเป็นตัวเลือกที่ชาญฉลาดในการตั้งค่าของTNS_ADMINตัวแปรสภาพแวดล้อม (resp. TNS_ADMINรายการใน Registry) TNS_ADMIN=C:\Oracle\Common\networkไปยังสถานที่ที่พบบ่อยเช่น


IMO นี้มีความรู้มากกว่าที่จะตอบมากกว่าคำตอบที่แท้จริง ดังนั้นถ้าฉันมีแอพพลิเคชั่น x86 สำหรับ. net 4 และเวอร์ชันฐานข้อมูลอยู่ใน 9i ดังนั้นเวอร์ชันไคลเอ็นต์ใดที่ผู้ใช้จะต้องมีหากพวกเขามี Windows 32 หรือ 64 บิต ออราเคิลกล่าวว่าลูกค้าทุกรุ่นสามารถทำงานร่วมกับ db เวอร์ชันใด ๆ ได้ คำตอบสำหรับผู้ใช้ 32- บิตคือการติดตั้งเวอร์ชั่น 32- บิตและผู้ใช้ 64- บิตติดตั้งเวอร์ชั่น 64- บิตและใช้ ODP.NET Managed Driver เพื่อตัดสินใจว่าระบบปฏิบัติการใดที่ใช้อยู่
Luminous

1
เมื่อคุณใช้ไดรเวอร์ที่มีการจัดการ ODP.NET นั้นไม่จำเป็นต้องติดตั้งไคลเอนต์ Oracle ใด ๆ ซึ่งเป็นข้อได้เปรียบหลักของมัน ใช้งานได้กับทั้งแอปพลิเคชั่น x86 และ x64 หากไม่มี "ODP.NET Managed Driver" แอปพลิเคชัน x86 จะต้องมีไคลเอ็นต์ Oracle x86 (เช่น 32 บิต) ไม่ว่าสถาปัตยกรรมเซิร์ฟเวอร์ฐานข้อมูลจะเป็นอะไรก็ตาม
Wernfried Domscheit

ฉันเพิ่งพบกับ "Microsoft Visual C ++ 2010 Redistributable ต้องได้รับการติดตั้ง" - คุณควรเพิ่มเข้าไปในข้อมูลสรุปของคุณ
Jay Sullivan

1
ฉันไม่คิดว่าข้อผิดพลาดนี้เกี่ยวข้องหรือเกิดจาก Oracle หรือ ODP.NET
Wernfried Domscheit

มันใช้งานได้สำหรับฉันฉันติดตั้งOracle.DataAccess.dllจากแพ็คเกจ nuget Oracle.DataAccess.x86และ Dll Version คือ2.112.1.0ดังนั้นฉันจึงจับคู่การติดตั้ง Oracle Client กับรุ่นที่Oracle Database 11g Release 2 Client (11.2.0.1.0) for Microsoft Windows (x64) นี่ แล้วแก้ไขปัญหาได้!
yu yang Jian

6

หลังจากการแก้ไขปัญหาหลายชั่วโมงฉันพบปัญหานี้เกิดจากการมี Oracle.DataAccess.dll (v4.0) ในไดเรกทอรี bin โครงการของฉัน แต่รันไทม์ยังโหลด Oracle.DataAccess.dll (v2.x) จาก GAC การลบและอ่านรายการ Oracle.DataAccess ในการอ้างอิงโครงการแก้ปัญหาให้ฉันได้

ไฟล์อื่น ๆ ที่กล่าวถึงที่นี่ดูเหมือนจะไม่จำเป็นในสถานการณ์ของฉัน

UPDATE

สาเหตุหลักของข้อผิดพลาด "ตัวให้บริการไม่เข้ากันได้กับรุ่นของไคลเอนต์ Oracle" คือ (โดยทั่วไป) ว่าแอสเซมบลีที่ได้รับการจัดการกำลังพยายามโหลดไลบรารีที่ไม่มีการจัดการซึ่งไม่ตรงกับรุ่น ดูเหมือนว่าคุณสามารถบังคับให้ไดรเวอร์ Oracle ใช้ไลบรารีที่ถูกต้องได้โดยระบุเส้นทางของไลบรารีใน web.config 1

<configuration>
  <oracle.dataaccess.client>
    <settings>
      <add name="DllPath" value="C:\oracle\bin"/>
      <!-- ... -->
    </settings>
  </oracle.dataaccess.client>
</configuration>

ขอบคุณ! วิธีการแก้ปัญหาของคุณทำให้ฉันมีความคิดที่ทำงานหลังจาก 2 วัน (ฉันมี Visual Studio 2010 Net 4, ไคลเอนต์ Oracle 10g) ... ฉันเห็น GAC และแน่นอนฉันได้ติดตั้ง 3 จุดของ Oracle.DataAccess.dll ฉันถอนการติดตั้งทั้งหมด (และ ลบ machine.config keys ที่ไม่ถูกต้องใน "DbProviderFactories") และติดตั้งใหม่เฉพาะ ODAC1120320 x64 และมันใช้งานได้
Hernaldo Gonzalez

5

ติดตั้ง ODP.Net บนเครื่องเป้าหมายและควรแก้ปัญหา ... การคัดลอก dll ไม่ได้เป็นความคิดที่ดี ...


5

สำหรับ Oracle 11g (11.1.0.7.20) ฉันต้องเพิ่ม DLLs ต่อไปนี้พร้อมกับ exe เพื่อทำงาน

  1. oci.dll
  2. OraOps11w.dll
  3. oraociicus11.dll (สวยมากใกล้ 30mb)
  4. Oracle.DataAccess.dll

คุณต้องการที่จะพูด 130 MB
Elmue

2

สำหรับฉันแล้วดูเหมือนว่าคุณมี ODP กับ Oracle Istant Client แต่ ODP อาจพยายามใช้ Oracle Client จริงแทน คุณมีไคลเอ็นต์ Oracle มาตรฐานติดตั้งอยู่ในเครื่องด้วยหรือไม่ ฉันจำได้ว่า Oracle ค่อนข้างพิถีพิถันเมื่อพูดถึงลูกค้าหลายรายในเครื่องเดียวกัน


2

ฉันมีปัญหาเดียวกันแน่นอน ฉันลบ (และลืมว่าฉันลบ) oraociei11.dll หลังจากรวบรวมแอปพลิเคชัน และมันก็ให้ข้อผิดพลาดนี้ในขณะที่พยายามที่จะดำเนินการ ดังนั้นเมื่อมันไม่สามารถหา dll ที่ oraociei11.dll มันจะแสดงข้อผิดพลาดนี้ อาจมีกรณีอื่นเมื่อให้ข้อผิดพลาดนี้ แต่ดูเหมือนว่าจะเป็นหนึ่งในนั้น


2

นอกจากนี้ให้มองหา IIS Application pool เปิดใช้งานการตั้งค่าสถานะจริงหรือเท็จ 32- บิตเมื่อคุณเห็นข้อความนี้ฟอรัม oracle บางฟอรัมจะแนะนำสิ่งนี้ให้ฉัน!


2

ฉันมีปัญหาเดียวกัน แต่ในกรณีของฉันฉันไม่สามารถคัดลอก dlls ลงในโฟลเดอร์ bin ได้ฉันแค่ 'rebind' เวอร์ชันแอสเซมบลีเท่านั้น

<?xml version="1.0" encoding="utf-8" ?>
<configuration>
  <runtime>    
    <assemblyBinding xmlns="urn:schemas-microsoft-com:asm.v1">
      <dependentAssembly>
        <assemblyIdentity name="Oracle.DataAccess" publicKeyToken="89B483F429C47342" culture="neutral"/>
        <bindingRedirect oldVersion="2.112.2.0" newVersion="2.112.1.0"/>
      </dependentAssembly>
    </assemblyBinding>
  </runtime>
</configuration>

2

นี่คือสิ่งที่ฉันได้ทำเพื่อแก้ปัญหานี้ซึ่งคงอยู่นาน 3 ชั่วโมง:

  1. ภายใต้บ้านของ Oracle ตั้งอยู่ที่C:\oracle\product\11.2.0ฉันมีโฟลเดอร์ชื่อclient_1ที่ฉันเคยติดตั้งODP.NETบิตสำหรับ Windows 64 บิตมาก่อน

  2. ต่อมาในขณะที่พยายามดีบักแอพ ASP.NET Web API ด้วย Visual Studio 2012 ฉันได้รับข้อความแสดงข้อผิดพลาดต่อไปนี้: ผู้ให้บริการไม่สามารถทำงานร่วมกับเวอร์ชันของไคลเอนต์ Oracleได้

  3. กำลังค้นหา Google ฉันพบว่าสิ่งนี้เกิดขึ้นเพราะฉันใช้ODP.NET64 บิต จากนั้นฉันก็คว้าODP.NETบิต Windows 32 แล้วติดตั้ง แต่ฉันก็ยังได้รับข้อความแสดงข้อผิดพลาดเหมือนเดิม

  4. SOLUTION:ลบโฟลเดอร์client_1และติดตั้งใหม่ODP.NET32 บิต ค่อนข้างตัวติดตั้งกำลังผสมบิตจากรุ่น 64 บิตกับรุ่น 32 บิต ไปคิด ...

  5. OracleConnectionตอนนี้ฉันมีความสุขอีกครั้งและผมสามารถเปิดใหม่ ในที่สุด! :)


2

สำหรับทุกคนที่ยังคงประสบปัญหานี้: อ้างอิงจากบทความนี้

http://oradim.blogspot.com/2009/09/odpnet-provider-is-not-compatible-with.html

ฉันพบว่าเซิร์ฟเวอร์ของฉันหายไปจาก Microsoft C ++ Visual Runtime Library - ฉันมีมันในเครื่อง dev เนื่องจากติดตั้ง Visual Studio ฉันดาวน์โหลดและติดตั้งไลบรารี่รุ่นล่าสุด (ปัจจุบัน) จากที่นี่:

http://www.microsoft.com/en-us/download/details.aspx?id=13523

เรียกใช้งานการตั้งค่าและการเรียกใช้ oracle จาก C # ทำให้เป็นจริง!


1
เพื่อน .... ออราเคิล .... เราจะคุยกันหน่อยได้ไหม? มานี่ตรงมุมนะ ฟังคนฉันใช้เวลาทั้งวันในการหาสิ่งที่นรก "ผู้ให้บริการที่ไม่เข้ากัน" ควรจะหมายถึงเพียงเพื่อหาในภายหลังว่าเป็นเพราะการพึ่งพาการติดตั้งบางอย่างไม่ได้พบกัน กรุณา - ไม่ใช่ - ฉันต้องการให้คุณทำการติดตั้งของคุณเพื่อตรวจสอบการพึ่งพาเหล่านี้ในเวลาการติดตั้งและเตือนผู้ใช้หากไม่ตรง ขอบคุณ
Jay Sullivan

3
โดยวิธีการที่ฉันต้องกลับมาที่คำถาม stackoverflow นี้หลายครั้งและคำตอบที่แตกต่างกับฉันทุกครั้ง สิ่งนี้ทำให้เสียเวลาและเงิน
Jay Sullivan

2

เวอร์ชัน TLDR:

  • ใช้ผู้ให้บริการที่มีการจัดการ 12c 100%แทน
  • หากคุณต้องใช้ผู้ให้บริการเก่าคุณจะต้องชี้ Oracle.DataAccess.dll ไปยัง Oracle Client Dlls ที่ไม่มีเวอร์ชันที่ถูกต้อง หากคุณมีหลายไคลเอนต์ Oracle ที่ติดตั้งในเครื่องของคุณซึ่งอาจเป็นเรื่องง่ายรวมถึงตัวแปรการกำหนดค่า "DllPath" (ดูด้านล่าง) ในแอปปรับแต่งของคุณ แต่คุณอาจต้องติดตั้ง oracle client ใหม่เพื่อชี้ไป

เวอร์ชันเต็ม:

อันดับแรกให้ตรวจสอบให้แน่ใจว่าเราเข้าใจองค์ประกอบของผู้ให้บริการที่ไม่มีการจัดการเก่า (ไม่ใช่ผู้ให้บริการที่ได้รับการจัดการใหม่ 12c 100%) มันประกอบด้วยสองชิ้น:

  1. คอมโพเนนต์. net ที่ได้รับการจัดการ - Oracle.DataAccess.dll
  2. ไคลเอ็นต์ที่ไม่มีการจัดการ (ไม่ใช่ --.net)

เพียงแค่พูดว่า Oracle.DataAccess.dll เกือบจะเป็นเพียงแค่ wrapper แปลคำสั่ง. net เป็นคำสั่ง ORACLE-NET สำหรับไคลเอ็นต์ที่ไม่มีการจัดการ

ที่กล่าวว่าเมื่อคุณโหลด Oracle.DataAccess จะมีคำสั่งที่จะพยายามค้นหาที่ไคลเอนต์ที่ไม่มีการจัดการที่ต้องการ จากเอกสาร Oracle :

Oracle.DataAccess.dll ค้นหา DLL ที่ไม่มีการจัดการที่ขึ้นต่อกัน (เช่นไคลเอนต์ Oracle) ตามลำดับต่อไปนี้:

1.Directory ของแอ็พพลิเคชันหรือเรียกใช้งานได้

2.DllPath การตั้งค่าที่ระบุโดย application config หรือ web.config

3.DllPath การตั้งค่าที่ระบุโดย machine.config

4.DllPath การตั้งค่าที่ระบุโดย Windows Registry

HKEY_LOCAL_MACHINE \ Software \ ออราเคิล \ ODP.NET \ รุ่น \ DllPath

5. ไดเรกทอรีที่ระบุโดยตัวแปรสภาพแวดล้อม Windows PATH

ดังนั้นในกรณีของคุณแอปของคุณทำตามขั้นตอนข้างต้นและพบเส้นทางที่ไม่มีการแก้ไข dll ที่เก่าเกินไปเมื่อเทียบกับแอสเซมบลี Oracle.DataAccess.dll ที่คุณใช้

อาจเป็นไปได้ว่าการติดตั้ง Oracle Client เดียวบนเครื่องนั้นเก่าเกินไป แต่สิ่งนี้เข้ามาเล่นถ้าคุณมีไคลเอนต์มากกว่าหนึ่งตัวติดตั้งบนเครื่องและพบว่าไฟล์ที่ไม่มีการจัดการถูกค้นพบครั้งแรกในการติดตั้งที่แตกต่างกัน แต่เก่ากว่า หากภายหลังสิ่งที่ต้องทำคือใช้ตัวแปรการกำหนดค่า dllPath ในการกำหนดค่าของคุณและชี้ไปที่โฟลเดอร์ Oracle Home Bin ที่ถูกต้อง:

<configuration>
  <oracle.dataaccess.client> 
    <add key="DllPath" value="c:\oracle\product\1.1.0-xcopy-dep\BIN"/>
  </oracle.dataaccess.client>
</configuration>

หากคุณต้องการติดตั้งสำเนาใหม่ของไคลเอนต์รุ่น xcopyมีขนาดเล็กที่สุดและมี "ลูกค้าทันที" และชี้ DllPath ด้านบนไปยังตำแหน่งใหม่นี้ แต่การติดตั้งไคลเอนต์ oracle จะใช้งานได้

แต่ถ้าคุณต้องการหลีกเลี่ยงปัญหาการแก้ไขปัญหาไคลเอนต์ที่ไม่มีการจัดการทั้งหมดให้ดูว่าคุณสามารถอัปเดตแอปของคุณเพื่อใช้ผู้ให้บริการที่มีการจัดการ 100% แทนได้หรือไม่

อาจเป็นไปได้ว่าคุณไม่ได้โหลด Oracle.DataAccess.dll ที่คุณคิดว่าติดตั้งอยู่ในไดเรกทอรี bin และ GAC ของคุณ แต่ฉันคิดว่านั่นเป็นรุ่นที่มีโอกาสน้อยกว่า ดูกระบวนการแก้ไขการชุมนุมสำหรับข้อมูลเพิ่มเติม


1

ผู้ใช้ IIS / IWAM มีสิทธิ์ในไดเรกทอรี Oracle หรือไม่ คุณสามารถเชื่อมต่อกับแหล่งข้อมูลนี้โดยใช้แอปอื่นเช่น Excel หรือ Access ได้หรือไม่


1

เรามีปัญหาเดียวกันเนื่องจากชุดประกอบ Oracle.Data.dll ในเครือข่ายที่ใช้ร่วมกันได้รับการปรับปรุงโดย DBA ของเรา การเอาการอ้างอิงออกจากโครงการและเพิ่มการแก้ไขปัญหาอีกครั้ง


1

เพียงสองขั้นตอนเพื่อแก้ไขปัญหานี้

  1. ไปที่การตั้งค่าแอปพลิเคชันล่วงหน้าและตั้งค่าสถานะ 'เปิดใช้งานแอปพลิเคชัน 32 บิต' เป็น True
  2. ตรวจสอบให้แน่ใจว่าที่กำลังทั้งหมดใน Bin ของคุณเป็นรุ่น 32 บิตในขณะนี้ ...

ขอให้โชคดี


@ mazhar-abbas คุณช่วยกรุณา ชี้ให้ฉันเห็นว่าฉันสามารถตั้งค่า 'เปิดใช้งานแอปพลิเคชัน 32 บิตได้อย่างไร มันอยู่ใน IIS หรือ Project?
hiFI

1

ฉันไม่ได้ไปตามเส้นทางเพื่อรับ DLL ใหม่ เรามีโครงการที่มีอยู่เดิมซึ่งทำงานได้อย่างสมบูรณ์แบบและเป็นเพียงโครงการใหม่ของฉันที่ทำให้ฉันปวดหัวดังนั้นฉันจึงตัดสินใจลองอย่างอื่น

โครงการของฉันถูกใช้พัฒนาภายใน Internal.dll ว่าขึ้นอยู่กับ v4.112.3.0Oracle.DataAccess.dll ด้วยเหตุผลบางอย่างเมื่อทำการเผยแพร่ Visual Studio จะอัปโหลดเสมอv4.121.0.0แม้ว่าจะไม่ได้ระบุไว้อย่างชัดเจนในไฟล์ปรับแต่งใด ๆ นั่นเป็นสาเหตุที่ฉันได้รับข้อผิดพลาด

ดังนั้นสิ่งที่ฉันทำคือ:

  1. คัดลอก Internal.dll จากหนึ่งในโครงการที่ประสบความสำเร็จในการเรียกใช้ไปยังเว็บไซต์ของฉัน/bin(เพื่อความปลอดภัย)
  2. คัดลอก Oracle.DataAccess.dll จากหนึ่งในโครงการที่ประสบความสำเร็จในการเรียกใช้ไปยังเว็บไซต์ของ/binฉัน
  3. เพิ่มการอ้างอิงถึงทั้งคู่จากเว็บไซต์ของฉัน
  4. สุดท้ายอ้างอิง Oracle.DataAccess ปรากฏตัวขึ้นในmyWebSite.csprojแต่มันก็แสดงให้เห็นว่าไม่ถูกต้องรุ่น: แทนv4.121.0.0v4.112.3.0
  5. ฉันเปลี่ยนการอ้างอิงด้วยตนเองmyWebSite.csprojดังนั้นตอนนี้จึงอ่าน:

    <Reference Include="Oracle.DataAccess, Version=4.112.3.0, Culture=neutral, PublicKeyToken=89b483f429c47342, processorArchitecture=x86">
      <SpecificVersion>False</SpecificVersion>
      <HintPath>bin\Oracle.DataAccess.dll</HintPath>
    </Reference> 

2
เป็นความคิดที่ดีจริงๆที่จะเพิ่มการอ้างอิงไปยัง Dll ในโฟลเดอร์ bin
Jay Sullivan

1
กระบวนการbinและobjโฟลเดอร์เป็นโฟลเดอร์ผลลัพธ์ นี่คือที่ที่ไปเมื่อคุณสร้างโครงการของคุณ คุณควรจะสามารถลบโฟลเดอร์เหล่านี้ได้ทุกเมื่อโดยไม่สร้างความขัดแย้ง โดยปกติโฟลเดอร์เหล่านี้จะถูกละเว้นในการควบคุมแหล่งที่มา แนวปฏิบัติมาตรฐานคือการสร้างExternal Referencesโฟลเดอร์ที่คุณใส่ DLLs อ้างอิงของคุณ
Jay Sullivan

@notfed ดูเหมือนว่าคุณพูดถูก จะเก็บเรื่องนี้ไว้ในใจของฉัน
Robotron

ตามชื่อมันเป็นเพียงคำใบ้เส้นทางสำหรับคอมไพเลอร์ไม่ใช่การอ้างอิงที่บังคับ ขั้นแรกให้ค้นหา GAC สำหรับ Oracle.DataAccess.dll มันควรจะทำงานแม้ว่าคุณจะลบHintPathทั้งหมด
Wernfried Domscheit

1

ฉันพบปัญหานี้หลังจากติดตั้ง Oracle Data Tools สำหรับ Visual Studio 2015 แล้วต่อสู้กับ Oracle เป็นชั่วโมงที่ดี ฉันตัดสินใจลองติดตั้งไคลเอนต์ Oracle อีกครั้งแทนที่จะยุ่งกับการคัดลอกไฟล์กำหนดค่าการเปลี่ยนแปลง ฯลฯ และใช้งานได้สำหรับฉัน


1

ฉันประสบปัญหาที่คล้ายกันและสาเหตุที่แท้จริงคือ GAC มี 2 oracle.dataaccess รุ่นเช่น v4.0_4.112.2.0 และ v4.0_4.112.4.0 แอปพลิเคชันของฉันอ้างอิง v4.0_4.112.2.0 ดังนั้นเมื่อฉันลบ v4.0_4.112.4.0 จาก GAC ออกไปมันก็ใช้ได้ดี

เส้นทาง GAC: C: \ Windows \ Microsoft.NET \ assembly \ GAC_64 \ Oracle.DataAccess

ก่อน: ป้อนคำอธิบายรูปภาพที่นี่

หลัง: ป้อนคำอธิบายรูปภาพที่นี่

หากต้องการลบเวอร์ชันคุณสามารถลบโฟลเดอร์ที่เกี่ยวข้องได้จาก GAC


0

เมื่อเร็ว ๆ นี้ฉันต้องทำงานในโครงการเก่าที่โซลูชันและโครงการที่มีทั้งหมดถูกกำหนดเป้าหมายไปยังแพลตฟอร์ม x32 ฉันพยายามต่อไปเพื่อคัดลอก Oracle.DataAccess.dll และไฟล์อื่น ๆ ที่แนะนำของ Oracle ในทุกที่ แต่โดนกระแทกทุกครั้ง ในที่สุดหลอดไฟในหัวสว่างขึ้น (หลังจาก 8 ชั่วโมง :)) และขอให้ตรวจสอบแอสเซมบลี ODAC ที่ติดตั้งและแพลตฟอร์มของพวกเขา ฉันติดตั้งไคลเอนต์ ODAC แบบ 64 บิต (x64) ทั้งหมดแล้ว แต่ไม่ใช่ 32 บิต (x32) ติดตั้ง ODAC แบบ 32 บิตและปัญหาหายไป

วิธีการตรวจสอบเวอร์ชั่นของ ODAC ที่ติดตั้ง: ดูในโฟลเดอร์ C: \ Windows \ assembly คุณสมบัติ "สถาปัตยกรรมตัวประมวลผล" จะแจ้งแพลตฟอร์ม ODAC ที่ติดตั้งไว้

แปดชั่วโมงเป็นเวลานานที่หลอดไฟจะสว่างขึ้น ไม่น่าแปลกใจที่ฉันต้องหวดที่ทำงานเสมอ :)


หมายเหตุC:\Windows\assembliesเพียงแสดงแอสเซมบลีมากถึง. NET Framework เวอร์ชัน 2.0 เวอร์ชัน 3.x / 4.x ไม่ปรากฏขึ้นให้ดูstackoverflow.com/questions/28213105/…
Wernfried Domscheit

0

ทางออกของคริสก็ใช้ได้สำหรับฉันเช่นกัน อย่างไรก็ตามฉันได้รับข้อความแสดงข้อผิดพลาดที่ระบุว่า:

Could not load file or assembly 'Oracle.DataAccess' or one of its dependencies. An attempt was made to load a program with an incorrect format.

เห็นได้ชัดว่าเป็นภาษาต่างประเทศของ Oraclish ซึ่งหมายความว่าโปรแกรมของคุณกำหนดเป้าหมายไปยังแพลตฟอร์มทั้งหมดหรือเครื่อง 32 บิต เพียงเปลี่ยนแพลตฟอร์มเป้าหมายในคุณสมบัติโครงการเป็น 64 บิตและหวังว่าจะดีที่สุด


3
ที่จริงแล้วเป็น. NETish ไม่ใช่ Oraclish
Jay Sullivan

0

ฉันมีปัญหาเดียวกันกับ Oracle.DataAccess.dll v4.121.2.0 พร้อมการติดตั้ง 2 homes (รุ่น 32 และ 64 บิต) คนทำงานรุ่น 32 บิตไม่ได้รุ่น 64 บิต

ในกรณีของฉัน (หลังจากพยายาม 2 วัน) ฉันพบว่าปัญหาคือการอนุญาตในรุ่น 64 บิต ไดเรกทอรีจำนวนมากในรุ่นนั้นมีสิทธิ์แทนที่โดยเฉพาะซึ่งบทบาท "ผู้ใช้ที่ได้รับการรับรองความถูกต้อง" ไม่มีการเข้าถึง "อ่าน" ซึ่งตั้งค่าเริ่มต้นในไดเรกทอรีหลัก ไดเร็กทอรีย่อยเหล่านั้นรวมถึง "bin", "network / admin", "nls", "oracore", "RDBMS" และอื่น ๆ ฉันพบพวกเขาโดยการกรองผลลัพธ์ "ACCESS DENIED" ในยูทิลิตี้ "Process Monitor" (Procmon.exe) จาก sysinternals เมื่อสิทธิ์ได้รับการสืบทอดจากไดเรกทอรีหลักไปยังไดเรกทอรีย่อยลูกเหล่านั้นทุกอย่างก็เริ่มทำงาน

ฉันไม่ได้ทำอะไรมากไปกว่าการอนุญาตบน oracle home ทั้งหมดดังนั้นฉันจึงทำไดเร็กตอรี่ครั้งละหนึ่งไดเร็กตอรี่, แต่ฉันเดาว่าถ้าคุณไม่กังวลเรื่องความปลอดภัยมากคุณสามารถรีเซ็ตมันในไดเร็กตอรี่


-1
  • บนเครื่อง 64 บิตคัดลอก "msvcr71.dll" จาก C: \ Windows \ SysWOW64 ไปยังไดเรกทอรี bin สำหรับแอปพลิเคชันของคุณ
  • บนเครื่อง 32 บิตคัดลอก "msvcr71.dll" จาก C: \ Windows \ System32 ไปยังไดเรกทอรี bin สำหรับแอปพลิเคชันของคุณ

http://randomdevtips.blogspot.com/2012/06/provider-is-not-compatible-with-version.html


-3

มีคำตอบเชิงทฤษฎีมากมายที่นี่ แต่นี่เป็นตัวอย่างการทำงานที่มีรหัสซึ่งคุณสามารถคัดลอกและวางและทดสอบได้ทันที:

  1. ฉันติดตั้งฐานข้อมูล Oracle Express OracleXE112ซึ่งมาพร้อมกับตารางสาธิตที่ติดตั้งไว้แล้วบางส่วน
  2. เมื่อคุณเริ่มตัวติดตั้งระบบจะถามรหัสผ่านของคุณ ฉันป้อน "xxx" เป็นรหัสผ่าน (ไม่ได้ใช้ในการผลิต)
  3. เซิร์ฟเวอร์ของฉันทำงานบนเครื่อง192.168.1.158
  4. บนเซิร์ฟเวอร์ที่คุณ explicitely ต้องอนุญาตให้เข้าถึงกระบวนการ tnslsnr.exe ในของ Windows Firewall กระบวนการนี้ฟังจากพอร์ต 1521 หากคุณได้รับข้อผิดพลาดการหมดเวลาจากรหัสด้านล่างให้ตรวจสอบไฟร์วอลล์ของคุณ
  5. ตัวเลือก A:สำหรับ C # (.NET2 หรือ. NET4) คุณสามารถดาวน์โหลดODAC11ซึ่งคุณจะต้องเพิ่ม Oracle.DataAccess.dll ในโครงการของคุณ นอกจากนี้ DLL นี้ขึ้นอยู่กับ: OraOps11w.dll, oci.dll, oraociei11.dll (130MB!), msvcr80.dll กำลังเหล่านี้จะต้องอยู่ในไดเรกทอรีเดียวกันกับใน EXE หรือคุณต้องระบุเส้นทาง DLL HKEY_LOCAL_MACHINE\SOFTWARE\Oracle\ODP.NET\4.112.4.0\DllPathใน: บนเครื่อง 64 บิตเขียนเพิ่มเติมHKLM\SOFTWARE\Wow6432Node\Oracle\...
  6. ตัวเลือก B:ถ้าคุณดาวน์โหลดODAC12คุณต้องใช้ Oracle.DataAccess.dll, OraOps12w.dll, oci.dll, oraociei12.dll (160MB!), oraons.dll, msvcr100.dll เส้นทางรีจิสทรีคือHKEY_LOCAL_MACHINE\SOFTWARE\Oracle\ODP.NET\4.121.2.0\DllPath
  7. ตัวเลือก C:หากคุณไม่ต้องการ DLL ขนาดใหญ่ที่มีขนาดเกิน 100 MB คุณควรดาวน์โหลด ODP.NET_Managed12.xxxxxxxx.zip ซึ่งคุณพบว่าOracle.ManagedDataAccess.dllมีเพียง 4 MB และเป็น DLL ที่ได้รับการจัดการที่บริสุทธิ์ซึ่งทำงานในกระบวนการ 32 บิตและ 64 บิต เช่นกันและขึ้นอยู่กับ DLL อื่น ๆ และไม่ต้องการรายการรีจิสทรีใด ๆ
  8. รหัส C # ต่อไปนี้ใช้ได้กับฉันโดยไม่มีการกำหนดค่าใด ๆบนฝั่งเซิร์ฟเวอร์ (เพียงแค่การติดตั้งเริ่มต้น):
ใช้ Oracle.DataAccess.Client;
หรือ
ใช้ Oracle.ManagedDataAccess.Client;

....

string oradb = "แหล่งข้อมูล = (DESCRIPTION ="
    + "(ADDRESS_LIST = (ADDRESS = (PROTOCOL = TCP) (HOST = 192.168.1.158) (PORT = 1521))"
    + "(CONNECT_DATA = (SERVER = DEDICATED)));"
    + "รหัสผู้ใช้ = ระบบ; รหัสผ่าน = xxx;";

การใช้ (OracleConnection conn = new OracleConnection (oradb)) 
{
    conn.Open ();
    using (OracleCommand cmd = new OracleCommand ())
    {
        cmd.Connection = conn;
        cmd.CommandText = "เลือก TABLESPACE_NAME จาก DBA_DATA_FILES";

        การใช้ (OracleDataReader dr = cmd.ExecuteReader ())
        {
            ในขณะที่ (ดร. อ่าน ())
            {
                listBox.Items.Add (DR [ "tablespace_name"]);
            }
        }
    }
}

overkill พอสมควรในการติดตั้งเซิร์ฟเวอร์ฐานข้อมูล Oracle ทั้งหมดเมื่อคุณต้องการไคลเอนต์ที่ทำงานอยู่
Wernfried Domscheit

คุณตอบไม่ดีอยู่ดี ไม่จำเป็นต้องคัดลอก Oracle dll ใด ๆ "ไปยังไดเรกทอรีแอปพลิเคชันเพราะโดยการติดตั้งเริ่มต้นคุณจะพบพวกเขาผ่านทาง PATH% (เว้นแต่คุณจะแก้ไขด้วยตัวคุณเอง) คำแนะนำการลงทะเบียนใช้สำหรับ forversion 4.x เท่านั้น ไคลเอ็นต์ Oracle 32 บิตอย่างไรก็ตาม mismatchrs 32 บิตกับ 64 บิตเป็นหัวข้อหลักของคำถามนี้
Wernfried Domscheit

ความคิดเห็นที่คุณแสดงให้เห็นว่าคุณไม่ได้อ่านคำตอบของฉัน ถ้าฉันต้องการเขียนแอปพลิเคชันที่สื่อสารกับเซิร์ฟเวอร์ Oracle ไม่จำเป็นต้องติดตั้งอะไรจาก Oracle ฉันเพิ่งใช้ DLL ที่กล่าวถึงข้างต้นและแจกจ่ายด้วยแอปพลิเคชันของฉัน ดังนั้นจะไม่มีอะไรในตัวแปร PATH บนเครื่องของผู้ใช้ปลายทาง โดยวิธีการใช้ตัวแปร PATH (ซึ่งมาจากอายุ DOS อายุตั้งแต่ปี 1980) ถูกคัดค้านอย่างมากในซอฟต์แวร์ที่ทันสมัย คำตอบของฉันแนะนำตัวเลือก C ซึ่งไม่ต้องการเส้นทางรีจิสตรีและไม่ขึ้นอยู่กับ 32 หรือ 64 บิต ฉันพูดถึงตัวเลือก A และ B เพื่อความสมบูรณ์เท่านั้น
Elmue

ฉันคิดว่าหากไม่มี% PATH% ที่เหมาะสมการตั้งค่า Windows ของคุณจะไม่ทำงานเลยแม้แต่ในเวอร์ชัน 10 ฉันพูดถึงคำตอบของฉันว่ามันไม่ฉลาดที่จะคัดลอก Oracle dll ใด ๆ ด้วยแอปพลิเคชันของคุณ ผมไม่ทราบว่ารหัสที่มาของเหล่านี้ dll แต่อาจจะมีการอ้างอิงมากขึ้นในด้านลูกค้าของคุณซึ่งคุณไม่เห็นเช่นเรียกโดยการตั้งค่าภาษา, ชุดตัวอักษร, โซนเวลา ฯลฯ เมื่อฉันทำร่องรอยด้วยOracle.DataAccess.dllแล้ว โปรแกรมโหลดทั้งหมด 35 Oracle DLL ทำการติดตั้ง Oracle Client ให้เป็นปกติดีกว่า - เว้นแต่คุณจะใช้ไดรเวอร์ ODP.NET Managed
Wernfried Domscheit

1
ฉันคิดว่าฉันพูดถึงข้อกังวลของฉัน: (1) การติดตั้งฐานข้อมูลไม่มีประโยชน์เช่น overkill (2) ตัวเลือก A และ B ทำงานภายใต้เงื่อนไขบางประการเท่านั้นตัวอย่างเช่นไม่ได้อ่านการตั้งค่า NLS จาก Registry (ซึ่งคุณต้องการไฟล์oracle.key) เพื่อความเข้ากันได้คุณจะต้องคำนึงถึงรุ่นรองด้วย Oracle.DataAccess, Version=2.112.2.0ไม่ทำงานกับOraOps11w.dllเวอร์ชัน 2.112.4.0 เช่น
Wernfried Domscheit
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.