2015-10-05 12 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代碼。