我试图在一个SQLite数据库中访问一个Blob列,它最终会指向文件或内存中的记录。我正在尝试在SQLite中使用.GetBytes方法来获取将代表我的数据的字节数组。使用此方法时,我不断收到InvalidCastException。一切似乎都已到位并且程序编译得很好,但在运行时这个异常会不断被抛出。我四处寻找答案,一切似乎都与我所拥有的代码一致,所以我在这里不知所措,不幸的是我在C#中找不到任何关于SQLite的好文档。代码如下
public byte[] Output()
{
byte[] temp = null;
int col = Columns + 1;
if(read.Read())
{
read.GetBytes(col, 0, temp, 0, 2048); //exception is thrown here
}
return temp;
}
我已经能够读取数据库中的其他列是整数和文本,但由于某种原因似乎无法使blob正确。
编辑:新信息,这是异常的堆栈跟踪:
StackTrace:
at System.Data.SQLite.SQLiteDataReader.VerifyType(Int32 i, DbType typ)
at System.Data.SQLite.SQLiteDataReader.GetBytes(Int32 i, Int64 fieldOffset, Byte[] buffer, Int32 bufferoffset, Int32 length)
at SQLiteSort.Sort.Output() in C:\Users\cjones\Documents\Visual Studio 2010\Projects\ConsoleApplication1\ConsoleApplication1\Sort.cs:line 192
at SQLiteSort.Sort.Main(String[] args) in C:\Users\cjones\Documents\Visual Studio 2010\Projects\ConsoleApplication1\ConsoleApplication1\Sort.cs:line 72
at System.AppDomain._nExecuteAssembly(RuntimeAssembly assembly, String[] args)
at System.AppDomain.ExecuteAssembly(String assemblyFile, Evidence assemblySecurity, String[] args)
at Microsoft.VisualStudio.HostingProcess.HostProc.RunUsersAssembly()
at System.Threading.ThreadHelper.ThreadStart_Context(Object state)
at System.Threading.ExecutionContext.Run(ExecutionContext executionContext, ContextCallback callback, Object state, Boolean ignoreSyncCtx)
at System.Threading.ExecutionContext.Run(ExecutionContext executionContext, ContextCallback callback, Object state)
at System.Threading.ThreadHelper.ThreadStart()
InnerException:
SQLiteDataReader.VerifyType()似乎抛出异常,这是查看用于DbType.Binary类型的列,如果列不是DbType.Binary,DbType.String或DbType,则抛出异常.Guid。我一遍又一遍地检查了表格,它仍然将列类型显示为blob。
答案 0 :(得分:1)
它抛出一个InvalidCastException
的事实当然是错误的,但你的代码 已经破坏 - temp
将为null,这肯定不应该。您没有在任何地方提供要读取的数据。
你还没有注意到GetBytes
的回复价值,我希望你这样做......
编辑:只是为了检查......你 试图从适当的列中读取,对吗?如果您尝试在(例如)整数列上调用InvalidCastException
,GetBytes
会更合适。
答案 1 :(得分:0)
我终于通过使用参数并将我的Blob设置为DbType.Binary来解决问题。不知道为什么这与我以前做的如此不同,但现在一切正常。