質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.35%
Windows 10

Windows 10は、マイクロソフト社がリリースしたOSです。Modern UIを標準画面にした8.1から、10では再びデスクトップ主体に戻され、UIも変更されています。PCやスマホ、タブレットなど様々なデバイスに幅広く対応していることが特徴です。

C#

C#はマルチパラダイムプログラミング言語の1つで、命令形・宣言型・関数型・ジェネリック型・コンポーネント指向・オブジェクティブ指向のプログラミング開発すべてに対応しています。

PostgreSQL

PostgreSQLはオープンソースのオブジェクトリレーショナルデータベース管理システムです。 Oracle Databaseで使われるPL/SQLを参考に実装されたビルトイン言語で、Windows、 Mac、Linux、UNIX、MSなどいくつものプラットフォームに対応しています。

Linux

Linuxは、Unixをベースにして開発されたオペレーティングシステムです。日本では「リナックス」と呼ばれています。 主にWebサーバやDNSサーバ、イントラネットなどのサーバ用OSとして利用されています。 上位500のスーパーコンピュータの90%以上はLinuxを使用しています。 携帯端末用のプラットフォームAndroidは、Linuxカーネル上に構築されています。

データベース

データベースとは、データの集合体を指します。また、そのデータの集合体の共用を可能にするシステムの意味を含めます

Q&A

解決済

3回答

11702閲覧

ODBC経由でPostgreSQLに接続したい

LOL_DESU

総合スコア4

Windows 10

Windows 10は、マイクロソフト社がリリースしたOSです。Modern UIを標準画面にした8.1から、10では再びデスクトップ主体に戻され、UIも変更されています。PCやスマホ、タブレットなど様々なデバイスに幅広く対応していることが特徴です。

C#

C#はマルチパラダイムプログラミング言語の1つで、命令形・宣言型・関数型・ジェネリック型・コンポーネント指向・オブジェクティブ指向のプログラミング開発すべてに対応しています。

PostgreSQL

PostgreSQLはオープンソースのオブジェクトリレーショナルデータベース管理システムです。 Oracle Databaseで使われるPL/SQLを参考に実装されたビルトイン言語で、Windows、 Mac、Linux、UNIX、MSなどいくつものプラットフォームに対応しています。

Linux

Linuxは、Unixをベースにして開発されたオペレーティングシステムです。日本では「リナックス」と呼ばれています。 主にWebサーバやDNSサーバ、イントラネットなどのサーバ用OSとして利用されています。 上位500のスーパーコンピュータの90%以上はLinuxを使用しています。 携帯端末用のプラットフォームAndroidは、Linuxカーネル上に構築されています。

データベース

データベースとは、データの集合体を指します。また、そのデータの集合体の共用を可能にするシステムの意味を含めます

0グッド

0クリップ

投稿2020/12/09 08:56

編集2020/12/10 00:34

前提・実現したいこと

先ほども質問させていただいたのですが勉強不足ということで一度質問を閉じさせていただいたのですが、改めてまだ解決できなかったため質問させていただきます。

クライアント(win10)からLinuxへDBの操作を行う際にODBCを使いたいのですがエラーが出てしまい、上手くいきません。
ODBCからデータベースへの接続は画像の通りできています。
イメージ説明

発生している問題・エラーメッセージ

ERROR [IM002] [Microsoft][ODBC Driver Manager] データ ソース名および指定された既定のドライバーが見つかりません。

このエラーはODBCがデータベースに接続されているなどは関係なしに、この名前のドライバー事態にアクセスできないということを言っているのでしょうか?

該当のソースコード

C#

