C# と VB.NET の質問掲示板

ASP.NET、C++/CLI、Java 何でもどうぞ

C# と VB.NET の入門サイト

C#からODBC経由でSQLSERVERへ接続・・・できない

[トピック内 8 記事 (1 - 8 表示)]  << 0 >>

■89677 / inTopicNo.1)  C#からODBC経由でSQLSERVERへ接続・・・できない
  
□投稿者/ S.Kos (4回)-(2018/12/14(Fri) 10:40:48)

分類:[.NET 全般] 

Window10/ProからODBC経由で、SQLSERVEREXPRESS2016へ接続する.exeを、C#で書いています。

// DB Connect
try
{
conn.ConnectionString = CommonConstans.OdbcDsn;
conn.Open();
}

C#の開発環境が『VS Express2012 for Windows Desktop』であれば、全く問題ありません。
この環境を『VS Express2017 for Windows Desktop』に変えたところ、上記conn.Open()で引っ掛かります。

以下の手順で「環境を変え」ました。

 1 VSEXPRESS2017を導入
 2 旧2012時代と同じ名前で新プロジェクトを作成
 3 旧2012環境からC#のソースのみを新環境へコピー
 4 コピーされたソースを新プロジェクトのソース管理へ追加
 5 新プロジェクトの「参照設定」を旧環境に合わせる

コンパルまで問題無く進むので、ソース管理と参照設定は成功しいる・・はずです。
けれど、実行させると、上記で止まります。

同じ環境で書いた別プログラムが、同じSQLSERVERに繋がるので、接続文字列等に起因する不具合では無いと考えています。
ナニを失敗しているのでしょうか?

引用返信 編集キー/
■89678 / inTopicNo.2)  Re[1]: C#からODBC経由でSQLSERVERへ接続・・・できない
□投稿者/ WebSurfer (1708回)-(2018/12/14(Fri) 10:53:21)
No89677 (S.Kos さん) に返信

エラーメッセージは出てませんか? 出ていたらそれを省略せずコピペしてください。
引用返信 編集キー/
■89682 / inTopicNo.3)  Re[2]: C#からODBC経由でSQLSERVERへ接続・・・できない
□投稿者/ S.Kos (5回)-(2018/12/14(Fri) 11:44:52)
No89678 (WebSurfer さん) に返信
> ■No89677 (S.Kos さん) に返信
>
> エラーメッセージは出てませんか? 出ていたらそれを省略せずコピペしてください。

WebSurferさん、ご教示感謝です。
従前から不具合発生に備え、SQLへの接続はtry・・catchでエラーを捕まえています。
そのためプログラム実行画面には、オリジナルの警告「繋がらないよ」、と表示されるだけです。

ここにブレークポイントを仕掛けてクイックウォッチでconnを覗くと、下記が赤い×印に続いています

ServerVersion 'conn.ServerVersion' threw an exception of type 'System.InvalidOperationException' string {System.InvalidOperationException}


引用返信 編集キー/
■89685 / inTopicNo.4)  Re[3]: C#からODBC経由でSQLSERVERへ接続・・・できない
□投稿者/ WebSurfer (1709回)-(2018/12/14(Fri) 12:13:39)
No89682 (S.Kos さん) に返信

> 従前から不具合発生に備え、SQLへの接続はtry・・catchでエラーを捕まえています。
> そのためプログラム実行画面には、オリジナルの警告「繋がらないよ」、と表示されるだけです。

try・・catch を外して試してみれば良いのでは? 開発環境で容易にできるのですよね?


本題とは関係ない話で何ですが、そもそも質問者さんのケースでは発生した例外をなかったことにし
ているだけのようで、それは本来やってはいけないことだと思うのですが。

ついでで何ですが、例外処置について、自分的に一般的と思うことを書きます。(3) に注目。

(1) 予測可能で正しい業務フローに戻すことができる「業務エラー」(例:ユーザーの入力間違い)と、
  予測できないもしくは予測はできても何の対応もできない「例外」(例:DB サーバーダウン)を
  区別して対処。

(2) 「例外」はランタイムに拾わせてアプリケーションを停止させる。

(3) よほどのことがない限り try-catch は書かない。

(4) キャッチせざるを得ない場合でも Execption はキャッチしない。

(5) 間違って補足してしまった例外は throw する。(注:catch ブロックでキャッチした例外を
  throw するとスタックトレースが途切れるので単に throw と書く)

(6) ユーザーへの通知が必要なら、集約的例外処置を利用する。

詳しくは以下の記事を見てください。

NETの例外処理 Part.1
https://blogs.msdn.microsoft.com/nakama/2008/12/29/net-part-1/

.NETの例外処理 Part.2
https://blogs.msdn.microsoft.com/nakama/2009/01/02/net-part-2/

あと、.NET 4 からは破損状態例外は catch できなくなっているそうですが、「それでも Catch
(Exception e) を使用するのはよくない」ということについては以下の記事を見てください。

破損状態例外を処理する
https://msdn.microsoft.com/ja-jp/magazine/dd419661.aspx

