VB.net のモジュールの引数にについての質問です。
やりたい事はSQLServerへの接続およびSELCT文を実行させることです
DB側へのセッションをモジュールで作成し、
それを元に、他のモジュールやクラスファイルで
selectやinsertを動かしたいと思っていますが、うまくいきません
「ExecuteReader には接続が開かれていて使用可能なことが必要です。
現在の接続の状態は終了です」というエラーが出てしまいます。
おそらく戻り値のあたりがおかしいのかなと思うのですが、
解決策がわかりません。
Module Connect
Dim cn As System.Data.SqlClient.SqlConnection
Public Function Connection()
Try
cn = New System.Data.SqlClient.SqlConnection()
'SQL Server認証を利用して接続
cn.ConnectionString = _
"Data Source = " & ServerName & _
";Initial Catalog = " & DBName & _
";User ID = " & UserID & _
";Password = " & password
'Windows認証を利用して接続
'cn.ConnectionString = _
' "Data Source = " & ServerName & _
' ";Initial Catalog = " & DBName & _
' ";Integrated Security = SSPI"
cn.Open()
MessageBox.Show("接続されました")
Catch ex As Exception
MessageBox.Show(ex.ToString)
End Try
Return cn
End Function
End Module
Public Sub ExecuteReaderTest()
Try
Dim cn As New System.Data.SqlClient.SqlConnection
Connection()
Dim hCommand As System.Data.SqlClient.SqlCommand = cn.CreateCommand()
hCommand.CommandText = "SELECT ~~ "
Dim cReader As System.Data.SqlClient.SqlDataReader = hCommand.ExecuteReader()
hCommand.Dispose()
......
No.3ベストアンサー
- 回答日時:
あなたが作成したConnectionメソッドは最後にcnという変数の内容を
Returnしていますよね。
これは「System.Data.SqlClient.SqlConnection」型の戻り値を持つ、
つまり「Public Function Connection()」
でなく「Public Function Connection() As System.Data.SqlClient.SqlConnection」
ではないかと思ったのです。
とすれば狙いとしては、ConnectモジュールのConnectionメソッドで
作成した接続を例えばExecuteReaderTestメソッドなどで使いたいの
かと。
であれば、ExecuteReaderTestメソッドでは
Public Sub ExecuteReaderTest()
Try
Dim cn As New System.Data.SqlClient.SqlConnection
cn = Connect.Connection()
Dim hCommand As System.Data.SqlClient.SqlCommand
hCommand = cn.CreateCommand()
hCommand.CommandText = "SELECT ~~ "
Dim cReader As System.Data.SqlClient.SqlDataReader
cReader = hCommand.ExecuteReader()
Finally
hCommand.Dispose()
End Sub
という風にConnectionの戻り値を利用する形式に変更すべきかと。
(上記はあくまでも説明のためのサンプルです)
今後、Connectionで作ったものを使いまわすならredfox63様の
ご指摘も踏まえて少しつくりを変える必要があると思いますが、
戻り値の割り当てとはこんな感じのことをイメージしています。
No.2
- 回答日時:
おかしいと思われたポイントはあっていると思います。
・Connection()はFunctionなのに戻り値がありません。VisualStudioを
何も考えずにインストールするとビルドエラーになるのでは?
(質問への転記ミス?)
・ExecuteReader()は内部でコンストラクタを使ってインスタンスを
作成していますので、cnは閉じた接続です。
従ってConnection()を呼び出してもどこにも何も反映されません。
つまり、
・Newする代わりにConnection()の戻り値を割り当てる
ようにすれば、うまくいくのではないかと。
この回答への補足
回答ありがとうございます
戻り値を用意するというのがよくわかりません。
Connection()の戻り値の割り当て方法とか
どのようにやればよいのでしょうか?
No.1
- 回答日時:
> Public Sub ExecuteReaderTest()
> Try
' このcnを使いたいなら Connectionメソッドに引数でわたすなどの
' 措置が必要
' グローバルのcnを使用するなら コメントアウトしましょう
> Dim cn As New System.Data.SqlClient.SqlConnection
>
> Connection()
> Dim hCommand As System.Data.SqlClient.SqlCommand = cn.CreateCommand()
このExecuteReaderTestの中にローカルのcnを作ってしまうと
モジュールレベルの cnをその後の『Dim hCommand ...』の行などで使いません
ローカルとグローバル(モジュール/クラス)で同名の変数がある場合
より近くで解決できる変数を使うことになるので、ローカル変数が優先されます
したがって cnは newでインスタンス(実体)化はされているが
接続方法も設定されていないし、Openもされていない状態になります
この回答への補足
回答ありがとうございます
> Dim cn As New System.Data.SqlClient.SqlConnection
>
> Connection()
をコメントアウトして、cnをConnection変更してみました
Dim hCommand As System.Data.SqlClient.SqlCommand = Connection.CreateCommand()。
ロジック的にはこれでよいのでしょうか?
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- Visual Basic(VBA) access count数を変数に格納 2 2022/03/30 19:21
- Visual Basic(VBA) いつもお世話になっております、VBAで教えて頂きたいのですが 2 2022/05/05 22:20
- Visual Basic(VBA) VBAの繰り返し処理について教えてください。 3 2022/08/02 13:21
- Visual Basic(VBA) ACCESS DAO で不要なテーブルのフィールド(列)の削除 4 2022/06/23 12:13
- C言語・C++・C# C#テキストボックスの文字を配列にいれてその後表示する 4 2022/07/17 04:47
- Visual Basic(VBA) excel vbaでvlooupの変数がわかりません。 7 2022/05/30 09:35
- Visual Basic(VBA) VBAで質問ですが、皆さんはどの様に導き出しているのでしょうか? 6 2022/05/03 21:53
- Visual Basic(VBA) ExcelからAccessのテーブルに書き込む時に時間がかかる 1 2022/10/14 20:38
- Excel(エクセル) 列の最終行に新たに入力されたらその値を自動参照 1 2023/01/21 09:59
- PHP ここでの ②if($su_d<>"")の比較演算子 を使う理由は 1 2022/03/26 02:33
このQ&Aを見た人はこんなQ&Aも見ています
-
外出時に「待たせる妻」vs イライラする「待つ夫」は日本だけ?見習いたい海外事情
夫の家事参加に積極的なイメージのある海外でも、同様の事例はあるのか。結婚カウンセラーの佐竹悦子さんに伺ってみた。
-
VB.NETで DataRow()を利用して、値からコードを取得したい。
Visual Basic(VBA)
-
CloseとDisposeの違い
Visual Basic(VBA)
-
副問合せの書き方について
SQL Server
-
-
4
他のデータベースとのテーブル結合
SQL Server
-
5
DataGridViewでセルクリックイベントを発生させるには
Visual Basic(VBA)
-
6
「指定されたキャストは有効ではありません。」とエラーが出てしまいます。
Microsoft ASP
-
7
VB.NETでコンボボックスの1行目を空白にしたい
Visual Basic(VBA)
-
8
String"から型'Double'への変換は無効です。 とエラーが出ます。
Visual Basic(VBA)
-
9
VB.NET DataReaderが開かれている
Visual Basic(VBA)
-
10
DataTableに入っているデータを全てinsertしたい!(C#)
Microsoft ASP
-
11
複数SQL発行について
Visual Basic(VBA)
-
12
別フォームから戻ったときのイベント
Visual Basic(VBA)
-
13
SQLServer sqlcmdが使えない
SQL Server
-
14
VB.NETで小数点以下の桁数を取得したい
その他(ソフトウェア)
-
15
DataGridViewのチェックボックスのON、OFFの判定方法
C言語・C++・C#
-
16
DBの定義のサイズを大きくし過ぎると問題ある?
その他(データベース)
-
17
【SQL】他テーブルに含まれる値に合致する行を抽出
その他(データベース)
-
18
DataGridViewの桁数制限に関して
Visual Basic(VBA)
-
19
DataGridViewの内容をDBに反映する時
Visual Basic(VBA)
-
20
テーブルの列数を調べたい
MySQL
関連するカテゴリからQ&Aを探す
おすすめ情報
このQ&Aを見た人がよく見るQ&A
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
Excel vbaで複数のテキストボッ...
-
[VBA] Classから他のClassを呼...
-
用語の意味の違いを教えてくだ...
-
VB.NETにて文字列で指定した関...
-
worksheetFunctionクラスのVloo...
-
実行時エラー 438になった時の...
-
VBA シートのボタン名を変更し...
-
VBA(エクセル)で自動的にボタン...
-
ウォッチ式の文字数制限について
-
【C#/Java?】try-catchでcatch...
-
エクセルVBAのフォームを最...
-
VBAで既に開いている別アプリケ...
-
フォームの再読み込み
-
実行時エラー 3265「要求された...
-
ExcelVBAのユーザーフォームの...
-
エクセルエラー13型が一致しま...
-
コンボボックスの高さを変更し...
-
Excelでフィルタをかけると警告...
-
ADODB.Streamを使用してUTF-8を...
-
ACCESS2010 ActiveXコントロー...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
共通モジュールでDBへの接続と...
-
[VBA] Classから他のClassを呼...
-
Excel vbaで複数のテキストボッ...
-
用語の意味の違いを教えてくだ...
-
他のモジュールのプロシージャ...
-
VB.netで、動的な型変換を行い...
-
WPFでCanvas の子要素にアクセ...
-
VB.NETにて文字列で指定した関...
-
【JSF】バッキングビーンから別...
-
バウンドプロパティとは?
-
VBAで、Functionを、クラスモジュール...
-
VBA オブジェクト追加
-
Form2の変数をForm1に渡す方法...
-
コンポーネント指向って、どの...
-
VBA クラスにプロパティが実装...
-
シーケンス図について。
-
VBA モジュールレベル・パブリ...
-
worksheetFunctionクラスのVloo...
-
VBA シートのボタン名を変更し...
-
VBA(エクセル)で自動的にボタン...
おすすめ情報