C# 无法将类型为“System.Byte[]”的对象强制转换为类型“System.Data.DataTable

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了C# 无法将类型为“System.Byte[]”的对象强制转换为类型“System.Data.DataTable相关的知识,希望对你有一定的参考价值。

byte[] strbyte = new WebClient().DownloadData(str);
// File.WriteAllBytes("D:\\我的文档\\桌面\\a.xls", strbyte);
//MessageBox.Show("ok");
//MemoryStream bytememorystream = new MemoryStream(System.Text.Encoding.Default .GetBytes("<?xml version = \"1.0\" encoding =\"iso-8859-1\"?>"+ strbyte));
MemoryStream bytememorystream = new MemoryStream();
BinaryFormatter binaryformatter = new BinaryFormatter();
binaryformatter.Serialize(bytememorystream, strbyte);
bytememorystream.Position = 0;
dt = (DataTable)binaryformatter.Deserialize(bytememorystream);
/*
System.Xml.XmlTextReader xtr = new System.Xml.XmlTextReader(bytememorystream);
dt.ReadXml(xtr);
dt.ReadXml(bytememorystream);
* /
从网站上抓取到了数据,放在 byte[] strbyte 里,如何放到DataTable中?

急!!!!!!!!!!!!!!!!!
不知道,我所有从网站下载的XLS文件或直接用此程序下载的XLS文件都要经过复制后程序才能读取,要不然显示“外部表不是预期的格式”,网上也是这么说的。我的EXCEL版本是2003, 我用此程序生成的EXCEL文件也不能直接读取,要复制之后才可以的。

参考技术A System.Runtime.Serialization.Formatters.Binary.BinaryFormatter bf = new System.Runtime.Serialization.Formatters.Binary.BinaryFormatter();
DataTable dt= bf.Deserialize(new System.IO.MemoryStream(strdata)) as DataTable;追问

二进制流“219”不包含有效的 BinaryHeader。这可能是由于无效流,或由于在序列化和反序列化之间的对象版本更改。 用您的语句后出现这个错误。

参考技术B 你确定strdata里面的数据是一个datatable序列化后的数据吗?追问

strbyte 不是序列后的数据,是从网站抓取下来的new WebClient().DownloadData(str);要把它放到datatable里去。

追答

要放到datatable里面去?那你自己新建啊,为啥要用反序列化?反序列化不是干这个事儿的。反序列化的意思是,如果你原始数据是一个datatable对象序列化出来的,那么可以通过反序列化还原这个原始的对象和它的内容。你这里应该自己建对象自己放值进去。

追问

datatable的格式已经建好了,我的目标是将下载的数据放到datatable里。怎么放进去我不知道,谢谢,现在的程序已经能下载成XLS文件,但这不是我的目标。

追答

你是说下载的是xls文件?那就保存成临时文件后用读取数据库的方法读出来吧。可以支持excel文件的。具体的百度一下吧。

追问

下载XLS文件这个程序是没有问题的,那样太麻烦了,而且XLS文件还要手工复制后C#才能读取,要不然格式是套不上的。我要将数据直接放到datatable里面去

追答

什么叫格式套不上?标准的xls文件是可以直接读取的。难道你下载的本身也是html类似的冒牌excel文件

追问

不知道,我所有从网站下载的XLS文件或直接用此程序下载的XLS文件都要经过复制后程序才能读取,要不然显示“外部表不是预期的格式”,网上也是这么说的。我的EXCEL版本是2003, 我用此程序生成的EXCEL文件也不能直接读取,要复制之后才可以的。

追答

复制xls的内容?用记事本打开看看是不是乱码还是什么字符内容。

追问

不是乱码,非常正常的XLS文件,放到XLS里麻烦死了,我每天要放3000个数据文件,每个文件3000~10000行。

追答

XLS是用行来计数的?你的是CSV文件吧?!XLS本身是二进制文件怎么可能用行来计数,而且正常的XLS文件用记事本打开是乱码。如果本身是文本格式,就自己写程序解析吧。

追问

你能帮我把数据直接下载到DATATABLE里吗?
我的那些.XLS确定可能用记事本打开,但我下载的时候是用.XLS的啊,怎么变成了CSV呢,下载 到CSV里然后再转到DATATABLE里,这样太慢,帮帮我吧!!

追答

这个我没法帮你。网上很多下载xls的文件都是假的。内容都是HTML代码或CSV代码,也就是内容和扩展名不匹配,但excel都能识别并自动打开而已。所以这个时候你就只能自己逐行去解析内容了。

本回答被提问者采纳
参考技术C 他俩类型不匹配。你得转换一下类型。追问

我不知道如何转换啊! 他们分别是什么类型

追答

一个byte ,一个 DataTable。你转换成一个类型。在网上找下类型转换就有的

追问

网上说是序列化和反序列化的问题,是不是的啊

C#调用C++的DLL搜集整理的所有数据类型转换方式

   //C#调用C++的DLL搜集整理的所有数据类型转换方式,可能会有重复或者多种方案,自己多测试
   //c++:HANDLE(void *) ---- c#:System.IntPtr  
   //c++:Byte(unsigned char) ---- c#:System.Byte  
   //c++:SHORT(short) ---- c#:System.Int16  
   //c++:WORD(unsigned short) ---- c#:System.UInt16  
   //c++:INT(int) ---- c#:System.Int16
   //c++:INT(int) ---- c#:System.Int32  
   //c++:UINT(unsigned int) ---- c#:System.UInt16
   //c++:UINT(unsigned int) ---- c#:System.UInt32
   //c++:LONG(long) ---- c#:System.Int32  
   //c++:ULONG(unsigned long) ---- c#:System.UInt32  
   //c++:DWORD(unsigned long) ---- c#:System.UInt32  
   //c++:DECIMAL ---- c#:System.Decimal  
   //c++:BOOL(long) ---- c#:System.Boolean  
   //c++:CHAR(char) ---- c#:System.Char  
   //c++:LPSTR(char *) ---- c#:System.String  
   //c++:LPWSTR(wchar_t *) ---- c#:System.String  
   //c++:LPCSTR(const char *) ---- c#:System.String  
   //c++:LPCWSTR(const wchar_t *) ---- c#:System.String  
   //c++:PCAHR(char *) ---- c#:System.String  
   //c++:BSTR ---- c#:System.String  
   //c++:FLOAT(float) ---- c#:System.Single  
   //c++:DOUBLE(double) ---- c#:System.Double  
   //c++:VARIANT ---- c#:System.Object  
   //c++:PBYTE(byte *) ---- c#:System.Byte[]  
 

   //c++:BSTR ---- c#:StringBuilder
   //c++:LPCTSTR ---- c#:StringBuilder
   //c++:LPCTSTR ---- c#:string
   //c++:LPTSTR ---- c#:[MarshalAs(UnmanagedType.LPTStr)] string  
   //c++:LPTSTR 输出变量名 ---- c#:StringBuilder 输出变量名
   //c++:LPCWSTR ---- c#:IntPtr
   //c++:BOOL ---- c#:bool   
   //c++:HMODULE ---- c#:IntPtr   
   //c++:HINSTANCE ---- c#:IntPtr  
   //c++:结构体 ---- c#:public struct 结构体{};  
   //c++:结构体 **变量名 ---- c#:out 变量名 //C#中提前申明一个结构体实例化后的变量名
   //c++:结构体 &变量名 ---- c#:ref 结构体 变量名
     
 

   //c++:WORD ---- c#:ushort
   //c++:DWORD ---- c#:uint
   //c++:DWORD ---- c#:int
 

   //c++:UCHAR ---- c#:int
   //c++:UCHAR ---- c#:byte
   //c++:UCHAR* ---- c#:string
   //c++:UCHAR* ---- c#:IntPtr
 

   //c++:GUID ---- c#:Guid
   //c++:Handle ---- c#:IntPtr
   //c++:HWND ---- c#:IntPtr
   //c++:DWORD ---- c#:int
   //c++:COLORREF ---- c#:uint
 



   //c++:unsigned char ---- c#:byte
   //c++:unsigned char * ---- c#:ref byte
   //c++:unsigned char * ---- c#:[MarshalAs(UnmanagedType.LPArray)] byte[]
   //c++:unsigned char * ---- c#:[MarshalAs(UnmanagedType.LPArray)] Intptr
 

   //c++:unsigned char & ---- c#:ref byte
   //c++:unsigned char 变量名 ---- c#:byte 变量名
   //c++:unsigned short 变量名 ---- c#:ushort 变量名
   //c++:unsigned int 变量名 ---- c#:uint 变量名
   //c++:unsigned long 变量名 ---- c#:ulong 变量名
 

   //c++:char 变量名 ---- c#:byte 变量名 //C++中一个字符用一个字节表示,C#中一个字符用两个字节表示
   //c++:char 数组名[数组大小] ---- c#:MarshalAs(UnmanagedType.ByValTStr, SizeConst = 数组大小)] public string 数组名; ushort
 

   //c++:char * ---- c#:string //传入参数
   //c++:char * ---- c#:StringBuilder//传出参数
   //c++:char *变量名 ---- c#:ref string 变量名
   //c++:char *输入变量名 ---- c#:string 输入变量名
   //c++:char *输出变量名 ---- c#:[MarshalAs(UnmanagedType.LPStr)] StringBuilder 输出变量名
 

   //c++:char ** ---- c#:string
   //c++:char **变量名 ---- c#:ref string 变量名
   //c++:const char * ---- c#:string
   //c++:char[] ---- c#:string
   //c++:char 变量名[数组大小] ---- c#:[MarshalAs(UnmanagedType.ByValTStr,SizeConst=数组大小)] public string 变量名;  
 

   //c++:struct 结构体名 *变量名 ---- c#:ref 结构体名 变量名
   //c++:委托 变量名 ---- c#:委托 变量名
 

   //c++:int ---- c#:int
   //c++:int ---- c#:ref int
   //c++:int & ---- c#:ref int
   //c++:int * ---- c#:ref int //C#中调用前需定义int 变量名 = 0;
 

   //c++:*int ---- c#:IntPtr
   //c++:int32 PIPTR * ---- c#:int32[]
   //c++:float PIPTR * ---- c#:float[]
     
 

   //c++:double** 数组名 ---- c#:ref double 数组名
   //c++:double*[] 数组名 ---- c#:ref double 数组名
   //c++:long ---- c#:int
   //c++:ulong ---- c#:int
     
   //c++:UINT8 * ---- c#:ref byte //C#中调用前需定义byte 变量名 = new byte();   
 



   //c++:handle ---- c#:IntPtr
   //c++:hwnd ---- c#:IntPtr
     
     
   //c++:void * ---- c#:IntPtr   
   //c++:void * user_obj_param ---- c#:IntPtr user_obj_param
   //c++:void * 对象名称 ---- c#:([MarshalAs(UnmanagedType.AsAny)]Object 对象名称
 



    
   //c++:char, INT8, SBYTE, CHAR ---- c#:System.SByte   
   //c++:short, short int, INT16, SHORT ---- c#:System.Int16   
   //c++:int, long, long int, INT32, LONG32, BOOL , INT ---- c#:System.Int32   
   //c++:__int64, INT64, LONGLONG ---- c#:System.Int64   
   //c++:unsigned char, UINT8, UCHAR , BYTE ---- c#:System.Byte   
   //c++:unsigned short, UINT16, USHORT, WORD, ATOM, WCHAR , __wchar_t ---- c#:System.UInt16   
   //c++:unsigned, unsigned int, UINT32, ULONG32, DWORD32, ULONG, DWORD, UINT ---- c#:System.UInt32   
   //c++:unsigned __int64, UINT64, DWORDLONG, ULONGLONG ---- c#:System.UInt64   
   //c++:float, FLOAT ---- c#:System.Single   
   //c++:double, long double, DOUBLE ---- c#:System.Double   
 

   //Win32 Types ---- CLR Type   
     
 

   //Struct需要在C#里重新定义一个Struct
   //CallBack回调函数需要封装在一个委托里,delegate static extern int FunCallBack(string str);
 

   //unsigned char** ppImage替换成IntPtr ppImage
   //int& nWidth替换成ref int nWidth
   //int*, int&, 则都可用 ref int 对应
   //双针指类型参数,可以用 ref IntPtr
   //函数指针使用c++: typedef double (*fun_type1)(double); 对应 c#:public delegate double fun_type1(double);
   //char* 的操作c++: char*; 对应 c#:StringBuilder;
   //c#中使用指针:在需要使用指针的地方 加 unsafe
 



   //unsigned char对应public byte
   /*
   * typedef void (*CALLBACKFUN1W)(wchar_t*, void* pArg);
   * typedef void (*CALLBACKFUN1A)(char*, void* pArg);
   * bool BIOPRINT_SENSOR_API dllFun1(CALLBACKFUN1 pCallbackFun1, void* pArg);
   * 调用方式为
   * [UnmanagedFunctionPointer(CallingConvention.Cdecl)]
   * public delegate void CallbackFunc1([MarshalAs(UnmanagedType.LPWStr)] StringBuilder strName, IntPtr pArg);
   *  
   *  
   */

 

以上是关于C# 无法将类型为“System.Byte[]”的对象强制转换为类型“System.Data.DataTable的主要内容,如果未能解决你的问题,请参考以下文章

C# 连接MYSQL 返回查询结果时某些字段显示System.Byte[]的问题

C#调用C++的DLL搜集整理的所有数据类型转换方式

如何在 C++ CLR 中将数组<System::Byte> 转换为 char*?

从 c# 查询 MySQL 返回 System.Byte[]

如何从数据库中检索位图图像?

如何在 System.IO.Stream 中转换 System.Byte[]?