เหตุใดฉันไม่สามารถอ่านคอลัมน์ Oracles CLOB ผ่านเซิร์ฟเวอร์ที่เชื่อมโยงกับ SQL-SERVER 2008


10

ฉันต้องการเข้าถึงข้อมูลในฐานข้อมูล Oracle 11g จาก SQL-Server 2008

ฉันตั้งค่าเซิร์ฟเวอร์ที่เชื่อมโยงและเมื่อฉันดำเนินการ

select * from [Link_server_name]..Oracle_schema.Oracle_table

และ Oracle_table มีคอลัมน์ Number และ varchar2 ทั้งหมดทำงานตามที่ได้รับการยกเว้น

แต่เมื่อ Oracle_table มีคอลัมน์ CLOB ฉันได้รับข้อผิดพลาดต่อไปนี้:

Der OLE DB-Anbieter 'MSDAORA' für den Verbindungsserver 'L_V407SR8T' hat die Meldung 'ข้อผิดพลาดที่ไม่ระบุ' zurückgeben

Der OLE DB-Anbieter 'MSDAORA' für den Verbindungsserver 'L_V407SR8T' hat die Meldung 'เกิดข้อผิดพลาดของ Oracle แต่ไม่สามารถดึงข้อความแสดงข้อผิดพลาดจาก Oracle' zurückgeben

Der OLE DB-Anbieter 'MSDAORA' für den Verbindungsserver 'L_V407SR8T' hat die Meldung 'ไม่รองรับประเภทข้อมูล' zurückgeben

ข่าวสารเกี่ยวกับ 7306 ระดับ 16 สถานะ 2 บรรทัด 1

Die '"MCCAPP". "DOGGRUPPEN"' - Tabelle vom OLE DB-Anbieter 'MSDAORA' für den Verbindungsserver 'L_V407SR8T' kann nicht geöffnet werden

ใช้ OPENQUERY

SELECT * FROM OPENQUERY([L_V407SR8T], 'Select CLOB_COLUMN from Oracle_table'  )

ฉันเข้าใจ

Der OLE DB-Anbieter 'MSDAORA' für den Verbindungsserver 'L_V407SR8T' hat die Meldung 'เกิดข้อผิดพลาดของ Oracle แต่ไม่สามารถดึงข้อความแสดงข้อผิดพลาดจาก Oracle' zurückgeben Der OLE DB-Anbieter 'MSDAORA' für den Verbindungsserver 'L_V407SR8T' hat die Meldung 'ไม่รองรับประเภทข้อมูล' zurückgeben

กรุณาแก้ตัวข้อความผิดพลาดเยอรมัน

คำถามของฉัน: มีวิธีอ่านคอลัมน์ CLOB ผ่านเซิร์ฟเวอร์ที่เชื่อมโยงหรือไม่

แก้ไข:

  • ตัวช่วยสร้างการนำเข้าและส่งออกเซิร์ฟเวอร์ SQL ดูเหมือนว่าจะขึ้นอยู่กับฐานข้อมูล OLE ด้วยและดูดเข้าไปในตารางเดียวกัน
  • ฉันถามตัวเองว่าปัญหานั้นขึ้นอยู่กับชุดตัวละครที่ใช้ แต่ฉันไม่สามารถเปลี่ยนได้
  • ในฐานะที่เป็นทางปฏิบัติฉันใช้สคริปต์ PowerShell เพื่อรับข้อมูล แต่

คุณควรจะสามารถอ่าน CLOB ได้หากอย่างน้อยคุณสามารถแปลงเป็นครั้งแรก ... msdn.microsoft.com/en-us/library/ms378813.aspx
jcolebrand

คำตอบ:


3

ดาวน์โหลดและติดตั้งไคลเอนต์ฐานข้อมูล Oracle 11 บนเครื่อง SQL Server 2008 ของคุณ

ตั้งค่าเซิร์ฟเวอร์ที่เชื่อมโยงโดยใช้ผู้ให้บริการ Oracle OLE DB (OraOLEDB.Oracle)

ตรวจสอบให้แน่ใจว่า "Allow InProcess" เปิดใช้งานในตัวเลือกผู้ให้บริการ

ไคลเอ็นต์ Oracle 11 OLE DB รองรับ CLOB


2

ความคิดเห็นคำถามคำตอบ SO วิธีการอ่านคอลัมน์ CLOB ใน Oracle โดยใช้ OleDb?

มีลิงค์ไปยังโพสต์Microsoft Supportเก่าพร้อมข้อความต่อไปนี้

