如何从Elixir通过ODBC选择数据?

时间:2015-10-05 20:22:28

标签: odbc elixir

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

: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):odbc.execute_stmt(#PID< 0.85.0>,'从mytable'中选择计数(*)

2015年10月6日更新

我发现了如何做到这一点。我相信我无法找到有关Elixir的任何文档,因为Elixir只是对Erlang库进行了传递。

无论如何,它是sql_queryselect_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 个答案:

答案 0 :(得分:4)

这里有几件事情:

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

2。)我在official Erlang ODBC docs(v2.11.1)中找不到关于execute_stmt的任何文档,因此我认为它可能已被弃用。我确实发现使用execute_stmt的an example但是arity是4而不是2。看起来所涉及的ODBC版本(通过链接本身判断)相当陈旧 - 在v1.0之前。

3。)在Elixir中,我们倾向于避免重建已经在Erlang中构建的东西,除非有迫切的需要这样做。由于ODBC已经存在于Erlang中并且它运行良好,我猜一般指导是从Elixir调用Erlang lib。 Elixir旨在使调用Erlang代码变得容易。

答案 1 :(得分:0)

我只是把头撞在墙上了一段时间。令人惊讶的是,我的答案是我在SQL语句声明中使用了软引号而不是硬引号。这确实使我震惊。我以前从未尝试在Elixir中进行查询,所以对此我是新手。

软引号

statement = "SELECT MIN(Col1) AS ColAlias FROM dbo.Table;"

    {_selected, _colNames, rows} = :odbc.sql_query(pid, statement)

硬引号

statement = 'SELECT MIN(Col1) AS ColAlias FROM dbo.Table;'

    {_selected, _colNames, rows} = :odbc.sql_query(pid, statement)