C# DataTable转换byte

datatable 转为byte[] 以及把byte[]转为datatable 其实就是系列化与反系列的问题.实际上所有的类都可以使用byte[]形式表示,因为他在内存中的数据本身就是byte

而对于你说的String进行

System.Text.Encoding.BigEndianUnicode.GetBytes

System.Text.Encoding.Default.GetBytes    等等

这个除了此还有编码读取的功能,对于文本的编码,没有办法,各个国家为了自己的文字存储占更少空间都有各自的标准,对其它国家的文字就支持不好了,当然也有支持各国文字的utf-8等

第一种方法:

请你参考一下,在vs 2008下运行 通过
引用命名空间
using System.IO;
using System.Runtime.Serialization.Formatters.Binary;

代码段:

DataTable dt = new DataTable(); //用来转成byte[]的实例
dt.Columns.Add("a");
dt.Rows.Add("b"); //添加一条测试数据 b
System.IO.MemoryStream memory = new MemoryStream();//使用内存流来存这些byte[]
BinaryFormatter b = new BinaryFormatter();
b.Serialize(memory,dt); //系列化datatable,MS已经对datatable实现了系列化接口,如果你自定义的类要系列化,实现IFormatter 就可以类似做法
byte[] buff = memory.GetBuffer(); //这里就可你想要的byte[],可以使用它来传输
memory.Close();

//假如接收的仍是这个byte[] buff,这样来反系列化

DataTable dt1 = (DataTable)b.Deserialize(new MemoryStream(buff)); //dt1是byte[]转回的datatable
Response.Write(dt1.Rows[0][0].ToString());

//输出的是 "b"

第二种方法

      MemoryStream memory = new MemoryStream();
      System.Xml.XmlTextWriter xtw = new System.Xml.XmlTextWriter(memory, System.Text.Encoding.UTF8);

      dt.WriteXml(memory);
      int count = (int)memory.Length;
      byte[] temp = new byte[count];
      memory.Seek(0, SeekOrigin.Begin);
      memory.Read(temp, 0, count);
      string returnValue = Convert.ToBase64String(temp);
      return returnValue;

       读取字符串信息
            byte[] bstr = Convert.FromBase64String(strType);
            System.Text.Encoding ed=System.Text.Encoding.UTF8;
            string returnValue = ed.GetString(bstr, 0, bstr.Length).Trim();

         //  把字节转换成datatable     

           MemoryStream ms=new MemoryStream(bstr);
           System.Xml.XmlTextReader xtw = new System.Xml.XmlTextReader(ms);
           ds.ReadXml(xtw);

你可以使用以下代码将 Jet 数据库中的表转换byte[] 数组: ```csharp public byte[] ConvertJetTableToByteArray(string connectionString, string tableName) { byte[] byteArray = null; using (OleDbConnection connection = new OleDbConnection(connectionString)) { connection.Open(); // 获取表的记录数 OleDbCommand command = new OleDbCommand($"SELECT COUNT(*) FROM [{tableName}]", connection); int recordCount = (int)command.ExecuteScalar(); // 获取表的字段数和字段类型 command.CommandText = $"SELECT TOP 1 * FROM [{tableName}]"; DataTable schemaTable = new DataTable(); OleDbDataAdapter dataAdapter = new OleDbDataAdapter(command); dataAdapter.FillSchema(schemaTable, SchemaType.Source); int fieldCount = schemaTable.Columns.Count; List<Type> fieldTypes = new List<Type>(); for (int i = 0; i < fieldCount; i++) { fieldTypes.Add(schemaTable.Columns[i].DataType); } // 构造 byte[] 数组 byteArray = new byte[4 + fieldCount * 2 + recordCount * fieldCount * 2]; BinaryWriter binaryWriter = new BinaryWriter(new MemoryStream(byteArray)); binaryWriter.Write(recordCount); binaryWriter.Write(fieldCount); for (int i = 0; i < fieldCount; i++) { binaryWriter.Write((short)Type.GetTypeCode(fieldTypes[i])); binaryWriter.Write((short)Encoding.Unicode.GetByteCount(schemaTable.Columns[i].ColumnName)); binaryWriter.Write(Encoding.Unicode.GetBytes(schemaTable.Columns[i].ColumnName)); } command.CommandText = $"SELECT * FROM [{tableName}]"; OleDbDataReader reader = command.ExecuteReader(); while (reader.Read()) { for (int i = 0; i < fieldCount; i++) { if (reader.IsDBNull(i)) { binaryWriter.Write((short)0); } else { object fieldValue = reader.GetValue(i); byte[] fieldBytes = null; switch (Type.GetTypeCode(fieldTypes[i])) { case TypeCode.Boolean: fieldBytes = BitConverter.GetBytes((bool)fieldValue); break; case TypeCode.Byte: fieldBytes = new byte[] { (byte)fieldValue }; break; case TypeCode.Char: fieldBytes = Encoding.Unicode.GetBytes(new char[] { (char)fieldValue }); break; case TypeCode.DateTime: fieldBytes = BitConverter.GetBytes(((DateTime)fieldValue).ToOADate()); break; case TypeCode.Decimal: fieldBytes = ((decimal)fieldValue).ToByteArray(); break; case TypeCode.Double: fieldBytes = BitConverter.GetBytes((double)fieldValue); break; case TypeCode.Int16: fieldBytes = BitConverter.GetBytes((short)fieldValue); break; case TypeCode.Int32: fieldBytes = BitConverter.GetBytes((int)fieldValue); break; case TypeCode.Int64: fieldBytes = BitConverter.GetBytes((long)fieldValue); break; case TypeCode.Single: fieldBytes = BitConverter.GetBytes((float)fieldValue); break; case TypeCode.String: fieldBytes = Encoding.Unicode.GetBytes((string)fieldValue); break; } binaryWriter.Write((short)fieldBytes.Length); binaryWriter.Write(fieldBytes); } } } binaryWriter.Close(); } return byteArray; } ``` 在上面的代码中,我们首先打开 Jet 数据库连接,并获取目标表的记录数和字段信息。然后,我们使用 `BinaryWriter` 将表的记录和字段写入 `MemoryStream` 中,并将 `MemoryStream` 转换byte[] 数组并返回它。最后,我们关闭 `BinaryWriter` 和 `MemoryStream` 对象以释放资源。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值