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文件也不能直接读取,要复制之后才可以的。
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++ CLR 中将数组<System::Byte> 转换为 char*?