[英]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.