了解Erlang ODBC应用程序

时间:2015-06-29 16:37:23

标签: error-handling erlang odbc

我使用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行意味着什么?)

2 个答案:

答案 0 :(得分:1)

第8行中的

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种不同的行为:

  • 无法连接到数据库:进程将因第16行的错误匹配错误而崩溃。
  • 它连接到数据库但查询失败:main函数将返回值{error,Reason}
  • 它连接到数据库,并且查询返回与元组{selected, Columns, Results}不匹配的答案:进程将在第4行出现badmatch错误。
  • 它连接到数据库,查询返回与元组{selected, Columns, Results}匹配的答案:函数将打印

Success! Columns: Column Results: Result

并返回ok

答案 1 :(得分:0)

所以我找到了一些东西。 {error,Reason}包含连接错误,意味着我们指定了错误的DSN名称等。关于我提出的查询错误,我们可以从Erlang参考中读到这个:

  

Gaurds 所有API函数都受到保护,如果您传递参数   错误的类型将发生运行时错误。所有输入参数   内部函数被认为是正确的。这是一个很好的编程   实践只是不信任来自真正外部来源的输入。你是   不应该捕获这些错误,它只会使代码非常   凌乱而且更复杂,这会带来更多的错误   最坏的情况也掩盖了实际的故障。付出努力   相反,你应该相信自己的输入。

意味着我们应该小心我们写的东西。那不错。