SQL-SERVER 2008 bağlantılı sunucu aracılığıyla neden Oracles CLOB sütunlarını okuyamıyorum?


10

Oracle 11g veritabanındaki verilere SQL-Server 2008'den erişmek istiyorum

Bağlantılı bir sunucu kurdum ve yürüttüğümde

select * from [Link_server_name]..Oracle_schema.Oracle_table

ve Oracle_table, tümü istisna olarak çalışan Sayı ve varchar2 sütunları içerir.

Ancak Oracle_table bir CLOB sütunu içerdiğinde, aşağıdaki hatayı alıyorum:

Der OLE DB-Anbieter 'MSDAORA' für den Verbindungsserver 'L_V407SR8T' şapka die Meldung 'Belirtilmemiş hata' zurückgeben.

Der OLE DB-Anbieter 'MSDAORA' für den Verbindungsserver 'L_V407SR8T' hat die Meldung 'Oracle hatası oluştu, ancak hata mesajı Oracle'dan alınamadı.' zurückgeben.

Der OLE DB-Anbieter 'MSDAORA' für den Verbindungsserver 'L_V407SR8T' hat die Meldung 'Veri türü desteklenmiyor.' zurückgeben.

Msg 7306, Seviye 16, Durum 2, Satır 1

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

OPENQUERY kullanma

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

alırım

Der OLE DB-Anbieter 'MSDAORA' für den Verbindungsserver 'L_V407SR8T' hat die Meldung 'Oracle hatası oluştu, ancak hata mesajı Oracle'dan alınamadı.' zurückgeben. Der OLE DB-Anbieter 'MSDAORA' für den Verbindungsserver 'L_V407SR8T' hat die Meldung 'Veri türü desteklenmiyor.' zurückgeben.

Lütfen Almanca hata mesajlarını affedin.

Sorum: Bağlantılı Sunucular aracılığıyla CLOB sütunlarını okumanın herhangi bir yolu var mı?

DÜZENLE:

  • SQL Server Alma ve Verme Sihirbazı da OLE DB'ye bağlı görünüyor ve aynı tablolarda berbat
  • Kendime soruyorum, eğer problem karakter setlerinin kullanımına bağlıysa, ama onları değiştiremiyorum
  • Pratik bir çözüm olarak, verilere ulaşmak için bazı PowerShell komut dosyaları kullanıyorum, ancak

En azından önce dönüştürebiliyorsanız CLOB'u okuyabilmelisiniz ... msdn.microsoft.com/en-us/library/ms378813.aspx
jcolebrand

Yanıtlar:


3

SQL Server 2008 makinenize bir Oracle 11 veritabanı istemcisi indirip yükleyin.

Oracle OLE DB sağlayıcısı (OraOLEDB.Oracle) kullanarak bağlantılı bir sunucu kurun.

Sağlayıcı seçeneklerinde "InProcess'e İzin Ver" seçeneğinin etkinleştirildiğinden emin olun.

Oracle 11 OLE DB istemcisi CLOB'ları destekler.


2

Bir yanıt için bir yorum SO soru Oracle'da OleDb kullanarak bir CLOB sütun nasıl okunur?

aşağıdaki ifadeyi içeren eski Microsoft Destek postasına bir bağlantı içeriyor

CLOB, BLOB, BFILE, NCHAR, NCLOB ve NVARCHAR2 gibi Oracle 8.x'e özgü veri türleri desteklenmez.

Daha güncel referanslar bulmak güzel olurdu.

Bazı Google araştırmaları yaptım ve yalnızca geçici çözümler buldum. Veri türünün hala desteklenmediğinden korkuyorum.

Düzenle 02/05/2011

Microsoft'un neden bu sorunu çözemediğini gerçekten anlamıyorum. Aşağıdaki PowerShell Komut Dosyası, Oracle veritabanından bir CLOB sütunu içeren bir tabloyu okumak ve verileri çok verimli bir yol olan bulkCopy kullanarak Sql-Server'daki mevcut benzer bir tabloya eklemek için OLE-DB'yi kullanır.

Aşağıdaki bağlantı dizelerini, sorguyu ve tablo adını kurulumunuza göre ayarlayın:

# 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"

Aşağıdaki kod, oracle tablosunu bir sql-server tablosuna kopyalar

$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: kod Chad Millers Gerçekten Basit Veri Sözlüğü codeplex projesi dayanmaktadır

Şu anda PowerShell kullanarak COB veya herhangi bir üçüncü taraf araç kullanmadan Oracle'dan Sql-Server'a CLOB'lerle Veri kopyalamayı bildiğim tek yoldur.

Ne Alma / Verme Sihirbazı ne de bağlı sunucuları kullanmayı başaramadım.


grrrr, ORA için üç puan ve MS için o zamandan beri en az bir puan sürümü olduğunu düşünerek berbat ... AHANo new updates are planned for future releases of these components including their support against versions later than Oracle 8i.
jcolebrand

Microsoft'un neden bu sorunu çözemediğini anlamıyorum ? Aynı sebepten ötürü, yanıtlarını acımasızca tekrar açıklarsam Microsoft, dotnet framework Oracle istemci kitaplığını desteklemeyi bıraktı - "diğer insanlar bunu daha iyi yapıyor". Bu ikisi arasında hiçbir aşk kaybı yok, size söylüyorum.
ScottCher
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.