我使用Erlang ODBC连接到数据库源。我的代码如下:
main() ->
Sql = "SELECT 1",
Connection = connect(),
case odbc:sql_query(Connection, Sql) of
{selected, Columns, Results} ->
io:format("Success!~n Columns: ~p~n Results: ~p~n",
[Columns, Results]),
ok;
{error, Reason} ->
{error, Reason}
end.
connect() ->
ConnectionString = "DSN=dsn_name;UID=uid;PWD=pqd",
odbc:start(),
{ok, Conn} = odbc:connect(ConnectionString, []),
Conn.
现在好了。但是我怎样才能至少在查询中处理错误?据我所知,它包含在{error, Reason}
中,但是当出现问题时如何输出呢?我试图在第一个条款中添加io:format,但它不起作用。
第二,遗憾的是,我无法找到任何可以很好地解释语法的参考资料,我无法理解ok
在此代码中的含义(第一行8和第二行 - 第16行。如果我是对的,那只是意味着连接正常并且没有分配这个变量?但它在8行意味着什么?)
答案 0 :(得分:1)
ok
是对odbc:sql_query(Connection, Sql)
的调用返回可与表达式{selected, Columns, Results}
匹配的结果时case语句的返回值。在这种情况下它是无用的,因为函数io:format(...)
已经返回ok
。
第二个ok:{ok, Conn}
是一个非常常见的Erlang用法:该函数在成功时返回元组{ok,Value}
,在失败时返回{error,Reason}
。因此,您可以匹配成功案例并使用以下一行提取返回的值:{ok, Conn} = odbc:connect(ConnectionString, []),
在这种情况下,函数connect()
不处理错误情况,因此此代码有4种不同的行为:
{error,Reason}
。{selected, Columns, Results}
不匹配的答案:进程将在第4行出现badmatch错误。{selected, Columns, Results}
匹配的答案:函数将打印 Success!
Columns: Column
Results: Result
并返回ok
答案 1 :(得分:0)
所以我找到了一些东西。 {error,Reason}包含连接错误,意味着我们指定了错误的DSN名称等。关于我提出的查询错误,我们可以从Erlang参考中读到这个:
Gaurds 所有API函数都受到保护,如果您传递参数 错误的类型将发生运行时错误。所有输入参数 内部函数被认为是正确的。这是一个很好的编程 实践只是不信任来自真正外部来源的输入。你是 不应该捕获这些错误,它只会使代码非常 凌乱而且更复杂,这会带来更多的错误 最坏的情况也掩盖了实际的故障。付出努力 相反,你应该相信自己的输入。
意味着我们应该小心我们写的东西。那不错。