投稿者 an  (社会人) 投稿日時 2014/4/18 12:46:46
>>anさん
> 文章を見てる限り、以前教わった下の方法を上手く使いこなすと
> データベースの接続とtextboxに入力された情報とSqlServerに保存している情報を照り合わせて
> ログインが出来ると言う認識で当たっていますか?

そうです。その通りです。
1文で済まそうとするとその通りなのですが、プログラムでは基本的には噛み砕いて記述する必要があります。
(ある程度の処理をまとめて行う事も可能なケースもありますが、それは理解が進んでから行う必要があります。)

今回の処理を噛み砕いて説明すると以下の通りになります。

(1)データベースに接続する。
(2)データベースに情報を問い合わせ、情報を取得する。
(3)データベースとの接続を切断する。
(4)データベースに情報を問い合わせて取得した結果を処理する。

これは概要であってさらに噛み砕くと以下の通りになります。

(1)データベースに接続する。
 a)接続文字列を生成する。
 b)接続する。
(2)データベースに情報を問い合わせ、情報を取得する。
 a)問い合わせ用文字列を作成する。(SQL文を組み立てる)
 b)問い合わせ用文字列実行し、実行結果を得る。
(3)データベースとの接続を切断する。
 a)接続文字列を生成する。
(4)データベースに情報を問い合わせて取得した結果を処理する。
 a)(2)のb)で得た結果を判断する。
 b)上記a)の判断で正しいと判定されたら、次の画面を表示する。(ログイン処理の場合)
 b)上記a)の判断で正しいと判定されたら、本画面を非表示にする。 (ログイン処理の場合)

さらに噛み砕くとNewするとか破棄するとかもありますが、省略します。


上記点を踏まえまして、

>    If SQL.CommandText = "SELECT * FROM ユーザー情報 WHERE ユーザーID = 'txtID.text' and パスワード = 'txtPASS.text" Then
>        MessageBox.Show("A")
>    End If
>    Cn.Open()
>    SQL.Connection = Cn
>    MsgBox(SQL.ExecuteScalar)
>    
> というコードを入力しましたら※の部分で

> InvalidOprerationExceptionはハンドルされませんでした
> ExecuteScalar: CommandText プロパティは初期化されていません。

> と出てきました。
> このエラーはSqlSeverにあるデータベースに接続が失敗したのか、
> それとも接続自体は成功しているがその後の処理が失敗したのか、根本的に何かが違っているのでしょうか?

とのことですが、まず発生したエラーを理解しましょう。
「InvalidOprerationException」は読んで字のごとく、オペレーションが正しくない時に発生する例外です。
その詳細としてExecuteScalarを実行した時にCommandText プロパティ(SQL文)が初期化されていない(空)と言っています。
その前で行っているCommandText プロパティに関連する処理を見ると
> If SQL.CommandText = "SELECT * FROM ユーザー情報 ~略~" Then
とやっています。
VBでのIf文での = は代入ではなく比較になりますので、これではCommandTextプロパティには設定されませんので初期化されていない状態となり、今回の例外が発生したことになります。

また、先に説明した噛み砕いた説明を考えると、
問い合わせの実行(SQL.ExecuteScalar()メソッド)と取得結果の確認(If文)の処理の順序が逆ですよね?
その辺も考え方として理解されていないものかと思われます。
まずは、先に説明した噛み砕いた説明の(1)~(3)までを理解しないと
本来のメインである(4)でのログイン処理というものが行えないと思いますので、
If文などは使わずに、データベースから値を取得するという処理について
完全に理解した方が良いともいます。

また、理解するにあたって、とりあえずはテキストボックスなどは使用せずに
「ユーザーID = '001'」のように書いて理解することを中心にすることをお勧めします。
その理解が出来てからでないと、ただただ混乱するだけだと思います。


個人的な話ですが、自分も10年以上プログラムは書いていますが、
新しい事を理解する時は1行~10行程度のものを作っては動かし、作っては動かしとやっています。
うまく行ったところで本番プログラムに組み込むようにしていますが、
このようにしないと何か問題が起きた時に、その問題の原因が分かりにくいからです。

> このエラーはSqlSeverにあるデータベースに接続が失敗したのか、
> それとも接続自体は成功しているがその後の処理が失敗したのか、

この辺を理解するためには、まず(1)と(3)のみの実装、その後(2)のa)のみの実装、
両方思い通りになったことで(1)~(3)の組み込みという工程にすべきかと思います。