2

これは本当に私を困らせ始めています。Ubuntu 12.04 を実行しており、MS SQL サーバー 2012 を実行しているボックスに接続しようとしています。まず、セットアップに関する情報をいくつか提供します。

私のfreetds.conf:

[EXNAME]
    host = IP
    port = 1433
    tds version = 7.0
    client charset = UTF-8

freetds.conf をセットアップした後、最初に tsql との接続をテストし、予想される (そして歓迎される) プロンプトを生成しました。

 ...
 using default charset "UTF-8"
 1> 

したがって、私の FreeTDS セットアップは正常に機能しているようです。次に、odbc.ini と obdcinst.ini をセットアップします。

odbc.ini:

 [EXNAME]
 Driver = FreeTDS
 ServerName = EXNAME
 UID = Me
 PWD = Pass

odbcinst.ini:

 [FreeTDS]
 Description = FreeTDS Driver
 Driver = /usr/lib/x86_64-linux-gnu/odbc/libtdsodbc.so
 Setup = /usr/lib/x86_64-linux-gnu/odbc/libtdsS.so
 UsageCount = 1

このセットアップに続いて、osql を実行して確認します。予想されるすべての応答を出力し、ドライバーと正しい段落を ondcb.ini で見つけることができます。たとえば、次のようになります。

 [EXNAME] found in /etc/odbc.ini
 found this section:
     [EXNAME]
     Driver = FreeTDS
     ServerName = EXNAME
     UID = Me
     PWD = Pass

     looking for driver for DSN [EXNAME] in /etc/odbc.ini
     found driver line: "   Driver = FreeTDS"

以下まで続きます。

     DSN [EXNAME] has servername "" (from /etc/odbc.ini)

osql は odbc.ini でサーバー名を検出していないようです。

このチェックの後、isql 経由で接続できますが、SQL コマンドを実行できません。次のエラーが表示されます。

 SQL> SELECT name FROM master..sysdatabases;
 [37000][unixODBC][FreeTDS][SQL Server]Could not find stored procedure 'SELECT'.
 [ISQL]ERROR: Could not SQLExecute

私が試したこと:

A.) freetds.conf と両方の .ini ファイルで考えられるほぼすべての構成と命名規則。変更を投稿する 上記と同じテストを実行し、同じ結果に到達します

B.) isql の外でエラーを再現する。ROBC でまったく同じエラーが発生しました。もちろん、これは予想されますが、そうしない理由を考えました

C.) MS SQL Server 以外の SQL バリアント。誰かが私に誤解を与えた場合に備えて、そこでいくつかの MySQL コマンドも試しました。これはSQLの問題かもしれませんが、私にはわかりません。

D.) osql が吐き出すものと同様のエラー (結果は私が推測する) を見つけるのに最も近いものはhereです。前回の投稿で示唆されたように、少なくとも osql の応答に関連する限り、問題はawk. 提案さawkれているように、変数を作成してサーバー名を解析してテストします。

$ SERVER_LINE='ServerName = SERVER'
$ echo ${SERVER_LINE} | awk -F '=[[:space:]]*' '{print $2}'

これは結果になるはずですSERVERが、代わりに「」が表示されます。

持っているのはそれだけだ。要約すると、OSQL は odbc.ini でサーバー名を見つけることができないようです。これにより、ISQL または ROBC からコマンドを実行できなくなる可能性があります。これらの問題はバラバラだと思い始めていますが、どんな助けでも大歓迎です。

編集:2014年7月31日 これはすべて機能しています。私が強調したことに加えて、いくつかの他の問題が起こっていました。結局、Mac と Linux の両方のボックスで同様の接続をセットアップする必要がありました。両方の手順は次のとおりです。 http://www.joecjr.com/2014/07/27/install-and-use-freetds-unixodbc-and-rodbc-or-pyodbc/

4

1 に答える 1

3

TDS を使用して unixODBC を適切に構成するのに長い時間がかかりましたが、その価値はありますが、この一連の指示は私の救いであり、最終的に機能させることができました。

http://www.unixodbc.org/doc/FreeTDS.html

このコマンドを参照する 2 番目の部分に特に注意してください。

odbcinst -i -s -f tds.datasource.template 

そこに私の最大の問題がありました。何が起こったのかは、ルートとしてこれを行っていたのですが (これは問題ありません)、注意深く読むと、ドライバーを使用するすべてのユーザーがこのコマンドを実行して、ユーザー ID の接続を「登録」する必要があることがわかります。他の各ユーザーの下で同じコマンドを実行すると、すべて正常に機能しました (実際のコードはルートとして実行されないため)。

もう1つの考え...接続が実際にTDSで機能しているかどうかを確認するための迅速で簡単なテスト(ODBC部分を試す前であっても)は、bcpを実行して非常に小さなテーブルをエクスポートすることです。

TDSのインストールが問題であることを除外するために、このようなことを試してください.

freebcp <database>.dbo.<tablename> out $HOME/foo.out -c -t '|' \
    -S <hostname>:<port> -U <userid> -P <password>

Microsoft と Unix がうまく連携できないのは残念です。

于 2014-07-18T13:53:06.990 に答える