2015-10-05 48 views
6

我找不到任何文档或示例。到目前为止,我可以成功连接,但我不知道选择和返回数据的语法。如何从Elixir通过ODBC选择数据?

:odbc.start() 
{:ok, conn} = :odbc.connect('DSN=mydsn;UID=myuid;PWD=mypwd', []) 
:odbc.execute_stmt(conn, 'select count(*) from mytable') 
:odbc.stop() 

**(UndefinedFunctionError)未定义功能:odbc.execute_stmt/2 (ODBC):( '从mytable的SELECT COUNT(*)' #PID < 0.85.0>)odbc.execute_stmt


更新2015年10月6日

我发现如何做到这一点。我相信我找不到任何关于Elixir的文档,因为Elixir只是简单地传递给Erlang库。

在它的sql_query,或select_count任何情况下:

{:selected, colNames, rows} = :odbc.sql_query(conn, 'select count(*) from mytable') 

{:选择,[ 'COUNT'],[{ '182'}]}

{:ok, count} = :odbc.select_count(conn, 'select * from mytable') 

{:ok,182}


更新2015年10月7日

这是我最后的代码,我相信这是更地道:

:odbc.start() 
case :odbc.connect('DSN=mydsn;UID=#{System.get_env("MY_UID")};PWD=#{System.get_env("MY_PASSWORD")}', []) do 
    {:ok, conn} -> 
    case :odbc.sql_query(conn, 'select count(*) from mytable') do 
     {:selected, _colNames, [{count}]} -> IO.puts "count = #{count}" 
     {:error, err} -> {:error, err} 
    end 
    {:error, err} -> {:error, err} 
end 
:odbc.stop() 

回答

2

有几件事情在这里:

1)我想你想要:odbc.sql_query/2。去年我使用ODBC与SQLServer通信建立了一个相当实用的应用程序,并且几乎在任何地方都使用了sql_query。我会分享来源,但我不能。

2.)我找不到official Erlang ODBC docs(v2.11.1)中有关execute_stmt的任何文档,因此我认为它可能会被弃用。我确实找到了使用execute_stmt的an example,但是四个不是两个。它看起来像涉及的ODBC版本(由链接本身来判断)相当老旧 - v1.0之前版本。

3.)在Elixir中,我们倾向于避免重建已经在Erlang构建的东西,除非有迫切的需要。由于ODBC已经存在于Erlang中,并且它工作得很好,所以我猜想一般的指导是从Elixir中调用Erlang库。 Elixir的设计使其可以轻松地调用Erlang代码。