1namespace ODBCtest 2{ 3 public class date 4 { 5 public Shainlist(string type) 6 { 7 string conn_str = 8 "Driver={PostgreSQL ANSI(x64)};database=ODBCtest;Server=192.***.***.***;Port=5432;User=postgres;Pwd=***;CommandTimeOut=20;Timeout=5"; 9 using (OdbcConnection conn = new OdbcConnection(conn_str)) 10 { 11 OdbcCommand command = new OdbcCommand(conn_str, conn); 12 //PostgreSQLへ接続 13 conn.Open(); 14 15 conn.Close(); 16 } 17 } 18 } 19}

確認したいこと

イメージ説明
ドライバー名に記述するのはこの部分であっていますか?

補足情報(FW/ツールのバージョンなど)

visual studio2019
psqlodbc_13
サーバー側のデータベース:PostgreSql 10.14

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答3

0

PostgreSQL バージョン履歴 PostgreSQL7.3 は2013年にサポートを終わっています。その頃のWindowsといったら XP で32bit版でした。
Windows XP Professional X64 EditionやWindows Server2003 X64 Editionsがリリースされたのはその数年後です。

費用さえ払えば30年前のバージョンでも使い続けられる汎用機と違って、オープン系は常時新しいバージョンに移行しながら使い続けます。

PostgreSQLが動く内に新しいバージョンに移行してからODBCなりの接続を考えた方が良いかと。

投稿2020/12/09 12:36

Orlofsky

総合スコア16417

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

LOL_DESU

2020/12/10 00:33

現在サーバー側のPostgresSQLはバージョン10でやっています。 ODBCとバージョンが違うため、繋がらないということなのでしょうか。 PostgreSQL7.3と書かれていますがこれは何のバージョンを指しているのでしょうか?
Orlofsky

2020/12/10 01:14

質問の画像にPostgreSQLのバージョン7.3とあります。
guest

0

そもそも接続に使用するドライバー名が違います。
そのドライバーを使用するなら、接続文字列は

Driver={CData ODBC Driver for PostgreSQL};

ではなく

Driver={PostgreSQL ANSI(x64)};

のようにドライバー名が完全に一致していないと駄目です。

※odbc接続テストにある内容を見るとpostgresがかなり古いバージョンですけど、接続先のバージョンと合っていますか?

投稿2020/12/09 09:32

編集2020/12/09 12:15
sazi

総合スコア25327

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

LOL_DESU

2020/12/10 00:31

すみません。こちらのコードは転載ミスでした。実際にはPostgreSQL ANSI(x64)で実行しましたが繋がりませんでした。 バージョンが古いというのは一枚目のVer7.3というところですよね? 教えていただいたサイトの通りにやってみたのですが、このVer7.3というのはODBCが対応するPostgreSQLのバージョンを指しているのでしょうか? また、設定はどこでするのか探したのですが分かりません。バージョンはどのように上げるのでしょうか。
sazi

2020/12/10 01:02 編集

先の回答のリンク先は手順の参考程度と考えていましたので、扱っているバージョンまでは確認していませんでした。(そもそもバージョンは明示されていませんでしたし) Ver7.3はODBCドライバーが対応しているバージョンを指しています。 ODBCドライバーは接続先のDBに合わせたものを使用して下さい。 クライアントにPOSTGRES10をインストールしているなら、スタックビルダからドライバーを指定するのが手間が掛からないと思います。
LOL_DESU

2020/12/10 01:15

クライアントにはPostgresqlは入れていません。クライアント側にもインストールしたほうがいいのでしょうか?
sazi

2020/12/10 01:55

開発環境にはなにがしかのDBツールは入れておいた方が良いかと思いますので、特に選択が無いのであれば、postgresをインストールしておいてpgadmin等を使用すれば良いと思います。
LOL_DESU

2020/12/10 02:51 編集

pgadmin使用してみます。 昨日の質問で一つだけ気になったことがあり、お聞きしたかったのですが、今回はクライアントサーバーシステムなのでクライアントとDBとの接続のみで、クライアントでODBCに変換してもらって送信というのは分かったのですが、webシステムなどで、クライアントから値をサーバーへ渡して、サーバーのプログラムがDBに命令を出すというシステムの場合は、サーバーにODBCを導入し、サーバーのプログラムとDBの間にODBCを噛ませるということも出来るのでしょうか?本題とは関係ない質問ですみません。どうしても気になりお聞きしたかったです。
sazi

2020/12/10 03:54

Webシステムは通常アプリケーションサーバーがDBサバ―とのやり取りをします。 私に聞くより、ネットの情報の方が詳しいですよ。 「階層 アーキテクチャ」「Web」「クライアントサーバー」などのキーワードを足掛かりに色々と調べてみると良いかと思います。
guest

0

ベストアンサー

64bit ODBCなら、プラットフォームをx64に指定しないと使えません。
方法: プロジェクトを構成してターゲット プラットフォームを設定する

また、接続文字列は直接指定せず、OdbcConnectionStringBuilderクラス で作成した方が良いです。DsnにシステムDSNの名前を指定してください。Driver、ユーザーID、パスワードの指定は、システムDSNに登録しているなら省略できます。
.NET/ODBCを使用してデータベースに接続しSQLを実行するサンプル

投稿2020/12/09 09:15

編集2020/12/09 10:43
退会済みユーザー

退会済みユーザー

総合スコア0

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

LOL_DESU

2020/12/10 00:41

64bit環境で動作テストしてもやはりつながりません。 OdbcConnectionStringBuilderクラスの使用提案ありがとうございます。 取り合えず現環境で一度接続できてから変更したいです…
退会済みユーザー

退会済みユーザー

2020/12/10 01:12 編集

その接続できるようにするための提案なんですが… var builder = new OdbcConnectionStringBuilder() { Dsn = "PostgreSQL30" }; var conn_str = builder.ToString(); で繋がりませんか?OdbcConnectionStringBuilder使いたくないのであれば var conn_str = "Dsn=PostgreSQL30" でもいいですけど
LOL_DESU

2020/12/10 01:13

勘違いをしていました。すみません。 「指定された DSN には、ドライバーとアプリケーションとのアーキテクチャの不一致が含まれています」というエラーに変わりました。 調べたところビット数の不一致エラーと出てきたのですが、アプリケーションも、ODBCも、Linuxもすべて64bitで動作しているのですがどこで不一致が起きているのか分かりません・・・
LOL_DESU

2020/12/10 01:18

すみません。プログラム側が64bitで動作していないことが原因でした。 接続することができました。ありがとうございます。
退会済みユーザー

退会済みユーザー

2020/12/10 01:18

それが出るということは、多分VisualStudioのx64設定が正しく出来ていない気がしますね。 繋ぐ側の問題なので、サーバ側(Linux)のアーキテクチャは考慮しなくていいです。
退会済みユーザー

退会済みユーザー

2020/12/10 01:24 編集

解決されたようですね。あと、他の方が指摘されているように、ODBCドライバーが古いかもしれないので、可能なら古いバージョンのODBCドライバーをアンインストールし、新しいODBCインストールしてシステムDSNを再設定した方が良いかもしれません。古いドライバーのバグがFixされていたり、性能改善されている場合もあるので。
LOL_DESU

2020/12/10 01:28

バージョン変更も色々調べてみたのですがどのようにすればいいのか分かりません…再インストールもしてみたのですがインストールの手順の中にバージョン指定する場面などなかったと思うのですが、どのようにバージョン指定するのでしょうか?
退会済みユーザー

退会済みユーザー

2020/12/10 01:33 編集

DSN追加の時点で、どのドライバーを使用するか選択できます。そもそも複数のバージョンのドライバーを入れているとかじゃなければ、ドライバー選択で一つしか出てこないと思うのであまり気にしなくていいです。古いものをアンインストールして、公式から最新のドライバーをダウンロードしてインストールすれば問題ないと思います。
LOL_DESU

2020/12/10 02:00

ここでもう一つ質問するのは失礼かもしれないのですが、ODBCドライバでデータベース名や、サーバー、ポートなどをプログラム側で設定するとなったら、Dsnと質問文の"Driver={PostgreSQL ANSI(x64)};database=ODBCtest;Server=192.***.***.***… の部分を繋げて using (OdbcConnection conn = new OdbcConnection(//ここに入れ)てあげればいいんでしょうか? 試してみたんですがエラー出てしまうんですがDsnとドライバー情報などはどのようにつなげるのが正解なのでしょうか?
退会済みユーザー

退会済みユーザー

2020/12/10 02:33 編集

繰り返しになりますが、接続文字列の作成はOdbcConnectionStringBuilderクラスを使用してください。単純なパラメータ指定だけで正しい接続文字列を構築してくれるので、メンテナンス性が上がります。公式のリファレンスにサンプルも載っています。
LOL_DESU

2020/12/10 02:33

OdbcConnectionStringBuilderの説明をしっかり読んでいませんでした。 理解でき、ODBCの設定をせずとも接続することに成功しました。長々とありがとうございました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.35%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問