
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で質問しましょう!
このQ&Aを見た人はこんなQ&Aも見ています
-
VB.NET DataReaderが開かれている
Visual Basic(VBA)
-
DataGrdViewに関連付けたデータの更新
C言語・C++・C#
-
VB.NET getとsetの概念がわかりません。
Visual Basic(VBA)
-
-
4
VB.NETで DataRow()を利用して、値からコードを取得したい。
Visual Basic(VBA)
-
5
VB.net
Visual Basic(VBA)
-
6
データリーダーからのデータ読み出し方法(VB)
Visual Basic(VBA)
-
7
CloseとDisposeの違い
Visual Basic(VBA)
-
8
VB.NET2005 TextBox 高さ(Height) 変更
Visual Basic(VBA)
-
9
Integer変数をカラにしたいのですが
Visual Basic(VBA)
-
10
DataGridViewでyyyy/MM/dd
Visual Basic(VBA)
-
11
【VB.NET】テキストボックスにフォーカスが移動すると、全選択されてしまいます。
Visual Basic(VBA)
-
12
VB.Net Object型 空かどうか
Visual Basic(VBA)
-
13
SELECT文でのデッドロックに対しての対処方
SQL Server
-
14
VB.net 任意の例外を発生させるには・・・
Visual Basic(VBA)
-
15
DataGridViewに空白がある場合はエラーにしたい
Visual Basic(VBA)
-
16
プロシージャからイベントをコールする
Visual Basic(VBA)
-
17
vb.netで画面のコントロールId名を変数で動的に制御し処理する方法
Visual Basic(VBA)
-
18
DataGridViewでセルクリックイベントを発生させるには
Visual Basic(VBA)
-
19
文字列の後ろから必要分だけ削除したい。
Visual Basic(VBA)
-
20
SQL ServerのストアドでOUTPUTパラメータを2つ
Visual Basic(VBA)
関連するカテゴリからQ&Aを探す
おすすめ情報
このQ&Aを見た人がよく見るQ&A
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
共通モジュールでDBへの接続と...
-
[VBA] Classから他のClassを呼...
-
WPFでCanvas の子要素にアクセ...
-
実行時エラー 438になった時の...
-
あとこれさえ出来ればよいので...
-
worksheetFunctionクラスのVloo...
-
EXCELでactivexコントロールを...
-
VBA シートのボタン名を変更し...
-
Microsoft Formsの「個人情報や...
-
「Columns("A:C")」の列文字を...
-
VBA(エクセル)で自動的にボタン...
-
【C#/Java?】try-catchでcatch...
-
ユーザーフォームを表示中にシ...
-
VBAでオプションボタンによって...
-
Excel VBA Application.caller...
-
ExcelVBAでListViewが使用できない
-
ExcelVBAのユーザーフォームの...
-
パソコンへの「Dropbox...
-
Excelにて、ユーザーフォームで...
-
ウォッチ式の文字数制限について
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
共通モジュールでDBへの接続と...
-
[VBA] Classから他のClassを呼...
-
他のモジュールのプロシージャ...
-
VB.netで、動的な型変換を行い...
-
Excel vbaで複数のテキストボッ...
-
現在使用しているJAVAファイル...
-
WPFでCanvas の子要素にアクセ...
-
用語の意味の違いを教えてくだ...
-
VisualBasicへの取っ付き辛さ。...
-
VB.NETにて文字列で指定した関...
-
Visual-C#の event キーワー...
-
Python クラスとモジュールの...
-
Android / 型変数へのバインド?
-
【iOS】TextFieldでテキスト入...
-
Form1に記述されたスクリプトを...
-
C# Process.Start で標準入力
-
ExcelVBAでJavaのHashtableのよ...
-
VBA クラスにプロパティが実装...
-
VBAで、Functionを、クラスモジュール...
-
シーケンス図について。
おすすめ情報