2010-11-02 64 views
0

我使用VB6读取数据形式mdb文件,并试图读取mdb文件到问题在VB6

Set rs = New ADODB.Recordset 
rs.Open SqlStr, mvarDB 

这是我的条件字符串“ID =‘SA/-AS 0N’和MP <> “N””,有在表中,其ID是上面提到的和其熔点列不是N的记录,但是当

rs.MoveFirst 

在观察窗口我可以看到第一列的值。但是,当运行下面的标题说

rs.Filter = sCriteria 

“:值BOF或EOF为True,或者当前的记录已被删除,所需的操作要求一个当前的记录>:” 欣赏UR帮助。

回答

0

确定的问题是2倍onedaywhen评论是有帮助的,但问题是,

1的mdb文件具有NUMBER的worng数据类型,因此行中的每个空值都会导致记录到达EOF。所以我把数据类型设置为TEXT。

2,找到在记录集中的空我做了

dataSet.Find sCriteria, adSearchForward 'sCriteria = id = 'NW' 

然后我检查此列,如果不为null,

If IsNull(dataSet!col1) Then 

如果发现空我用的是'sCriteria = id ='NW'else else use id ='NW'and mp <>'N'。

工作很好。正如指出的那样,Null正在引发问题。

0

卫队MoveFirst与完整性检查是这样的:

If Not rs.EOF Or Not rs.BOF Then 
    rs.MoveFirst 
End If 
+0

这是不作出任何差别。并且它正在进入if条件,但记录数为0 – PUG 2010-11-02 13:21:56

+0

我的标准字符串是:“id ='SA/-AS 0N'并且mp <>'N'”并且对于mdb中的某些列,没有为此字段写入的内容我想它会是空的。 – PUG 2010-11-02 13:30:39

1

我也同意,检查以确保你有记录的第一次。你不应该需要rs.MoveFirst。

If rs.RecordCount > 0 Then 

rs.Filter = strCriteria 

End If 

也验证你实际上是筛选的列中的记录存在。

希望这会有所帮助。

+0

如果不是rs.EOF或者不是rs.BOF然后给-1,但是如果它是-1,但是接下来我怎么能看到像rs!id这样的值在监视窗口中正确显示 – PUG 2010-11-02 13:19:29

+0

我怎样才能看到记录集? – PUG 2010-11-02 13:22:41

+0

在打开记录集之前,尝试将CursorLocation属性设置为记录集上的adUseClient。 – dretzlaff17 2010-11-03 12:44:01

1

如果mp列的值为NULL,那么使用过滤条件mp <> 'N'将导致将行从过滤的结果集中移除。

SQL采用相同的three-valued logic。这个想法是,mp <> NULL评估以UNKNOWN和结果在SQL DML被删除的行(但保留在SQL DDL ...)

如果您正在使用SQL,那么你可以使用的谓词(mp <>'N' OR mp = NULL)。很遗憾,ADO has a known problem可以阻止在Filter属性条件中使用NULL

3VL疯狂和ADO错误应该引导您得出结论,应该避免使用NULL值。理想情况下,您应该删除数据库中的NULL列。在短期内,您可以确保您的视图和特效不会公开NULL值。您可以使用另一个“魔术”字面值,但可能更好的是返回一个合适的默认域值。例如,它可能是对mp任何值不是N必须Y情况:

SELECT id, IIF(mp = 'N', 'N', 'Y') 
    FROM YourTable; 
0

没有必要做这个

rs.MoveFirst 

记录自动在第一记录位置如果有什么发现

下一步要做这个

If rs.EOF=false Or rs.BOF=false Then 
' manipulate recordset here 
End If