1

私の目的は、DICOMファイルを何らかのIDでSQL Serverに保存することです。ユーザーがそのDICOMファイルを必要とする場合、対応するIDを使用してSQLServerからダウンロードできます。ファイルは、サーバーへの保存中、およびSQLServerからの取得時に元の状態を変更しないでください。SQLServerにDICOMファイルのバイト配列を格納するためにデータ型を使用してVarbinary(max)います。DICOMファイルのメモリストリームをバイト配列に変換してから、以下のようにSQLサーバーに保存しています。

 using (MemoryStream memStream = new MemoryStream())
 {
    using (FileStream fileStream = File.Open(txtDICOMFilePath.Text, FileMode.Open))
    {
         // Copy the file stream to memory stream.
         fileStream.CopyTo(memStream);
    }
    int intL = Convert.ToInt32(memStream.Length);
    byte[] objData = new byte[intL];
 }

 //Set insert query
 string qry = "insert into ImagesStore (ID,ImageData) values(@ID, @ImageData)";

 //Initialize SqlCommand object for insert.
 SqlCommand SqlCom = new SqlCommand(qry, CN);

 //We are passing Original Image Path and Image byte data as sql parameters.
 SqlCom.Parameters.Add(new SqlParameter("@ID", (object)txtUniqueID.Text));
 SqlCom.Parameters.Add(new SqlParameter("@ImageData", (object)objData));

 //Open connection and execute insert query.
 CN.Open();
 SqlCom.ExecuteNonQuery();
 CN.Close();

問題: 画像の保存中は正しく保存されますが(例外なく)、取得中は正確なデータが得られません。誰かがDICOMファイルをSQLサーバーに損失なく保存するのを手伝ってくれますか?

更新: 以下は、DICOMファイルをダウンロードするための私のコードです。

qry = "select ImageData from ImagesStore where ID= @ID";

 //Initialize SqlCommand object for insert.
 SqlCom = new SqlCommand(qry, CN);

 SqlCom.Parameters.Add("@ID", SqlDbType.Int).Value = (object)txtUniqueID.Text;

 SqlDataAdapter adp = new SqlDataAdapter(SqlCom);

 DataTable dt = new DataTable();

 try
 {

     if (CN.State == ConnectionState.Closed)
        CN.Open();

     adp.Fill(dt);

     if (dt.Rows.Count > 0)
     {

           MemoryStream ms = new MemoryStream((byte[])dt.Rows[0]["ImageData"]);

           //Logic to save the file
     }
 }
 catch (Exception ex)
 {
     MessageBox.Show(ex.Message, "Error",MessageBoxButtons.OK, MessageBoxIcon.Error);
 }
4

1 に答える 1

1

byte[] objDataブロックを使用する前に外部で宣言 し、バイト配列のサイズを設定してみてください。

byte []objData=null;
using (MemoryStream memStream = new MemoryStream())
 {
    using (FileStream fileStream = File.Open(txtDICOMFilePath.Text, FileMode.Open))
    {
         fileStream.CopyTo(memStream);
    }
    int intL = Convert.ToInt32(memStream.Length);
    objData = new byte[intL];
    memStream.Read(objData,0,objData.Length);
 }

SqlCom.Parameters.Add("@ImageData",SqlDb.Image,objData.Length).Value=objData;

編集:からデータを読み取るにはImagesStore

string qry = "select * From ImagesStore";

using(SqlConnection Cn=new SqlConnect(CnStr))
{
  using(SqlCommand SqlCom = new SqlCommand(qry, CN))
  {
    Cn.Open();
    using(SqlDataReader dr=SqlCom.ExecuteReader())
    {
      while(dr.Read())
      {
          string path="x:\\folder\\" + dr[0] + ".png";
          byte []bytes=(byte[])dr[1];
          System.IO.File.WriteAllBytes(path,bytes);
       }
    }
  }
}

または、DataAdapter/DataTable (OP のコード) を使用できます。

if (dt.Rows.Count > 0)
     {
        foreach(DataRow row in dt.Rows)
         {
          string path="x:\\folder\\" + row[0] + ".png";
          byte []bytes=(byte[])row[1];
          System.IO.File.WriteAllBytes(path,bytes);
         }
     }
于 2012-07-31T13:47:51.033 に答える