【问题标题】:How to store and retrieve DICOM files in SQL Server using C#如何使用 C# 在 SQL Server 中存储和检索 DICOM 文件
【发布时间】:2012-07-31 13:44:13
【问题描述】:

我的目标是用一些 ID 将 DICOM 文件存储在 SQL Server 中,当用户想要该 DICOM 文件时,他可以使用其相应的 ID 从 SQL Server 下载。该文件在存储到服务器以及从 SQL Server 检索时不应改变其原始性。我正在使用Varbinary(max) 数据类型将DICOM 文件的字节数组存储在SQL Server 中。我正在将 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 Server 中而不会造成任何损失吗?

更新: 下面是我下载 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);
 }

【问题讨论】:

  • 发布您下载。比如丢失了什么?
  • 整个DICOM文件从SQLServer下载后变成不可读格式并保存到本地机器。
  • 我从 SQL Server 下载文件时可能做错了,你能帮我如何使用 C# 下载文件并将文件保存到本地机器。
  • 您声称拥有无法运行的代码。发布不起作用的下载代码。
  • 这个样本必须 byte[] codeproject.com/Articles/225446/…

标签: c# .net sql sql-server-2008 dicom


【解决方案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);
         }
     }

【讨论】:

  • 你能告诉我如何从 SQL Server 中检索数据并将其保存到本地机器吗?
  • 使用System.IO.FileStream将字节数组保存/写入磁盘文件。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-08-13
  • 2011-01-26
  • 2015-03-13
  • 2014-07-29
  • 1970-01-01
相关资源
最近更新 更多