簡體   English   中英

帶有額外參數的Eiffel sqlite通話

[英]Eiffel sqlite call with extra parameters

我已經從示例中復制了一些代碼以訪問sqlite數據庫。 它使用代理獲取返回的行:

    check_db (input_line: STRING)

    local

        df_db:       SQLITE_DATABASE
        df_db_query: SQLITE_QUERY_STATEMENT

        test_val: STRING

    do

        test_val := "whatever"

        create df_db.make_open_read_write ("Large.db")

        create df_db_query.make ("SELECT * FROM test_table WHERE test_val =%
                    % :TEST_VAL%
                    % ;", df_db)

        check df_db_query_is_compiled: df_db_query.is_compiled
            end

        df_db_query.execute_with_arguments (agent (returned_row: SQLITE_RESULT_ROW): BOOLEAN
                do
                    if returned_row.is_null (1) then
                        insert_into_db
                    end
                end,
            << create {SQLITE_STRING_ARG}.make  (":TEST_VAL", test_val) >>)

    end -- check_db

我的問題是我想將input_line傳遞給過程insert_into_db。 execute_with_arguments使用的內聯過程無法查看其范圍之外的任何變量,但是我想必須有一種向其傳遞額外參數的方法嗎? 我嘗試過的所有內容都只是拒絕編譯語法錯誤。

在這種情況下,我只是想添加一個尚不存在的數據庫條目,但是我很容易看到我想將返回的行與一些額外數據一起發送到另一個過程的情況,因此它必須可行。

正如您正確指出的那樣,目前,Eiffel中的局部變量不會自動傳遞給內聯代理。 解決方案是向內聯代理添加顯式形式參數,並將相應的實際參數傳遞給它。

該示例中的內聯代理可以進行如下修改(為簡潔起見,省略了帶有參數input_line的外部上下文):

agent (returned_row: SQLITE_RESULT_ROW; s: STRING): BOOLEAN
    do
            -- `s` is attached to `input_line` here.
        if returned_row.is_null (1) then
            insert_into_db
        end
    end (?, input_line)

除了正式的說法s ,將得到的值input_line ,你可以看到實際參數的顯式列表(?, input_line) 問號表示一個開放參數,它將像以前一樣由execute_with_arguments傳遞給代理。 input_line代表一個封閉的參數。

當列表沒有封閉的參數時,如原始代碼中所示,可以將其省略。 但是,在原始代碼中,內聯代理的關鍵字end之后可能已經寫了(?) ,這是絕對明確的。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM