首页 文章

在Visual FoxPro中更新顶部

提问于
浏览
0

我正在通过C#应用程序中的VFP OleDB提供程序访问Visual FoxPro表(DBF文件) . VFP中是否有等效的 UPDATE TOP (MS SQL)?

这是我目前的查询:

UPDATE HM_LIST
SET 
  HM_DATE=DATE(2014,5,22) , 
  HM_STATION="CM_PC" , 
  HM_TIME="17:06" , 
  HM_USER="TEST" 
WHERE 
  HM_STATION='' 
  AND HM_TIME='' 
  AND HM_USER=''

问题是,所有行都与我的参数匹配 . 但我想只更新其中一个匹配的行 .

没有Primary_Key . 我不能用 INSERT .

Table

Screenshot

4 回答

  • 1

    如果您在Foxpro中运行上述查询,由于您正在使用的WHERE条件,每个行都将在您声明时更新 .

    当您指定“Where column1 =''”时,每行都将生效 . 尝试在条件中指定值,例如“Where column1 ='somevalue'”或“Where EMPTY(column1)”

  • 1

    使用WHERE子句如下:

    WHERE RECNO()=1
    
  • 0

    有了奥列格的暗示,我找到了缺少主键的解决方法 .

    但它需要两个Querys

    首先选择匹配行的 Record Number 别名 RECNO .

    SELECT RECNO() FROM table_name WHERE foo=''
    

    现在读取Result的第一行(这是行的“id”)

    将其保存为变量( int row_id ),并在 WHERE 仅在以下行的 UPDATE 查询之后放置: "RECNO() ="+row_id

    示例:

    var MyOleDBCommand = MyOleDBConnection.CreateCommand();
    MyOleDBCommand.CommandText = "SELECT RECNO() FROM table_name WHERE foo=''";
    
    int row_id = -1;
    
    /** Search for some matching rows **/
    using(var reader = MyOleDBCommand.ExecuteReader()){
     // Check if something was found
     if(reader.HasRows){
       reader.Read(); // Read only the first row (or use a for-loop if you need more then 1)
       row_id = (int)reader.GetDecimal(0);
     }
    }
    /** If a matching row was found **/
    if(row_id > -1){
      MyOleDBCommand.CommandText = "UPDATE table_name SET foo='bar' WHERE RECNO()="+row_id;
      if(MyOleDBCommand.ExecuteNonQuery()>0){
        //Successfully Updatet
      }}
    }
    

    Remarks: RECNO的类型为 Decimal ,因此您必须使用 GetDecimal(0) (参见示例代码)

  • 0

    一般来说, this is what primary keys are for. 无论索引与否,都应该有一个唯一标识每条记录的字段,并允许您将更新定位到该特定记录而不是整个集合 .

    UPDATE HM_LIST
    SET 
      HM_DATE=DATE(2014,5,22) , 
      HM_STATION="CM_PC" , 
      HM_TIME="17:06" , 
      HM_USER="TEST" 
    WHERE 
      HM_ID = 1
    

    如果该字段没有罢工#2,那么设计非常糟糕,应该放弃,就在你无法插入新行之后 . 除非这是一个理论练习,否则有更好的工具来完成你所追求的任何事情 .


    也就是说,对于特定的例子,这是一个罕见的例子,其中与SQL的混乱实际上使你的生活更加艰难 .

    FoxPro的核心是 not 一种基于集合的语言,如SQL . 相反,它想要处理整个集合,并且由于某种原因仍然在FoxPro中进行编程,你可以通过拥抱xBase并运行它来轻松实现这一目标 .

    SELECT HM_LIST
    LOCATE FOR FOR HM_STATION='' AND HM_TIME='' AND HM_USER=''
    
    IF FOUND()
      REPLACE IN HM_LIST                ;
          HM_DATE WITH DATE(2014,5,22)  ;
        , HM_STATION WITH "CM_PC"       ;
        , HM_TIME WITH "17:06"          ;
        , HM_USER WITH "TEST"       
    ENDIF
    

相关问题