• 締切済み

関数呼び出しに時間がかかる

VB.NETに関してご質問があります。 下記ソースで、OKボタをクリックしたときにcmdOK_Click()関数が実行されます。 TimeLogは現在時刻をログに出力する関数です。 cmdOK_Click()内でTest()関数をコールしていますが、(1)と(2)の時間差が約3~4秒となります。 しかし、Test()関数内の「Dim rs As ADODB.Recordset = Nothing」を削除すると、(1)と(2)の時間差はほぼなくなります。 「Dim rs As ADODB.Recordset = Nothing」が関数内に記載されているだけで、時間が3,4秒もかかる原因は何でしょうか? <ソース例> 'OKボタンクリック時のイベント Private Sub cmdOK_Click(省略)  clsCommon.TimeLog("cmdOK_Click Start") '(1)現在時刻をログに出力  Test() End Sub Private Sub Test()  clsCommon.TimeLog("Test Strat") '(2)現在時刻をログに出力  Dim rs As ADODB.Recordset = Nothing End Sub

みんなの回答

noname#251971
noname#251971
回答No.2

補足コメントの前半に書かれている点がそもそも本来の疑問点のように見えます。 (後から重要な情報を出してくる質問方法は回答者側としては正直なところ、いやなやり方だなぁと感じます) もしかするとほかに詳しい方がいるかもしれませんので、そういった情報を(あとOSやプログラムのbit数なども)記載した上で改めて質問をしてみてはいかがでしょうか? 後半部分もまた違った内容の話かと思いますので、そちらもまた別途質問を出してみてはいかがでしょうか。 別に、気分を害したから答えたくないとかではないですよ。 当方は元の質問文に記載された内容に関しては知っている情報を回答しましたが、補足コメントにあるような点については単純に知りません。

全文を見る
すると、全ての回答が全文表示されます。
noname#251971
noname#251971
回答No.1

VB.NETに限らず、.NETのプログラムはIL(中間言語)をJIT(Just-in-time)コンパイルしながら実行します。 メソッドごとにJITが行われますが、その際にプログラムの実行を開始してから初めて利用する型があると、その型の情報をそこでロードします。 例えば参照しているDLLの中に定義されている型であればそこで初めてDLLを読み込みますし、質問文のようにCOMオブジェクトならそこでレジストリなどから型情報を読み込んだりすると思います。 たぶん、その時間のかかる呼び出しは最初の1回だけではないですか? また、これは質問内容とはズレますが、.NETのプログラムからデータベースを利用するのであれば、通常はADOではなくADO.NETを利用します。 どうしてもADOにしかない機能が必要であれば仕方がないですが、それだとCOM経由になりオーバーヘッドは大きくなるので、ADO.NETを利用するよりもかなり遅くなると思います。

guutaranyanko
質問者

補足

toras9000 様、ご回答ありがとうございます。 ご指摘の通り時間がかかるのは最初の1回だけです。 現在、あるシステムのサーバ更改を行っており、現行はWin2008、次期は2012R2です。 実は時間がかかるのは次期のみで、現行では(1)から(2)まで1秒もかかりません。 原因はご指摘の通りだとして、なぜ次期だけ時間がかかるのでしょうか? 対応策は何かないでしょうか? >.NETのプログラムからデータベースを利用するのであれば、通常はADOではなくADO.NETを利用します。 サーバ更改のみを行っており、可能ならばプログラムの修正は行いたくないのです。 ADOからADO.NETへの変更だけでも、テスト工数が膨大になります。 プログラムの修正を行うことなく、何かOSの設定(?)などで対応する方法ないでしょうか??

全文を見る
すると、全ての回答が全文表示されます。

