代码之家  ›  专栏  ›  技术社区  ›  Charles

试图读取大于文件最大密钥大小的密钥

  •  1
  • Charles  · 技术社区  · 4 年前

    我正在运行一个程序来帮助记录我们30多年的数据库中包含的内容。在此过程中,我收到以下错误消息:

    Attempted READ of record ID larger than file/table maximum record ID size of 255 characters.
    

    我的程序是这样工作的:

    LOOP WHILE I <= NUM.FILES
        RECORD          = ""
        FILENAME        = FILE.LIST<I>
        ERROR           = ""
        DEBUG.RECORD    = ""
        HAVE.LOOKED     = 0
        OPEN 'DICT ':FILENAME TO D.FILE THEN
            OPEN FILENAME TO T.FILE THEN
                STATEMENT   = "SSELECT ONLY DICT ":FILENAME:' BY FIELD.NO WITH FIELD.NO >= 0 AND WITH FIELD.NO <= 900 AND WITH FIELD # ".]"'
                DEBUG       = ""
                PRINT FILENAME
                EXECUTE STATEMENT RETURNING DEBUG
                LOOP WHILE READNEXT FIELDNAME DO
                    READ FIELD.RECORD FROM D.FILE, FIELDNAME THEN
                        IF LEN(FIELDNAME) > BIGGEST.KEY.LEN THEN
                            BIGGEST.KEY         = FIELDNAME
                            BIGGEST.KEY.LEN     = LEN(FIELDNAME)
                            BIGGEST.KEY.FILE    = "DICT ": FILENAME
                            PRINT FILENAME:" ":LEN(FIELDNAME):" ":FIELDNAME
                        END
                        USE.COUNT           = ""
                        USE.LIST            = ""
                        USE.COUNT.STATEMENT = "SELECT ":FILENAME:" WITH ":FIELDNAME:' # ""'
                        DEBUGS              = ""
                        EXECUTE USE.COUNT.STATEMENT RTNLIST USE.LIST RETURNING DEBUGS
                        ROW         = ""
                        ROW<1,1>    = FIELD.RECORD<2>   ;   *Attribute Number
                        ROW<1,2>    = FIELDNAME         ;   *Field Name
                        ROW<1,3>    = FIELD.RECORD<1>   ;   *Field Type
                        ROW<1,4>    = FIELD.RECORD<10>  ;   *Field Size
                        ROW<1,5>    = FIELD.RECORD<12>  ;   *Is Multivalued: "" = no, "Y" = Multivalued, "###" = specific multivalue
                        ROW<1,6>    = FIELD.RECORD<13>  ;   *Is Subvalued: "" = no, "Y" = Subvalued, "###" = specific subvalue
                        ROW<1,7>    = FIELD.RECORD<7>   ;   *Automatic data output conversion
                        ROW<1,8>    = FIELD.RECORD<8>   ;   *Correlative field definition
                        ROW<1,9>    = FIELD.RECORD<11>  ;   *Field description
                        ROW<1,10>   = @SELECTED         ;   *Number of records that don't have this field blank
                        RECORD<-1>  = ROW
                        IF ROW<1,10> < 1 THEN
                            READ UNUSED.FIELDS FROM CHUCK.WORK, "FILE.DEBUG.UNUSED.FIELDS" ELSE
                                UNUSED.FIELDS = ""
                            END
                            UNUSED.FIELDS<-1> = FILENAME:VM:ROW
                            WRITE UNUSED.FIELDS ON CHUCK.WORK, "FILE.DEBUG.UNUSED.FIELDS"
                        END
                        IF FIELD.RECORD<2> = 0 AND @SELECTED > 0 AND HAVE.LOOKED = 0 THEN
                            LOOP WHILE READNEXT KEY FROM USE.LIST DO
                                IF LEN(KEY) > BIGGEST.KEY.LEN THEN
                                    BIGGEST.KEY         = KEY
                                    BIGGEST.KEY.LEN     = LEN(KEY)
                                    BIGGEST.KEY.FILE    = FILENAME
                                    PRINT FILENAME:" ":LEN(KEY):" ":KEY
                                END
                            REPEAT
                            HAVE.LOOKED = 1
                        END
                    END
                REPEAT
            END ELSE
                ERROR<-1> = "Failed to open file '":FILENAME:"'"
            END
        END ELSE
            ERROR<-1> = "Failed to open file DICT '":FILENAME:"'"
        END
        WRITE RECORD ON CHUCK.WORK, "FILE.":FILENAME
        WRITE DEBUG.RECORD ON CHUCK.WORK, "FILE.DEBUG.":FILENAME
        READ CHUCK.LOG FROM CHUCK.WORK, "CHUCK.LOG" ELSE
            CHUCK.LOG = ""
        END
        CHUCK.LOG<-1> = "FILE '":FILENAME:"' had ":DCOUNT(RECORD,AM):" fields"
        IF ERROR THEN
            CHUCK.LOG<-1>   = ERROR
            ERRORS<-1>      = ERROR
        END
        WRITE CHUCK.LOG ON CHUCK.WORK,"CHUCK.LOG"
        CLEARSELECT
        I = I + 1
    REPEAT
    

    当我直接查看数据库时,我在文件中找不到任何超过35个字符的记录ID或密钥,这导致了问题,在整个数据库中也找不到超过70个字符的记录ID或密钥。有谁能帮助确定为什么这些记录在这个过程中被标记,但无法直接发现?

    下面是我编写的一个程序,专门查找有问题的记录,但它找不到罪魁祸首

    OPEN "CHUCK.WORK" TO CHUCK.WORK ELSE
            PRINT "UNABLE TO OPEN CHUCK.WORK"
            RETURN
        END
        READ FILENAME FROM CHUCK.WORK, "LISTME" ELSE
            PRINT "UNABLE TO READ LISTME"
            RETURN
        END
        NUM.FILES = DCOUNT(FILENAME,AM)
        FOR I = 1 TO NUM.FILES
            OPEN FILENAME<I> TO T.FILE ELSE
                PRINT "UNABLE TO OPEN ":FILENAME<I>
                RETURN
            END
            EXECUTE 'SELECT ':FILENAME<I>
            LOOP WHILE READNEXT KEY DO
                IF LEN(KEY) > 20 THEN
                    PRINT FILENAME<I>:" ":LEN(KEY):" ":KEY
                END
            REPEAT
        NEXT I
    

    使现代化

    我的一位同事找到了问题的根源,尽管我们还没有找到解决问题的方法: 我们的一个文件有一个多值字段,该字段是一个相关文件中使用的键。出于某种原因,Universe试图读取整个属性,而不是单个多值作为键,这会导致长记录ID。有人能看到我的代码中是否有错误,或者数据库中是否有我们需要查看的设置吗?

    0 回复  |  直到 3 年前
        1
  •  0
  •   Van Amburg    3 年前

    当您看到这个错误时,它与文件中键的大小无关,只是您试图读取的@ID超过255个字符。当我看到它时,通常会告诉我它发生在源代码中的哪一行。如果你把这个放在那条线之前,你应该能找到它。

    IF LEN(THIS.ID) GT 255 THEN
       DEBUG
    END
    

    编辑显然,这种情况下的错误是没有参考行号。我不确定这是否是为了清晰起见而省略的,或者是宇宙风味的某种差异,但我现在相信它的缺失是一种暗示,错误消息来自shell,而不是解释器。

    OPEN '','VOC' TO FILE.VOC ELSE STOP "CANNOT OPEN FILE VOC"
    STMT = "SELECT VAL WITH ":STR("A",256):" EQ 0"
    EXECUTE STMT RTNLIST USE.LIST RETURNING DEBUGS
    CRT "**************************************"
    READ TEST FROM FILE.VOC,STR("A",256) ELSE NULL
    END
    

    在我的系统上输出这个。

    >RUN TEST.SC TEST.LONG.ID
    Attempted READ of record ID larger than file/table maximum
    record ID size of 255 characters.
    RetrieVe: syntax error.  Unexpected sentence without filename.  Token was "".
              Scanned command was SELECT 'VAL' WITH 'AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
    AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
    AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
    AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA' EQ '0'
    **************************************
    Program "TEST.LONG.ID": Line 5, Attempted READ of record ID larger than file/t
    able maximum
    record ID size of 255 characters.
    >
    

    第一条看起来像是您的错误消息,指向您正在构建的一条动态SELECT语句@ID是记录钥匙的同义词,为了进一步进行类比,你似乎正试图用一把大得滑稽的“城市钥匙”解锁你的自行车。