我正在使用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行表示什么?)

最佳答案

第8行中的ok是case语句的返回值,当对odbc:sql_query(Connection, Sql)的调用返回的结果可以与表达式{selected, Columns, Results}匹配时。在这种情况下,它是没有用的,因为函数io:format(...)已经返回ok

第二个好方法:{ok, Conn}是Erlang的一种非常常见的用法:如果成功,该函数返回一个元组{ok,Value},如果失败,则返回{error,Reason}。因此,您可以匹配成功案例并使用以下单行提取返回值:{ok, Conn} = odbc:connect(ConnectionString, []),
在这种情况下,函数connect()无法处理错误情况,因此此代码具有4种可能的行为:

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

    关于error-handling - 了解Erlang ODBC应用程序,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/31121005/

    10-13 02:07