DOBON.NET DOBON.NETプログラミング掲示板過去ログ

VS.NET2003で、ADODBを使ったデータベースへの接続

環境/言語:[windows2000、VS.NET2003]
分類:[.NET]

初めまして。ひろと申します。

最近VS.NET2003を使ってシステム開発を始めたのですが
出だしでつまづいています。何より経験がまったくといっても良いほどないもので、
悩みすぎてこちらにたどり着きました。

やりたい事は、フォームでログイン画面を作り、
IDとパスワードを入力してログインを押すと、データベース(postgreSQL)に接続し
ユーザの登録があれば、次の画面へ(menu)なければエラーメッセージを出したいと
思っています。
いろいろ試してみたのですが、どうもうまくいかず
最終的にADOで接続しようかと思ったのですが常に"ID.パスワードの登録がありません"が出る状態です。
パラメータの設定が悪いのか、本当行き詰っています。
ご存知の方、よろしくお願いいたします。

またADOで接続する以外に良い方法があれば、教えていただけたら幸いです。

よろしくお願いいたします。


Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click

Dim menu As New menu.Form1
Dim ct As ADODB.Connection
Dim rs As ADODB.Recordset
Dim cm As ADODB.Command
Dim msg As Integer
Dim prm As ADODB.Parameter
Dim u_id As String
Dim sql As String

ID.Text = u_id
Try
With ct
.ConnectionString = "dsn = XXX;"
.Open()
.CursorLocation = 2

End With

cm = New ADODB.Command
cm.ActiveConnection = ct
sql = "SELECT ID FROM login WEHRE ID = u_id"

cm.CommandText = sql

prm = New ADODB.Parameter
prm = cm.CreateParameter("prm", ADODB.DataTypeEnum.adVariant, ADODB.ParameterDirectionEnum.adParamInputOutput)
cm.Parameters.Append(prm)


cm.Parameters("prm").Value = u_id

rs = New ADODB.Recordset
rs = cm.Execute

Do Until rs.EOF
menu.Show()
rs.MoveNext()
Loop
Catch ex As Exception
MsgBox("ID,パスワードの登録がありません。", MsgBoxStyle.OKOnly, "ログインエラー")
ID.Focus()
End Try

End Sub
> 最終的にADOで接続しようかと思ったのですが常に"ID.パスワードの登録がありません"が出る状態です。
ADO.NET では駄目なのですか?

ADOは、COMのオブジェクトなので、Recordsetの値一つ取り出すだけでも、
 If Not Rs.EOF Then
  O = Rs.Fields(0).Value
 End If
 Rs.Close()
ではなく、
 If Not Rs.EOF Then
  Fs = RS.Fields
  F = FS(0)
  O = F.Value
  Marshal.ReleaseComObject(F)
  Marshal.ReleaseComObject(Fs)
 End If
 Rs.Close()
 Marshal.ReleaseComObject(Rs)
のように、各オブジェクトごとに Marshal.ReleaseComObjectメソッドの
呼び出しが必要になってしまう、管理が面倒だと思うのですが……。


> またADOで接続する以外に良い方法があれば、教えていただけたら幸いです。
DSNが指定されているという事は、ODBC接続ですよね。
System.Data.Odbc 名前空間では駄目でしょうか?

postgreSQLを使用した経験が無いので、細かいアドバイスはできませんが、
接続文字列等については、下記のサイトが参考になるかと思います。
http://www.carlprothman.net/Default.aspx?tabid=81
早速の返答ありがとうございます。
まったく基本すらわかっていなくて、本当申し訳ないと思っています。

> ADO.NET では駄目なのですか?
ご面倒でなければ、もう少し詳しく教えてください。


> ADOは、COMのオブジェクトなので、Recordsetの値一つ取り出すだけでも、
>  If Not Rs.EOF Then
>   O = Rs.Fields(0).Value
>  End If
>  Rs.Close()
> ではなく、
>  If Not Rs.EOF Then
>   Fs = RS.Fields
>   F = FS(0)
>   O = F.Value
>   Marshal.ReleaseComObject(F)
>   Marshal.ReleaseComObject(Fs)
>  End If
>  Rs.Close()
>  Marshal.ReleaseComObject(Rs)
> のように、各オブジェクトごとに Marshal.ReleaseComObjectメソッドの
> 呼び出しが必要になってしまう、管理が面倒だと思うのですが……。
そうだったのですね・・・。
管理が面倒なのはあまりよろしくないです。


> DSNが指定されているという事は、ODBC接続ですよね。
そうです。ODBC接続です。
.NET2003から、たしかODBCプロバイダが使えるとか・・・
一度、そちらでもやってみたのですが、どう記述していいのか行き詰まり、他の方法を探していました。

> System.Data.Odbc 名前空間では駄目でしょうか?
こちらも少し調べてみます。
アドバイスありがとうございます。

> postgreSQLを使用した経験が無いので、細かいアドバイスはできませんが、
> 接続文字列等については、下記のサイトが参考になるかと思います。
> http://www.carlprothman.net/Default.aspx?tabid=81
ありがとうございます。参考にさせていただきます。
If Not Rs.EOF Then
  O = Rs.Fields(0).Value
 End If
Rs.Close()
でもなく
If Not Rs.EOF Then
 Fs = RS.Fields
 F = FS(0)
 O = F.Value
 Marshal.ReleaseComObject(F)
 Marshal.ReleaseComObject(Fs)
End If
Rs.Close()
Marshal.ReleaseComObject(Rs)

でもなく

Dim Rs as ADODB.Recordset
Try
 If Not Rs.EOF Then
  Dim Fs
  Try
   Fs = RS.Fields
Dim F
   Try
    F = FS(0)
    O = F.Value
   Finally
    If ( IsNothing(F) == False ) Then
     Marshal.ReleaseComObject(F)
    End If
   End Try
  Finally
   If ( IsNothing(F) == False ) Then
    Marshal.ReleaseComObject(Fs)
   End If
  End Try
 End If
 Rs.Close()
Finally
 If ( IsNothing(Rs) == False ) Then
  Marshal.ReleaseComObject(Rs)
 End If
End Try

これが正しいです。
#多少端折っているのでニュアンスだけ。
もしも ADO を使うなら、RS.Fields(0).Value 経由でアクセスするのではなく、
RS.Collect(0) 経由でアクセスするようにすれば、Field/Fieldsオブジェクトを
解放する手間が省けるかな。(^^A
■No11479に返信(魔界の仮面弁士さんの記事)
> もしも ADO を使うなら、RS.Fields(0).Value 経由でアクセスするのではなく、
> RS.Collect(0) 経由でアクセスするようにすれば、Field/Fieldsオブジェクトを
> 解放する手間が省けるかな。(^^A

皆さんご丁寧にいろいろありがとうございました。
何とかできそうな雰囲気です。
またいろいろ聞くかと思いますがよろしくお願いします。
解決済み!

DOBON.NET | プログラミング道 | プログラミング掲示板