【问题标题】:Convert datatable to byte array将数据表转换为字节数组
【发布时间】:2018-11-30 18:21:27
【问题描述】:

我想在 WCF 服务中将 DataTable 转换为字节数组。将值返回到表示层后,我想将字节数组转换为 excel。 也就是说;我想在用户界面端(网站)的表示层下面做。

Response.Clear();
Response.ContentType = "application/vnd.ms-excel";
Response.AppendHeader("Content-Disposition", "attachment; filename=" + fileName + ".xls");

Response.OutputStream.Write(s, 0, s.Length);
Response.OutputStream.Flush();
Response.OutputStream.Close();
Response.Flush();
Response.Close();

我没有这样做。如何将数据表转换为字节数组?

【问题讨论】:

  • 不清楚为什么要将其转换为 WCF 端的字节数组 - 您真正关心的只是将 DataTable 本身获取到网站,对吗?这可以将其转换为 Excel 格式。或者您是否想在 WCF 端实际转换为 Excel,以便网站可以直接发送响应?
  • 虽然我同意@JonSkeet 所说的 - 为什么要将重对象转换为 byte[] 而不是使用 POCO 等?对于非 .NET 语言,它也很容易解释

标签: c# c#-4.0


【解决方案1】:

数据表转字节[]

System.IO.MemoryStream stream = new System.IO.MemoryStream(); 
System.Runtime.Serialization.IFormatter formatter = new System.Runtime.Serialization.Formatters.Binary.BinaryFormatter();
formatter.Serialize(stream, dtUsers); // dtUsers is a DataTable

byte[] bytes = stream.GetBuffer();

希望这有助于解决您的部分问题。

你可以试试这个

private byte[] ConvertDataSetToByteArray(DataTable dataTable)
    {
        byte[] binaryDataResult = null;
        using (MemoryStream memStream = new MemoryStream())
        {
            BinaryFormatter brFormatter = new BinaryFormatter();
            dataSet.RemotingFormat = SerializationFormat.Binary;
            brFormatter.Serialize(memStream, dataTable);
            binaryDataResult = memStream.ToArray();
        }
        return binaryDataResult;
    }   

【讨论】:

  • 谢谢,但是当我写响应时这会返回 xml。
【解决方案2】:

连接数据行中的所有列并将其保存为 csv(csv 在 excel 中可读)

private string (DataTable dt)
{
string rw = "";
StringBuilder builder = new StringBuilder();

foreach(DataRow dr in dt.Rows)
{
  foreach(DataColumn dc in dr.Columns)
  {
      rw = dc[0].ToString();
      if (rw.Contains(",")) rw = "\"" + rw + "\"";
      builder.Append(rw + ",");
  }
  builder.Append(Environment.NewLine);
}
return builder.ToString()
}

然后序列化返回字符串值

【讨论】:

  • 这可能不是确切的答案,但它可能具有相同的目的。
  • 在第二个 foreach 中的 rw = dr[0].ToString(); 中,您的意思是 dc 不是 dr,对吧?
  • @Michele,是的,非常感谢!我已经更正了。
【解决方案3】:

谢谢,但是当我写响应时这会返回 xml。

我只是从你的评论中思考;如果您的意图是通过使用 byte[] 从绑定方法(例如 MTOM Encoding 等)中受益;那么这不是您应该将数据转换为 byte[] 的方式。

[DataContract]
class MyData
{
    [DataMember]
    byte[] binaryBuffer;
    [DataMember]
    string someStringData;
} 

以及所需绑定类型的配置,例如:

<system.serviceModel>
     …
    <bindings>
      <wsHttpBinding>
        <binding name="ExampleBinding" messageEncoding="Mtom"/>
      </wsHttpBinding>
    </bindings>
     …
<system.serviceModel>

您可以参考This Post 了解更多详细信息,有一个关于使用字节[] 和相关页面的绑定类型的信息非常丰富的对话框以及我提供的代码 sn-ps..

【讨论】:

    【解决方案4】:

    这是我的做法。效果很好!

            //Get datatable from db 
            DataTable dt = new DataTable();
            dt.TableName = "TABContacts";
            SqlConnection connection = new SqlConnection(ConfigurationManager.AppSettings["DBConnectionString"]);
            SqlCommand cmd = new SqlCommand("SELECT * FROM TABContacts", connection);
            using (SqlDataAdapter adapter = new SqlDataAdapter(cmd))
            {
                adapter.Fill(dt);
            }
    
            StringBuilder builder = new StringBuilder();
    
            foreach (DataRow row in dt.Rows)
            {
                for (int i = 0; i < row.ItemArray.Length; i++)
                {
                    string rowText = row.ItemArray[i].ToString();
                    if (rowText.Contains(","))
                    {
                        rowText = rowText.Replace(",", "/");
                    }
    
                    builder.Append(rowText + ",");
                }
                builder.Append(Environment.NewLine);
            }
            //Convert to Byte Array 
            byte[] data = Encoding.ASCII.GetBytes(builder.ToString());
    

    【讨论】:

      猜你喜欢
      • 2011-11-02
      • 1970-01-01
      • 2014-08-08
      • 2011-03-11
      • 2021-01-12
      • 1970-01-01
      • 2014-10-17
      • 1970-01-01
      相关资源
      最近更新 更多