関連するQ&A

  • ADO 「Set」は使ったほうがいいのでしょうか?

    Sub test1() Dim cn As ADODB.Connection Dim rs As ADODB.Recordset Set cn = New ADODB.Connection Set rs = New ADODB.Recordse End Sub Sub test2() Dim cn As New ADODB.Connection Dim rs As New ADODB.Recordset End Sub この二つは同じ意味ですか? 「Set」は使ったほうがいいのでしょうか? よろしくお願いします。

  • ACCESS VBA

    ACCESSで検索フォームを作りたいと思っています。 VBAを使って行きたいと思うのですが、うまくいきません。 希望としては、該当するレコードのデータを抽出したいです。 よろしくお願いいたします。 ※現段階でのソースを書いてみました。 最終的に行いたい処理とは違うのですが、根本的に間違っているようなので簡略化しました。 /------------------------------------------------/ Private Sub コマンド1_Click() Dim cn As ADODB.Connection Dim rs As ADODB.Recordset Dim sql As String '接続 Set cn = CurrentProject.Connection 'レコードセットを取得 Set rs = New ADODB.Recordset sql = "SELECT * FROM 従業員データ " & _ "WHERE 年齢=30" rs.Open sql, cn, adOpenDynamic, adLockReadOnly rs.Close: Set rs = Nothing cn.Close: Set cn = Nothing End Sub /------------------------------------------------/

  • Access ADOについて質問です。

    Access ADOについて質問です。 以下コードでレコードセットを返す関数を使用しています。 動作的には問題ないのですが、標準モジュール内のレコードセットをClose及びNothingしていないのが気になります。 Private Sub Form_Open(Cancel As Integer) Dim rs2 As ADODB.Recordset Set rs2 = New ADODB.Recordset Set rs2 = CreateRecordSet("SELECT * FROM T_Standard;") Set Me.Recordset = rs2 rs2.Close: Set rs2 = Nothing end sub '標準モジュール Public Function CreateRecordSet(strSQL As String) As ADODB.Recordset Dim cn As ADODB.Connection Dim rs As ADODB.Recordset Set cn = New ADODB.Connection cn.ConnectionString = "provider=Microsoft.Jet.OLEDB.4.0;" _ & "Data Source=O:\標準DB\StandardBackEnd.mdb" cn.Open Set rs = New ADODB.Recordset rs.Open strSQL, cn, adOpenStatic, adLockReadOnly Set CreateRecordSet = rs ' rs.Close: Set rs = Nothing   ←この部分 ' cn.Close: Set cn = Nothing   ←この部分 End Function 標準モジュール内ではCloseやNothingしなくてもメモリの開放は行われているのでしょうか? アドバイスよろしくお願いいたします。

  • SQL文の最後に「;」はいらないのでしょうか?

    VBAのADOについて質問です。 SQL文の最後には「;」を付けなくちゃいけないものだと思っているのですが ・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・ Private Sub test_Click() Dim CN As ADODB.Connection Dim RS As ADODB.Recordset Set CN = CurrentProject.Connection Set RS = New ADODB.Recordset SQL = "SELECT * FROM Tテーブル" ・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・ でも問題なくコードが動きました。 SQL文の最後に「;」はいらないのでしょうか? ちなみに SQL = "SELECT * FROM Tテーブル;" でもエラーになりませんでした。

  • ADO オブジェクトの渡し方

    こんにちは。ADOについてお教えください。 フォームをロード時に接続プロシージャと切断プロシージャを走らせたいと思います。 ConnectDatabaseを呼び出しは成功しますが、CloseDatabase呼び出しには失敗します。 スコープの問題で、rs、cnのオブジェクトが無い為だと思います。 ConnectDatabaseで作成されたcn、rsオブジェクトを別の関数で処理するにはどのようにコードをかけばよろしいでしょうか?宜しくお願い致します。 Private Sub Form_Load() Call ConnectDatabase Call CloseDatabase End Sub Module1 ------------------ sub ConnectDatabase() Dim cn As ADODB.Connection Dim rs As ADODB.Recordset Set cn = New ADODB.Connection Set rs = New ADODB.Recordset 処理~~~~ end sub sub CloseDatabase() rs.Close cn.Close Set rs = Nothing Set cn = Nothing end sub

  • 作成したレコードセットのCSV出力の方法

    test.csv とtest2.csvから作成したレコードセットをtest3.csvに出力したいのですが、 ”指定した式は、いずれかの引数とデータ型が対応していません。” とエラーが帰ってきます。 色々試したのですがうまくいきません、 作成したレコードセットをCSVファイルにエクスポートする方法を教えてください。 Private Sub コマンド6_Click() Dim CN As ADODB.Connection Dim RS As ADODB.Recordset Set CN = New ADODB.Connection CN.Open "Provider=Microsoft.Jet.OLEDB.4.0;" & _ "Data Source=C:\;" & _ "Extended Properties='Text;HDR=YES'" Set RS = CN.Execute("SELECT * FROM test.csv a LEFT JOIN test2.csv b ON a.tel = b.tel") DoCmd.TransferText acExportDelim, , RS, "C:\test3.csv", True, "" Set RS = Nothing Set CN = Nothing End Sub

  • アクセス VBAのエラー

    以下のコードをwindowsXPで問題なく使っていましたが、windows7で使ったところ 「保存できません」というエラーメッセージが出ます。ただ全く同じコードを(だと思うのですが)リストボックスのダブルクリックで実行すると作動します。参考に二つのコードを書いておきます。 何か原因に心当たりのある方よろしくお願いします。 (コマンドボタン) Private Sub コマンド選択_Click() Dim namecode As String namecode = リスト会員 Dim cn As New ADODB.Connection Dim rs As New ADODB.Recordset Set cn = CurrentProject.Connection rs.Open "MT_会員", cn, adOpenKeyset, adLockOptimistic rs.Find "会員IDkai = " & namecode rs!Selectedkai = True '-1 rs.Save Me!リスト会員.Requery リスト印刷会員.Requery rs.Close: Set rs = Nothing cn.Close: Set cn = Nothing End Sub (ダブルクリック) Private Sub リスト会員_DblClick(Cancel As Integer) Dim namecode As String namecode = リスト会員 Dim cn As New ADODB.Connection Dim rs As New ADODB.Recordset Set cn = CurrentProject.Connection rs.Open "MT_会員", cn, adOpenKeyset, adLockOptimistic rs.Find "会員IDkai = " & namecode rs!Selectedkai = True '-1 rs.Save Me!リスト会員.Requery リスト印刷会員.Requery rs.Close: Set rs = Nothing cn.Close: Set cn = Nothing End Sub

  • ADOでレコードを閉じるタイミング。。Access2000/VB6/Win2K

    レコードセットを返すFuncitonプロシージャーを作ってみたのですが。。。 下のGet_Recordsの方のレコードセットをCloseすると上の方のDisp_Dataでオブ ジェクトが閉じているといって怒られます。しかし、閉じないと下の方では開きっ ぱなしになると思うのですが。。。どのように処理すればいいのでしょうか? Public P_CN As ADODB.Connection Private Sub Disp_Date()   Dim RS As ADODB.Recordset   Dim SQL AS String    Set RS = Get_Records(SQL)     With RS      If .RecordCount > 0 Then       .MoveLast: .MoveFirst       .Debug.Print !顧客_ID        End If      End With      RS.Close     Set RS = Nothing End Sub Public Function Get_Records(pSQL As String) As ADODB.Recordset   Dim RS As ADODB.Recordset     Set RS = New ADODB.Recordset      RS.Open pSQL, P_CN, adOpenKeyset, adLockOptimistic     Set Get_Records = RS '''    RS.Close '''   Set RS = Nothing End Function

  • <VB6.0+SQLServer2000>Image型のバイナリデータを表示したい

    こんにちは。 VB6.0+SQLServer2000で開発を行っています。 Image型の項目を用意して、PictureBoxなりなんなりに表示したいのですが、バイナリデータの変換方法がわかりません。 どなたか教えてください。 とりあえず、今はこんなかんじでPG書いてます。 =============================================== Private Sub Command1_Click() Dim rs As adodb.Recordset Dim mstream As adodb.Stream Dim strSql As String On Error GoTo Err_Command1_Click strSql = "select * from 車体画像 where 整理番号='00000001'" Set rs = New adodb.Recordset rs.Open strSql, cn, adOpenKeyset, adLockOptimistic Set mstream = New adodb.Stream mstream.Type = adTypeBinary mstream.Open mstream.Write rs.Fields("画像データ").Value 'ここからどうすればいいのか分かりません… Exit Sub Err_Command1_Click: MsgBox Error End Sub

  • ADOでエクセルからSQL Serverへデータを移行するには

    エクセルvbaのADOを使って、 SQL Serverの「test」という名のデータベースの「Table_1」に 新規レコードを追加する事はできますか? エクセルからアクセスには Sub test() Dim データベース名 As String Dim cn As ADODB.Connection Dim rs As ADODB.Recordset Set cn = New ADODB.Connection Set rs = New ADODB.Recordset cn.Open "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" & データベース名 rs.Open "Tテーブル1", cn, adOpenKeyset, adLockOptimistic rs.AddNew rs.Fields("フィールド1") = データ rs.Update rs.Close cn.Close Set rs = Nothing Set cn = Nothing End Sub で移行しています。 これをエクセルからSQL Serverへ移行させるにはどうすればいいのでしょうか? よろしくお願いします。

このQ&Aのポイント
  • 30代女性が就労継続支援B型に通所している中で、最近の人間関係の変化と作業所の騒がしさから生じるストレスに悩んでいます。
  • 作業所でのおしゃべり好きな人の増加や大声の雑談によるイライラ、内職への影響など、騒がしい環境での過ごし方について悩んでいます。
  • 作業所を変えるかA型への転換を考えていますが、まだ難しい状況であり、現環境のストレスによる体調不良もあります。具体的なアドバイスを求めています。
回答を見る