Vb.net 缓冲区不能为空
我尝试从gridview下载文件。。我在数据库中保存文件,然后在网格视图中显示我尝试了这个 我将文件保存在数据库表中而不是文件夹中,所以我尝试下载文件 当我这样做的时候,这个文档是下载的,但是当我调试代码并检查这一行时出现了问题 Dim row=数据库存储结果表(0).行(i) 结果显示Vb.net 缓冲区不能为空,vb.net,gridview,download,Vb.net,Gridview,Download,我尝试从gridview下载文件。。我在数据库中保存文件,然后在网格视图中显示我尝试了这个 我将文件保存在数据库表中而不是文件夹中,所以我尝试下载文件 当我这样做的时候,这个文档是下载的,但是当我调试代码并检查这一行时出现了问题 Dim row=数据库存储结果表(0).行(i) 结果显示 docid document docname docextension 1014 System.Byte[] Book2.xlsx .xlsx 然后,当我
docid document docname docextension
1014 System.Byte[] Book2.xlsx .xlsx
然后,当我继续进行时,docname显示“1912218726836.xlsx”,并且文件下载已损坏这两行代码一起是错误的:
Dim binary() As Byte = TryCast(structDb.dstResult.Tables(0).Rows(i).Item("document"), Byte())
Dim ms As MemoryStream = New MemoryStream(binary)
使用TryCast的原因是,您试图转换的对象可能不是您试图转换为的类型。在这种情况下,TryCast
将返回Nothing
。在使用TryCast
之后,应始终进行无任何内容的测试,这是您尚未完成的。您正在使用结果,就好像您确信将存在该类型的对象一样。如果您知道这一点,那么您应该使用DirectCast
,而不是TryCast
即使您确实知道引用不会指向其他类型的对象,并且您使用了DirectCast
,但是如果您强制转换空引用,即Nothing
,那么您仍然会得到Nothing
。因此,首先需要确定structDb.dstreult.Tables(0).Rows(i).Item(“document”)
是否可以引用类型不同于Byte()
的对象。如果不能,则使用DirectCast
而不是TryCast
。无论是哪种方式,该表达式似乎都可以生成Nothing
,因此您需要检查Nothing
,例如
Dim binary() As Byte = TryCast(structDb.dstResult.Tables(0).Rows(i).Item("document"), Byte())
If binary IsNot Nothing Then
Dim ms As MemoryStream = New MemoryStream(binary)
'...
End If
编辑:如果列可为null,则需要首先测试行是否包含null,然后仅在存在以下数据时使用数据:
Dim row = structDb.dstResult.Tables(0).Rows(i)
If Not row.IsNull("document") Then
'There is data so go ahead and use it.
Dim binary = DirectCast(row("document"), Byte())
'...
请不要在发布问题后立即要求帮助。如果可以的话,我们会尽快解决的。我们都是志愿者,分散在世界各地不同的时区。没有人会因为那些毫无意义的评论而帮上忙,而这些评论本来是不会帮上忙的。看看这个问题的标题。这个问题得到解决了吗?如果是这样,要么接受解决问题的答案,要么添加自己的答案。如果您有不同的问题,请将其发布到新线程中。OKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKK?您是否认为DBNull
会神奇地变成Byte()
?显然,您有一个可为null的列,并且该列中的某些行包含null。当没有数据可供使用时,您预计会发生什么?如果没有数据,不要尝试使用数据。还有,你为什么不首先提供这些信息?这样可以节省一些浪费的时间。我将用更合适的代码片段更新我的答案。我尝试了你的答案检查更新的问题请@jmchilhinney