Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/ms-access/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
MS Access中SQL查询的奇数结果_Sql_Ms Access - Fatal编程技术网

MS Access中SQL查询的奇数结果

MS Access中SQL查询的奇数结果,sql,ms-access,Sql,Ms Access,好的,这里有一个来自我正在运行的MS Access数据库的奇数 我有一个SQL查询: SELECT * FROM [Service Schedule] WHERE ID=2 AND Volume <= 3000 AND Term='Monthly' AND special = 'Regular' ORDER BY volume 选择* 从[服务时间表] 其中ID=2 音量我不确定你对该表的PK值做了什么,但当你说:“ID=2”时,我听起来很可疑,因为我总是使用代理键(从

好的,这里有一个来自我正在运行的MS Access数据库的奇数

我有一个SQL查询:

SELECT * 
FROM [Service Schedule]
WHERE ID=2 
  AND Volume <= 3000 
  AND Term='Monthly'
  AND special = 'Regular'
ORDER BY volume
选择*
从[服务时间表]
其中ID=2

音量我不确定你对该表的PK值做了什么,但当你说:“ID=2”时,我听起来很可疑,因为我总是使用代理键(从不自然),ID总是PK。由于您没有加入任何表,这告诉我您应该始终期望从结果中得到一行/元组

如果ID不是你的PK,你介意通过评论让我知道吗

也许您需要使用以下命令迭代结果集:
Set.MoveNext

我不确定您对该表的PK值做了什么,但当您说:“ID=2”时,我听起来很可疑,因为我总是使用代理键(从不使用自然键),而ID总是PK。由于您没有加入任何表,这告诉我您应该始终期望从结果中得到一行/元组

如果ID不是你的PK,你介意通过评论让我知道吗

也许您需要使用以下命令迭代结果集:
Set.MoveNext

听起来您希望“看到”所有记录,但我认为您只是在检索第一条记录。我这样说是因为你看到了每个病例的第一个记录。您可能需要移动到记录集中的下一条记录才能看到下一条记录

rsServiceSched.MoveNext

听起来您希望“看到”所有记录,但我认为您只是在检索第一条记录。我这样说是因为你看到了每个病例的第一个记录。您可能需要移动到记录集中的下一条记录才能看到下一条记录

rsServiceSched.MoveNext

您可能没有遍历结果集。 rsServiceSched只是指向第一条记录,它将是卷数最低的记录(根据您的orderby子句)。现在你需要做点什么,然后进入下一个记录


可能会帮助您…

您可能没有在结果集中循环。 rsServiceSched只是指向第一条记录,它将是卷数最低的记录(根据您的orderby子句)。现在你需要做点什么,然后进入下一个记录

可能会帮助您……

离题:DAO记录集记录计数的讨论 DAO记录集的recordcount在.MoveLast之后才能保证准确,但如果记录集返回任何记录,.recordcount将为1或更多

请注意,表类型记录集将立即返回准确的.RecordCount,而不返回.MoveLast,但请记住,不能在链接表上打开表类型记录集。另外,要小心,不要假设您得到了想要的记录集类型,除非您明确指定了它。虽然dbOpenTable是默认的记录集类型,但如果无法将表或SQL字符串作为表类型记录集打开,则它将转而打开动态集。因此,您可以认为您正在使用以下内容打开一个表类型记录集,因为表类型是默认的,并且您已经传递了一个表名:

  Set rs = CurrentDB.OpenRecordset("MyTable")
但是您必须记住,仅仅因为您向它传递了一个表,它就不一定会打开一个表类型的记录集,并且记录计数也不一定准确。如果确实要确保打开的是表类型记录集,则需要明确指定:

  Set rs = CurrentDB.OpenRecordset("MyTable", dbOpenTable)
如果“MyTable”是链接表,则会抛出错误。如果混合使用链接表和本地表,则必须使用两种不同的方法来获取表类型记录集。否则(即,如果您没有指定记录集类型,并在可能的情况下将其设置为表类型,在可能的情况下将其设置为动态集),则需要知道何时需要.MoveLast以获得准确的.RecordCount。如果您真的想在这种情况下提高效率,您将测试记录集的.Type:

  Set rs = CurrentDB.OpenRecordset("MyTable")
  If rs.Type = dbOpenDynaset Then
     rs.MoveLast
  End If
此时,无论记录集是作为表类型还是作为动态集打开,您都将拥有一个准确的.RecordCount属性

但是请记住,很少需要使用完整的记录集来获取记录计数。通常,您只需要检查.RecordCount来查看您的记录集是否返回了任何记录,在这种情况下,您不需要准确的计数

同样,如果要遍历完整的记录集,最终将获得准确的记录计数。也就是说,这样做是毫无意义的:

  Set rs = CurrentDB.OpenRecordset("MyTable")
  rs.MoveLast
  If rs.RecordCount > 0 Then
     .MoveFirst
     Do Until rs.EOF
       [something or other]
       .MoveNext
     Loop
  End If
  Debug.Print rs.RecordCount
在该上下文中完全不需要.MoveLast,因为您不需要知道代码中该点的确切计数

另外,请记住,在某些确实需要知道确切的.RecordCount的上下文中,只使用内置的Access DCount()函数或执行类似操作可能更有效:

  Dim lngRecordCount As Long
  lngRecordCount = CurrentDB.OpenRecordset("SELECT COUNT(*) FROM MyTable")(0)
或:

在不强制记录集指针移动到最后一条记录的情况下,有各种有效的快捷方式来获取准确的记录计数

顺便说一句,纯表类型记录的RecordCount之所以准确,原因之一是它不需要计算——Jet/ACE将RecordCount属性作为其常规操作的一部分进行维护

题外话:ADO记录集记录计数的讨论 由@onedaywhen

对于ADO记录集,
RecordCount
属性将始终是最终值。也就是说,与DAO不同,如果您检查它的值,它就不能随后更改。导航
EOF
不会以任何方式影响ADO的
RecordCount

即使异步获取记录时也是如此(DAO记录集不明确支持这一点):也就是说,即使记录集尚未满,
RecordCount
属性仍然反映最终值(与DAO相比,不是到目前为止获取的记录数)

CursorLocation
CursorType
的某些组合将导致
RecordCount
始终为-1,这意味着不支持该属性。但是
  lngRecordCount = DBEngine.OpenDatabase(Mid(CurrentDB.TableDefs("MyTable").Connect, 11)).TableDefs("MyTable").RecordCount