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も見ています
-
プロが教える店舗&オフィスのセキュリティ対策術
中・小規模の店舗やオフィスのセキュリティセキュリティ対策について、プロにどう対策すべきか 何を注意すべきかを教えていただきました!
-
VB.NETで DataRow()を利用して、値からコードを取得したい。
Visual Basic(VBA)
-
副問合せの書き方について
SQL Server
-
CloseとDisposeの違い
Visual Basic(VBA)
-
-
4
DataTableに入っているデータを全てinsertしたい!(C#)
Microsoft ASP
-
5
DataGridViewでセルクリックイベントを発生させるには
Visual Basic(VBA)
-
6
他のデータベースとのテーブル結合
SQL Server
-
7
VB.NETでコンボボックスの1行目を空白にしたい
Visual Basic(VBA)
-
8
VB.NET DataReaderが開かれている
Visual Basic(VBA)
-
9
String"から型'Double'への変換は無効です。 とエラーが出ます。
Visual Basic(VBA)
-
10
SQLServer sqlcmdが使えない
SQL Server
-
11
テキストボックスのvalueとtextの違い
Visual Basic(VBA)
-
12
「指定されたキャストは有効ではありません。」とエラーが出てしまいます。
Microsoft ASP
-
13
複数SQL発行について
Visual Basic(VBA)
-
14
DBの定義のサイズを大きくし過ぎると問題ある?
その他(データベース)
-
15
DataGridViewのチェックボックスのON、OFFの判定方法
C言語・C++・C#
-
16
【SQL】他テーブルに含まれる値に合致する行を抽出
その他(データベース)
-
17
DataGridViewの桁数制限に関して
Visual Basic(VBA)
-
18
FORMが開いているかどうかの確認方法
Visual Basic(VBA)
-
19
SQLServer2005のSQL文での別名の取り扱い
SQL Server
-
20
VBでグローバル変数を宣言するには
Visual Basic(VBA)
関連するカテゴリからQ&Aを探す
おすすめ情報
このQ&Aを見た人がよく見るQ&A
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
用語の意味の違いを教えてくだ...
-
VB.netで、動的な型変換を行い...
-
[VBA] Classから他のClassを呼...
-
Excel vbaで複数のテキストボッ...
-
iPhoneのニューラルエンジンっ...
-
カメラスクロールするのを動画...
-
worksheetFunctionクラスのVloo...
-
VBA シートのボタン名を変更し...
-
実行時エラー 438になった時の...
-
VBA(エクセル)で自動的にボタン...
-
【C#/Java?】try-catchでcatch...
-
ユーザーフォームを表示中にシ...
-
private subモジュールを他のモ...
-
「Columns("A:C")」の列文字を...
-
実行時エラー 3265「要求された...
-
エクセルエラー13型が一致しま...
-
VBAでオプションボタンによって...
-
ListBoxで改行したい
-
ユーザーフォームに別シートか...
-
エクセル・VBA CheckBoxのオブ...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
共通モジュールでDBへの接続と...
-
[VBA] Classから他のClassを呼...
-
他のモジュールのプロシージャ...
-
用語の意味の違いを教えてくだ...
-
Excel vbaで複数のテキストボッ...
-
VB.netで、動的な型変換を行い...
-
コンポーネント指向って、どの...
-
WPFでCanvas の子要素にアクセ...
-
C#でのWebRequestでのPOSTについて
-
バウンドプロパティとは?
-
シーケンス図について。
-
VB.NETにて文字列で指定した関...
-
Python クラスとモジュールの...
-
【JSF】バッキングビーンから別...
-
ユーザーコントロールのメソッ...
-
'StructLayout' の仕様について
-
hibernate criteria
-
C# Process.Start で標準入力
-
VB6で外部から静的アクセスが可...
-
VBAで、Functionを、クラスモジュール...
おすすめ情報