如何在VB.net中使用ROWNUM从MS-Access数据库中检索数据

时间:2013-06-15 16:29:44

标签: vb.net ms-access oledb

我遇到了SELECT查询的麻烦。这是我的程序生成的字符串。

   SELECT 
     CODLFA, POSLFA, ARTLFA, DESLFA, CANLFA, 
     DOCLFA, DTPLFA, DCOLFA, PIVLFA, TIVLFA, CE1LFA 
   FROM
     F_LFA 
   WHERE 
     CODLFA IN 
       (
        SELECT 
          CODFAC 
        FROM 
          F_FAC 
        WHERE 
         TIPFAC = '2' 
         AND FECFAC >= 09-02-2013 
         AND CLIFAC = 21 
         AND ROWNUM = 1 
         ORDER BY CODFAC
        ) 
      AND ARTLFA = '00259' 
      AND CE1LFA = '011'

当我把它放在MS Access的SQL查询设计器中时,会出现一个窗口,要求我输入ROWNUM编号,然后显示正确的行。但在我用VB.net编写的应用程序中它不起作用。这是构造查询的位置。我的程序中的每个其他查询都正常工作。但是这个查询不会检索任何值。这就是为什么我把Fill命令放在一个try语句中,并且因为newAdapter是空的而我失败了。

  For Each LABLrow As DataRow In lalbaranes.Rows
            'obteniendo lineas de facturas que coincidan con la fecha, productos y cliente.
            newAdapter = New OleDb.OleDbDataAdapter("SELECT CODLFA, POSLFA, ARTLFA, DESLFA, CANLFA, DOCLFA, DTPLFA, DCOLFA, PIVLFA, TIVLFA, CE1LFA FROM F_LFA WHERE CODLFA IN (SELECT CODFAC FROM F_FAC WHERE TIPFAC = '2' AND FECFAC >= " & ALBfecha & " AND CLIFAC = " & CLIabl & " AND ROWNUM = 1 ORDER BY CODFAC) AND ARTLFA = '" & LABLrow(1) & "' AND CE1LFA = '" & LABLrow(6) & "'", dataConnection)
            newCommand = New OleDb.OleDbCommandBuilder(newAdapter)
            'graba los resultados en la tabla lboletas
            lboletas.Clear()
            Try
                newAdapter.Fill(lboletas)
                newCommand.Dispose()
                newAdapter.Dispose()

我应该如何只选择F_FAC中的第一行?

PD:抱歉我的英语不好。

1 个答案:

答案 0 :(得分:2)

ROWNUM是一个Oracle“伪列”,在Access SQL中没有直接的等价物。 Access会提示您输入值,因为ROWNUM未被识别为列名,因此它会要求您提供值。如果您要检查在VB.NET中尝试查询时收到的错误消息,您将看到

  

没有给出一个或多个必需参数的值。

同样,这是因为ROWNUM无效Access SQL。

出于您的目的,Access等效项将是......

SELECT TOP 1 FROM ...

...但请注意,如果ORDER BY排序中存在“tie”,则Access 中的TOP 1可能会返回多行。在您的情况下,如果有两行具有相同的[CODFAC],则Access中的SELECT TOP 1 ...实际上将返回两行。