如何检查ADO读取Excel单元格返回的_variant_t是否为NULL?
正确判断ADO读取Excel单元格的空值问题
哎,这个坑我之前也踩过!直接用a.bstrVal == NULL判断根本不靠谱,原因在于_variant_t是个变体类型封装,它的空值状态可不是靠bstrVal是否为空来标识的,得用它专门的判断方式。
给你两种靠谱的解决方法:
方法1:检查变体类型(vt成员)
Excel里的空单元格通常会返回VT_EMPTY或者VT_NULL类型,直接判断这两个值就行:
while (!pRec->adoEOF) { _variant_t a = pRec->Fields->GetItem(long(0))->Value; if (a.vt == VT_NULL || a.vt == VT_EMPTY) { // 这里就是空单元格的情况,写你的处理逻辑 } else { // 处理有数据的场景 } pRec->MoveNext(); }
方法2:使用封装好的IsNull()方法
_variant_t自带了IsNull()方法,更简洁直观,底层已经帮你判断了VT_NULL和VT_EMPTY两种空值状态:
while (!pRec->adoEOF) { _variant_t a = pRec->Fields->GetItem(long(0))->Value; if (a.IsNull()) { // 空单元格处理逻辑 } else { // 正常数据处理 } pRec->MoveNext(); }
额外提醒:处理空白字符串情况
有时候单元格看起来是空,但实际是个空字符串(类型为VT_BSTR,但内容长度为0),如果需要覆盖这种场景,可以再加一层判断:
else if (a.vt == VT_BSTR && _tcslen(a.bstrVal) == 0) { // 处理空白字符串的情况 }
为啥原来的方法无效?因为当变体类型不是VT_BSTR的时候,bstrVal这个成员是未定义的,直接访问可能会导致崩溃或者奇怪的行为;就算是VT_BSTR类型,空字符串和NULL指针也不是一回事,Excel的空单元格大概率不会返回VT_BSTR类型的NULL指针。
内容的提问来源于stack exchange,提问作者Li Kui
相关产品推荐
相关产品推荐

