2016-12-12 11 views
1

バックアップRayStationデータベースRS_Patients.bakが与えられ、そこに格納されているDICOMイメージを抽出して表示しようとしています。問題は2つあります:2,000以上のフィールド(またはフィールドの組み合わせ)のどれがイメージ自体を参照しているのか分かりません。イメージがどこにあるか分かっていても、抽出方法はわかりませんそれらをデータベースから.dcmファイルに変換します。DICOMイメージを抽出するMicrosoft SQLデータベース

スキーマを調べてから、私は大きなvarbinaryフィールド(BLOBの)されているいくつかのフィールドを発見し、私は彼らは私が探している分野かもしれないと思う。 FileStreamはデータベースに対して有効になっており、FSディレクトリがあります。 bcp Utilityを使用してこれらのフィールドをファイルにダウンロードしようとしましたが、DICOMは正常に作成されていません。

誰もこの種のデータベース/画像構造に関する経験はありますか?画像を引き出して見るための他の提案はありますか?イメージは単なるものではなく、2つのフィールドで構成されると思いますか?私たちは、DICOM画像のヘッダとイメージフィールド信じるものの次のフィールドがあります。テーブルに、また

など、NrPixelsSlicePositionPixelSize呼び出された場合にフィールドがある、PixelDataと呼ばれる次のフィールドに、ImageStackをcallefdあなたはこれを尋ねる別の場所を考えることができます、私はあまりにもそれを感謝します。 @mcNets提案あたり

編集、bcpコマンド:

DECLARE @Command Varchar(400) 
SET @Command = 'bcp "SELECT TOP 1 PixelData FROM RayStationPatientDB.dbo.ImageStack" queryout "C:\Users\Administrator\Documents\test.dcm" -S WIN-123ABC\MSSQLSERVER01 -T -w' 
EXEC xp_cmdshell @Command 
+0

使用した 'bcp' sintaxを表示してください。たぶんこれが役立ちます。 – McNets

+0

@AVD、私は少し前にこれに幾分類似した質問に答えましたが、おそらく助けてくれますか? http://stackoverflow.com/questions/11741558/how-to-store-and-retreive-dicom-files-in-sql-server-using-c-sharpありがとう! – zebrainatree

+0

https://www.codeproject.com/tips/372613/sql-server-blob-import-and-export – McNets

答えて

1

は、一般的にあなたが直接、画像データを書き込むために、SQL Serverの結果を使用できるようにするつもりはない、話します。 bcp.exeもあなたを助けるつもりはありません。バイナリ文字列が生ファイルデータであることを理解しているもの、またはFILESTREAMなので、SQL Server上のファイルへのパスを与えるものを使用する必要があります。私はFILESTREAMの経験が限られていますが、ここでは私がやることがあります。

どのフィールドを使用するかはっきりと答えられません。それはアプリケーションに依存します。すなわち - 我々はまた、DICOM画像は、RAW画像ファイルとして保存されていることを前提とした場合

select t.name TableName 
    ,c.name ColumnName 
from sys.tables t 
join sys.columns c 
    on c.object_id = t.object_id 
where c.is_filestream = 1 

:我々は、DICOM画像はFILESTREAMに保存され、その後、あなたはこれで利用できるFILESTREAM列を見つけることができると仮定した場合彼らはPACSディスクに保存された場合、彼らがどうなるかの完全なバイナリバージョン - あなたはIDによって、各ファイルのパスを決定するために、これを実行できます。

select TableName_Id 
    ,FileData.PathName() 
from TableName.ColumnName 

FILESTREAM列のPathName()機能のためのドキュメントhereです。

代わりに従来の意味でSQL Serverを介してデータを取得する場合は、おそらくPowerShellスクリプトを使用します。これには、サーバーの任意のデータを使用してファイルの名前を付けることができるという利点があります。この方法には、任意のバイナリまたはvarbinary列に対しても機能するという利点があります。欠点として、この方法は遅くなると、より多くのディスク容量を使用して、サーバがクライアントに送信し、データを読み取ることがあり、その後、クライアントは、データをディスクに書き込むためになります。

$SqlQuery = "select Name, FileData from TableName.ColumnName"; 
$OutputPath = 'C:\OutputPath'; 

$SqlServer = 'ServerName'; 
$SqlDatabase = 'DatabaseName'; 
$SqlConnectionString = 'Data Source={0};Initial Catalog={1};Integrated Security=SSPI' -f $SqlServer, $SqlDatabase; 

$SqlCommand = New-Object -TypeName System.Data.SqlClient.SqlCommand; 
$SqlCommand.CommandText = $SqlQuery; 

$SqlConnection = New-Object -TypeName System.Data.SqlClient.SqlConnection -ArgumentList $SqlConnectionString; 
$SqlCommand.Connection = $SqlConnection; 

$SqlConnection.Open(); 
$SqlDataReader = $SqlCommand.ExecuteReader(); 

while ($SqlDataReader.Read()) { 
    $OutputFileName = Join-Path -Path $OutputPath -ChildPath "$($SqlDataReader['Name']).dcm" 
    [System.IO.File]::WriteAllBytes($OutputFileName,$SqlDataReader['FileData']); 
} 
$SqlConnection.Close(); 
$SqlConnection.Dispose(); 

ことも可能ですWin32 APIハンドルを返すためにFILESTREAM関数を使用することはできますが、これは決して行っていません。

関連する問題