ไม่รองรับประเภทข้อมูลเฉพาะของ Oracle 8.x เช่น CLOB, BLOB, BFILE, NCHAR, NCLOB และ NVARCHAR2

มันจะเป็นการดีถ้าคุณพบการอ้างอิงที่เป็นปัจจุบันมากกว่านี้

ฉันทำวิจัยของ Google และพบวิธีแก้ปัญหาเท่านั้น ฉันกลัวว่าประเภทข้อมูลยังไม่รองรับ

แก้ไข 02/05/2011

ฉันไม่เข้าใจจริงๆว่าทำไม Microsoft ไม่สามารถแก้ไขปัญหานี้ได้ สคริปต์ PowerShell ต่อไปนี้ใช้ OLE-DB เพื่ออ่านตารางที่มีคอลัมน์ CLOB จากฐานข้อมูล Oracle และแทรกข้อมูลลงในตารางที่คล้ายกันที่มีอยู่บน Sql-Server โดยใช้ bulkCopy ซึ่งเป็นวิธีที่มีประสิทธิภาพมาก

ปรับสตริงการเชื่อมต่อแบบสอบถามและชื่อตารางต่อไปนี้เพื่อติดตั้งของคุณ:

# Here I use OLE-DB to read the Oracle database
$ConnectionString ="Server=ignore;User Id=myUser;Password=myPassword;Data Source=myTns;Provider=OraOLEDB.Oracle;"

# Here I use .NET SqlClient
$SqlClientConnString = "Data Source=localhost;Initial Catalog=myDestinationDB;Integrated Security=True"

$sql = "select int_col, clob_col from TABLE_WITH_CLOB"
$tableName = "COPY_OF_CLOB_TABLE"

รหัสต่อไปนี้คัดลอกตาราง oracle ลงในตาราง sql-server

$OLEDBConn = New-Object System.Data.OleDb.OleDbConnection($ConnectionString)
$OLEDBConn.open()
$readcmd = New-Object system.Data.OleDb.OleDbCommand($sql,$OLEDBConn)
$readcmd.CommandTimeout = '300'
$da = New-Object system.Data.OleDb.OleDbDataAdapter($readcmd)
$dt = New-Object system.Data.datatable
[void]$da.fill($dt)
$OLEDBConn.close()
#Write-Output $dt


if ($dt)
{
    try
    {
        $bulkCopy = new-object ("Data.SqlClient.SqlBulkCopy") $SqlClientConnString
        $bulkCopy.DestinationTableName = $tableName
        $bulkCopy.BatchSize = 50000
        $bulkCopy.BulkCopyTimeout = 0
        $bulkCopy.WriteToServer($dt)
    }
    catch
    {
        $ex = $_.Exception
        #Write-LogMessage -Source 'Write-DataTable' -Message "$($connectionName):$ex.Message"
        Write-Error "Write-DataTable$($connectionName):$ex.Message"
        continue
    }
}

BTW: รหัสจะขึ้นอยู่กับโครงการ codeplex Chad Millers Really Simple Data Dictionary

ขณะนี้การใช้ PowerShell เป็นวิธีเดียวที่ฉันรู้ว่าจะคัดลอกข้อมูลด้วย CLOB จาก Oracle ไปยัง Sql-Server ที่ไม่ได้ใช้ C # หรือเครื่องมือของบุคคลที่สาม

ฉันไม่ประสบความสำเร็จในการใช้ตัวช่วยสร้างการนำเข้า / ส่งออกหรือเซิร์ฟเวอร์ที่เชื่อมโยงไม่สำเร็จ


grrrr ที่แย่มากเมื่อพิจารณาว่ามันเป็นสามจุดสำหรับ ORA และอย่างน้อยหนึ่งจุดปล่อยให้ MS ตั้งแต่นั้นมา ... AHANo new updates are planned for future releases of these components including their support against versions later than Oracle 8i.
jcolebrand

ผมไม่เข้าใจว่าทำไมไมโครซอฟท์จะไม่สามารถแก้ไขปัญหานี้ ? ด้วยเหตุผลเดียวกัน Microsoft หยุดสนับสนุน dotnet framework ไคลเอ็นต์ไลบรารีของ Oracle - "คนอื่นทำได้ดีกว่า" ถ้าฉันถอดความการตอบสนองของพวกเขาอย่างโหดเหี้ยมในอดีต ฉันไม่บอกว่ารักหายไประหว่างสองคนนี้
ScottCher
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.