带额外参数的Eiffel SQLite调用技术咨询
Eiffel中SQLite带额外参数的
execute_with_arguments调用详解 看你贴的代码里execute_with_arguments的调用写到一半就断了,我来给你捋清楚这个方法怎么带额外参数用。
首先,execute_with_arguments的核心是用代理来处理每一行查询结果,同时你可以给代理绑定额外的自定义参数,不用把所有数据都放到全局变量里。下面给你一步步拆解:
1. 先写好处理行数据的代理过程
你需要先定义一个用来处理查询返回行的过程,这个过程的第一个参数必须是SQLITE_ROW(对应每一行的数据),后面可以加任意你需要的额外参数,比如你代码里的test_val:
process_row (a_row: SQLITE_ROW; a_extra_val: STRING) do -- 这里写处理行的逻辑,比如读取列值 if a_row.has_column ("id") then print ("行ID:" + a_row.integer_value ("id").out + "%N") end if a_row.has_column ("test_val") then print ("存储的值:" + a_row.string_value ("test_val") + "%N") end -- 用你传递的额外参数做事情 print ("额外参数内容:" + a_extra_val + "%N%N") -- 如果想提前停止遍历结果行,就返回False;继续遍历返回True -- Result := True end
2. 正确调用execute_with_arguments
回到你的check_db过程里,补全调用逻辑。这里要注意两个关键点:代理的绑定方式,以及SQL参数的传递:
check_db (input_line: STRING) local df_db: SQLITE_DATABASE df_db_query: SQLITE_QUERY_STATEMENT test_val: STRING query_args: ARRAY[ANY] do test_val := "whatever" create df_db.make_open_read_write ("Large.db") -- 注意SQL语句里的占位符格式,你之前的写法多了空格,改成`:TEST_VAL`就好 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 -- 创建SQL参数数组,对应语句里的`:TEST_VAL` create query_args.make (1, 1) query_args.put (test_val, 1) -- 重点:绑定代理和额外参数 -- `?`是占位符,表示这个参数会由execute_with_arguments自动传入SQLITE_ROW对象 -- 后面的`test_val`就是你要传递的额外参数,会绑定到process_row的第二个参数 df_db_query.execute_with_arguments (agent process_row (?, test_val), query_args) -- 别忘了释放资源 df_db_query.free df_db.close end
3. 几个容易踩的坑
- 代理占位符不能丢:必须用
?来标记由系统传入的SQLITE_ROW参数,不然编译器会提示代理签名不匹配。 - SQL参数类型要匹配:
query_args里的元素类型要和数据库列的类型对应,比如字符串用STRING,整数用INTEGER_32,不然会出现执行错误。 - 资源要及时释放:查询语句用完后要调用
free,数据库要调用close,避免资源泄漏。
内容的提问来源于stack exchange,提问作者shakeshuck
相关产品推荐
相关产品推荐

