
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)
-
VB.NET getとsetの概念がわかりません。
Visual Basic(VBA)
-
String"から型'Double'への変換は無効です。 とエラーが出ます。
Visual Basic(VBA)
-
-
4
DataGrdViewに関連付けたデータの更新
C言語・C++・C#
-
5
型 varchar から型 numeric への変換エラー。
その他(データベース)
-
6
VB.net 任意の例外を発生させるには・・・
Visual Basic(VBA)
-
7
「指定されたキャストは有効ではありません。」とエラーが出てしまいます。
Microsoft ASP
-
8
データリーダーからのデータ読み出し方法(VB)
Visual Basic(VBA)
-
9
Designer.vbは直接コードをいじってはだめ?
Visual Basic(VBA)
-
10
SQLServer sqlcmdが使えない
SQL Server
-
11
意味不明の実行時エラーで困っています
その他(プログラミング・Web制作)
-
12
VB.NET DataReaderが開かれている
Visual Basic(VBA)
-
13
DataGridViewでyyyy/MM/dd
Visual Basic(VBA)
-
14
SQLのエラー(~付近に不適切な構文があります)
SQL Server
-
15
VB.NET Excelを読み込んでDataTableに格納し、DBにデータをINSERTする
Microsoft ASP
-
16
日付型のフィールドに空白を入れる方法を教えてください
その他(データベース)
-
17
テーブルの最後(最新)のレコードを抽出したい
MySQL
-
18
DateTimePickerに値を入れたいのですが…
Visual Basic(VBA)
-
19
VB.NET2005 TextBox 高さ(Height) 変更
Visual Basic(VBA)
-
20
【C#/Java?】try-catchでcatchせずにfinallyは一般的?
その他(プログラミング・Web制作)
関連するカテゴリからQ&Aを探す
おすすめ情報
このQ&Aを見た人がよく見るQ&A
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
VB.netで、動的な型変換を行い...
-
共通モジュールでDBへの接続と...
-
他のモジュールのプロシージャ...
-
worksheetFunctionクラスのVloo...
-
VBA シートのボタン名を変更し...
-
実行時エラー 438になった時の...
-
VBA(エクセル)で自動的にボタン...
-
ユーザーフォームを表示中にシ...
-
パソコンへの「Dropbox...
-
【C#/Java?】try-catchでcatch...
-
VBAがブレークモードになっ...
-
特定のファイルを他のプロセス...
-
「Columns("A:C")」の列文字を...
-
excel エラー値を非表示にした...
-
カメラスクロールするのを動画...
-
エクセル・VBA CheckBoxのオブ...
-
なぜこんな初歩的なVBAのIf文で...
-
ユーザーフォームに別シートか...
-
Invalid procedure call or arg...
-
VBAでユーザーフォームを再表示...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
共通モジュールでDBへの接続と...
-
[VBA] Classから他のClassを呼...
-
他のモジュールのプロシージャ...
-
VB.netで、動的な型変換を行い...
-
VB6で外部から静的アクセスが可...
-
Excel vbaで複数のテキストボッ...
-
WPFでCanvas の子要素にアクセ...
-
VBAで、Functionを、クラスモジュール...
-
Python クラスとモジュールの...
-
C#でのWebRequestでのPOSTについて
-
コンポーネント指向って、どの...
-
C# Process.Start で標準入力
-
用語の意味の違いを教えてくだ...
-
VBA クラスにプロパティが実装...
-
VBA オブジェクト追加
-
'StructLayout' の仕様について
-
現在使用しているJAVAファイル...
-
ジェネリクスについて
-
VB.NETにて文字列で指定した関...
-
Form2の変数をForm1に渡す方法...
おすすめ情報