引用返信 編集キー/
■89687 / inTopicNo.5)  Re[4]: C#からODBC経由でSQLSERVERへ接続・・・できない
□投稿者/ S.Kos (6回)-(2018/12/14(Fri) 12:47:30)
No89685 (WebSurfer さん) に返信
> try・・catch を外して試してみれば良いのでは? 開発環境で容易にできるのですよね?
>
やってみました・・すると、
 指定された DSN には、ドライバーとアプリケーションとのアーキテクチャの不一致が含まれています
とのこと。

もしかして・・・AnyCpuをx86に変えたら・・・見事に通りました。

とりあえず喫緊の課題は抜けられましたが、新しい疑問が湧いてきます。
最初の投稿に書いた「同じ環境で書いた別プログラムが、同じSQLSERVERに繋がる」もAnyCpuになってます。
同じ設定なのに、片方はOKて他方はNG、これはなぜでしょう。

>本題とは関係ない話で何ですが、そもそも質問者さんのケースでは発生した例外をなかったことにし
>ているだけのようで、それは本来やってはいけないことだと思うのですが。
>
文字通りの「目から鱗」です。
ご教示のほど、ありがとうございました。

引用返信 編集キー/
■89688 / inTopicNo.6)  Re[5]: C#からODBC経由でSQLSERVERへ接続・・・できない
□投稿者/ WebSurfer (1711回)-(2018/12/14(Fri) 13:04:19)
No89687 (S.Kos さん) に返信

> 最初の投稿に書いた「同じ環境で書いた別プログラムが、同じSQLSERVERに繋がる」もAnyCpuになってます。
> 同じ設定なのに、片方はOKて他方はNG、これはなぜでしょう。

それは、想像ですが、アプリを動かしている PC の OS が 32-bit か 64-bit かの違いによるのでは
ないかと思います。

たぶん、ドライバが 32-bit 版ではないかと思いますが、とすると、例えばアプリが Any CPU(32ビ
ットを優先にチェックが入ってない場合) でコンパイルされている場合、アプリを 64-bit OS で動
かした場合、以下の記事の Step 9 の下の方の図の「例3.」のようになって例外がスローされます。

Part 2. .NET Framework 2.0 アプリケーションの 64 ビット対応
https://blogs.msdn.microsoft.com/nakama/2008/11/05/part-2-net-framework-2-0-64/

引用返信 編集キー/
■89691 / inTopicNo.7)  Re[5]: C#からODBC経由でSQLSERVERへ接続・・・できない
□投稿者/ 魔界の仮面弁士 (1992回)-(2018/12/14(Fri) 13:23:53)
No89687 (S.Kos さん) に返信
> もしかして・・・AnyCpuをx86に変えたら・・・見事に通りました。

ご存知とは思いますが、ODBC Driver には 32bit 版と 64bit 版があります。
(両対応のドライバーもあれば、32bit 版専用の物もあります)

Windows が x64 環境の場合、「ODBC データ ソース アドミニストレータ―」も
 C:\Windows\System32\odbcad32.exe (64 bit 版)
 C:\Windows\SysWOW64\odbcad32.exe (32 bit 版)
の 2 種類がありますね。


> 最初の投稿に書いた「同じ環境で書いた別プログラムが、同じSQLSERVERに繋がる」もAnyCpuになってます。
> 同じ設定なのに、片方はOKて他方はNG、これはなぜでしょう。

両者ともに AnyCPU のプロジェクトなのに、動作が異なっていたのですね?

接続できていた方は、[ビルド]-[構成マネージャー]で見た場合に、
『アクティブ ソリューション プラットフォーム』が Any CPU だが、
プロジェクトのプラットフォームは Any CPU ではなく x86 になっていたとか…。

あるいは、プロジェクトの プロパティの「ビルド」タブで、
プロットフォーム ターゲットが が Any CPU だった時に、
その下の「32 ビットを優先」が On になっていたのではないでしょうか。

.NET Framework 4.5 以降のプロジェクトにおいては、Any CPU ビルドで
「32 ビット優先」を有効にしていた場合、Windows が 32bit/64bit いずれであっても
32 ビットアプリケーションとして動作するようになります。


ちなみに、新規に作成したプロジェクトのビルドオプションの初期値は、
 〜VS2008 … Any CPU
  VS2010 … x86
 VS2012〜 … AnyCPU (32bit優先)
だったはずです。Express も同じかどうかは把握していませんが。
引用返信 編集キー/
■89701 / inTopicNo.8)  Re[6]: C#からODBC経由でSQLSERVERへ接続・・・できない
□投稿者/ S.Kos (8回)-(2018/12/15(Sat) 11:52:17)
魔界の仮面弁士さん、この度もまたお世話になります。
ご教示を受けてVSExpress2017のあっちこっちを開いたところ・・
問題無く動いているプログラムの、プロジェクト最下段「***のプロパティ」のビルドで、
 プラットフォームはAnyCPUであり、
 32ビット優先がオン、
になってました。
疑問が解消できました。

WebSurferさんご教示に沿ってtry-catchを洗い出している最中です。

ありがとうございました。



解決済み
引用返信 編集キー/

このトピックをツリーで一括表示


トピック内ページ移動 / << 0 >>

このトピックに書きこむ