VB2005でエクセルのデータをデータベースとして使うには?


SIRO  2008-01-19 10:31:19  No: 144308

はじめまして、早速ですみませんがよろしくお願いします。
VB6.0ではできていたのですがVB2005だとうまくいきません。
プログラムはボタンとテキストボックスがありテキストボックスに
入れた内容をみて指定したエクセルのシートから検索して特定の列の
結果を返すというものです。
コードは以下になります。

        Dim cn As ADODB.Connection
        cn = New ADODB.Connection
        Dim rs As ADODB.Recordset
        Dim SQL As String
        Dim KURO As String
        Dim KURO1 As String
        Dim KURO2 As String

        With cn
            .Provider = "Microsoft.Jet.OLEDB.4.0"
            .ConnectionString = "Data Source=C:\test.xls;" & _
            "Extended Properties=Excel 8.0;PersistSecurityInfo=False"
            .Open()
        End With

        rs = New ADODB.Recordset
        SQL = "SELECT * FROM [TEST$]"
        rs.Open(SQL, cn, ADODB.CursorTypeEnum.adOpenStatic)

        KURO1 = TextBox1.Text
        KURO = "品名=" & "'" & KURO1 & "'"
        rs.Find(KURO, 0, ADODB.SearchDirectionEnum.adSearchForward)

        If rs.EOF Then
            MessageBox.Show("見つかりませんでした")
        Else
            KURO2 = rs("NCNO")
            MessageBox.Show(KURO2)
        End If

        rs.Close()
        cn.Close()

        rs = Nothing
        cn = Nothing

以上です。
エラー内容としましては実行させ検索にかかるような文字をいれボタンを押すとKURO2 = rs("NCNO")のところで引っかかります。
検索に引っかからなかったときの("見つかりませんでした")はでるのですが・・・。
よろしくお願いします。


HTML-M  2008-04-06 19:51:31  No: 144309

推測:
VB.NETでは対応できない Or VB2005のバグ

VB2005のバグであれば、VB2008に更新し、
VB.NET非対応コードであれば、
コード変更

おそらく、コード変更だと思います


HTML-M  2008-04-06 19:52:05  No: 144310

ビルド正常終了しますか?


HTML-M  2008-04-11 01:14:19  No: 144311

>>VB2005のバグであれば、VB2008に更新し
VB2008への更新はやっぱりキツイですよね・・・


シャノン  2008-04-11 03:01:32  No: 144312

何というエラーが出るんです?


魔界の仮面弁士  2008-04-11 07:32:09  No: 144313

インポートモードで実行してみてください。

〜;Extended Properties=Excel 8.0;〜 ではなく、
〜;Extended Properties="Excel 8.0;IMEX=1;"〜 という感じで。

それと、Nothing を代入する前に、Marshal.ReleaseComObject の呼び出しを
行うようにしてください。そもそも、このような場合の Nothing 代入は、
(VB6などの場合とは違って)オブジェクトの即時解放を意味しないため、
あまり意味がありません。


もげ  2008-04-12 00:54:21  No: 144314

キャストで失敗していませんか?

>            KURO2 = rs("NCNO")

KURO2 = rs("NCNO").Value
とか。

Marshal.ReleaseComObject はお忘れなく。


魔界の仮面弁士  2008-04-12 01:48:17  No: 144315

> KURO2 = rs("NCNO").Value
Valueを使うよりは、
  KURO2 = rs.Collect("NCNO")
の構文をお薦めします。

Collect の場合は、直接、フィールドの値を操作する事ができますが、
rs("NCNO").Value の構文の場合、Recordset オブジェクトから
  Fields コレクション
  Field オブジェクト
  Value プロパティ
の 3 段階のアクセスが発生してしまうためです。
(Field オブジェクトを変数にキャッシュした場合は、Collect よりも効率が良いのですが)

なお、Recordset や Connection は COM オブジェクトであるため、
Marshal.ReleaseComObject の対象となります。

また、Fields や Field については、msado15.dll (から生成される  Interop.ADODB.DLL) を
参照設定したときは、Marshal.ReleaseComObject の対象となりますが、
PIA である ADODB.DLL を参照設定した時は、Fields や Field は
マネージであるため、Marshal.ReleaseComObject の対象外となります。


※返信する前に利用規約をご確認ください。




  


  このエントリーをはてなブックマークに追加