none
アクセスの接続について RRS feed

  • 質問

  • 現在本にてログイン画面の勉強中なんですが

    本(SQL版)どおりにするとちゃんとうまくいくのですがアクセスに変更するとできなくなってしまいます。

    下記コードなんですがどうやらうまく、接続ができていないらしく

    正しいID、パスワードを入れても"ユーザーIDまたはパスワードが違います。" というエラーになってしまいます。

            Dim cnStr As String = System.Configuration.ConfigurationManager.ConnectionStrings("OrderConnectionString").ConnectionString  

    の部分ではweb.configの

      <add name="OrderConnectionString" connectionString="Provider=Microsoft.Jet.OLEDB.4.0;Data Source=|DataDirectory|\Order.MDB;Persist Security Info=True"
       providerName="System.Data.OleDb" />

    をみていれています。

    接続ではなくコードの問題でしょうか?教えて下さい。よろしくお願いします。

    <%@ Page Language="VB" %> 
    <%@ Import Namespace="System.Data.OleDb" %> 
    <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> 
    <script runat="server">  
        Dim staffid As Integer  
        Dim staffname As String  
        Dim adminflag As Boolean  
        Protected Sub btnLogon_Click(ByVal sender As Object, ByVal e As System.EventArgs)  
            If txtUserID.Text = "" Then  
                lblErr.Text = "ユーザーIDを入力してください。" 
                Return  
            End If  
            If txtpassword.Text = "" Then  
                lblErr.Text = "パスワードを入力してください。" 
                Return  
            End If  
     
            If Not CheckUserPassword(txtUserID.Text, txtpassword.Text) Then  
                lblErr.Text = "ユーザーIDまたはパスワードが違います。" 
                Return  
            End If  
            Session("StaffID") = staffid  
            Session("StaffName") = staffname  
            Session("AdminFlag") = adminflag  
            Response.Redirect("menu.aspx")  
        End Sub  
        Private Function CheckUserPassword(ByVal userid As String, ByVal password As String) As Boolean  
            Dim ret As Boolean  
            Dim strSQL As String  
            strSQL = "SELECT goodsID, category FROM goods " & _  
                "WHERE goodsName = '" & userid.Replace("'", "''") & _  
                "' AND price = '" & password.Replace("'", "''") & "'"  
     
            Dim cnStr As String = System.Configuration.ConfigurationManager.ConnectionStrings("OrderConnectionString").ConnectionString  
     
            Using connection As New OledbConnection(cnStr)  
                Dim command As New OleDbCommand(strSQL, connection)  
                connection.Open()  
                Try  
                    Dim dr As OleDbDataReader = command.ExecuteReader  
                    If dr.Read Then  
                        staffid = dr("goodsID")  
                        staffname = dr("category")  
                        adminflag = dr("category")  
                        ret = True 
                    Else  
                        ret = False 
                    End If  
                Catch ex As Exception  
                    ret = False 
                End Try  
                connection.Close()  
            End Using  
            Return ret  
        End Function  
        Protected Sub Page_Load(ByVal sender As Object, ByVal e As System.EventArgs)  
            txtUserID.Focus()  
        End Sub  
    </script> 
    <html xmlns="http://www.w3.org/1999/xhtml">  
    <head runat="server">  
        <title>無題のページ</title> 
        </head> 
    <body> 
        <form id="form1" runat="server">  
        <p> 
                        ユーザーID:<asp:TextBox ID="txtUserID" runat="server" CssClass="ImeOff" TabIndex="1"></asp:TextBox> 
                        パスワード:<asp:TextBox ID="txtpassword" runat="server" CssClass="ImeOff" TabIndex="2"   
                            TextMode="Password"></asp:TextBox> 
                        <asp:Button ID="btnLogon" runat="server" onclick="btnLogon_Click" TabIndex="3"   
                            Text="ログオン" /> 
                        <asp:Label ID="lblErr" runat="server" ForeColor="Red"></asp:Label> 
                    </p> 
        </form> 
    </body> 
    </html> 
    2009年1月28日 14:32

回答

  • 回答者の意見を聞いてデバックしたのでしょうか?

    パスワードが int 型というのがよく分かりませんが、
     
    "' AND price = '" & password.Replace("'", "''") & "'"

    "' AND price = " & password

    にしたらいけるかもしれません。デバッガを使って、上記の変更で dr.Read が
    True になるか試してみてください。

    でも、それが OK になっても、もう一つ変なところがあって、そこを直さないと
    ダメかもしれません。それは、以下の部分です。

    Dim staffname As String  
    Dim adminflag As Boolean  

    ・・・中略・・・

    staffname = dr("category")  
    adminflag = dr("category")

    DB の category は何か調べて正しく直す必要があると思います。

    • 回答としてマーク komi1 2009年1月30日 15:20
    2009年1月29日 15:32

すべての返信

  • 以下のところで ret が False になるからだというのは理解しているで
    しょうか? そこから原因を推定して、デバッガ等で原因を究明できるはずです。

     
    Try     
        Dim dr As OleDbDataReader = command.ExecuteReader     
        If dr.Read Then     
            staffid = dr("goodsID")     
            staffname = dr("category")     
            adminflag = dr("category")     
            ret = True    
        Else     
            ret = False    
        End If     
    Catch ex As Exception     
        ret = False    
    End Try    

    コードを丸投げするのはやめて、自分で原因を追究してみませんか?

    2009年1月28日 16:53
  • komi1さん の発言:
    正しいID、パスワードを入れても"ユーザーIDまたはパスワードが違います。" というエラーになってしまいます。

    このエラーはご自分で設定されたエラーメッセージですから、本来どのようなエラーが出ているのかを確かめる必要があります。
    CatchのところでexのMessageプロパティを確認してみて下さい。

    また、エラーの原因ですが、Order.MDBをアプリケーションルート配下のApp_Dataに置かれていますか?


    ★良い回答には回答済みマークを付けよう! わんくま同盟 MVP - Visual C# http://blogs.wankuma.com/trapemiya/
    2009年1月29日 1:08
    モデレータ
  • エラーを確認してみましたが、問題はアクセスのデータの項目passwordをintegerにしていたことに問題がありました。

    Private Function CheckUserPassword(ByVal userid As String, ByVal password As Integer) As Boolean と
    変更をしましたらpassword.Replaceに波線が出てしまいました。

    ReplaceでF1を押して使い方を見てみましたら(このインスタンスに出現する指定 Unicode 文字または String をすべて、別に指定した Unicode 文字または String に置換します。)となっているのですがINTEGERにするにはReplaceを何に変えたらいいのでしょうか?

    2009年1月29日 14:54
  • 回答者の意見を聞いてデバックしたのでしょうか?

    パスワードが int 型というのがよく分かりませんが、
     
    "' AND price = '" & password.Replace("'", "''") & "'"

    "' AND price = " & password

    にしたらいけるかもしれません。デバッガを使って、上記の変更で dr.Read が
    True になるか試してみてください。

    でも、それが OK になっても、もう一つ変なところがあって、そこを直さないと
    ダメかもしれません。それは、以下の部分です。

    Dim staffname As String  
    Dim adminflag As Boolean  

    ・・・中略・・・

    staffname = dr("category")  
    adminflag = dr("category")

    DB の category は何か調べて正しく直す必要があると思います。

    • 回答としてマーク komi1 2009年1月30日 15:20
    2009年1月29日 15:32
  • ReplaceはInteger型には使えません。サニタイズするためにReplaceを使用されていると思いますが、パスワードがInteger型、すなわち数値であるならば「'」が存在することはありえません。したがってReplaceを使うことは無意味です。
    ★良い回答には回答済みマークを付けよう! わんくま同盟 MVP - Visual C# http://blogs.wankuma.com/trapemiya/
    2009年1月30日 0:37
    モデレータ
  • もとのコードのデータ項目もpasswordはintegerだったのでしょうか。文字列型(VARCHAR2とかCHAR)だったのでは?
    もしそうならば、
    Accessのデータの項目passwordをintegerにしていた事が問題なのであれば、まずそれをString型にしてあげて、対応する変数もすべてString型するという変更はなぜ行わないのでしょうか。
    投稿を見ると、Accessのデータ項目はintegerのままで、変数をintegerにしているように思えますが、それではどんどん泥沼に嵌ると思います。


    http://blogs.wankuma.com/hatsune/
    2009年1月30日 1:21
  • komi1 の発言:エラーを確認してみましたが、問題はアクセスのデータの項目passwordをintegerにしていたことに問題がありました。
    もとのコードのデータ項目もpasswordはintegerだったのでしょうか。文字列型(VARCHAR2とかCHAR)だったのでは?
    もしそうならば、
    Accessのデータの項目passwordをintegerにしていた事が問題なのであれば、まずそれをString型にしてあげて、対応する変数もすべてString型するという変更はなぜ行わないのでしょうか。
    投稿を見ると、Accessのデータ項目はintegerのままで、変数をintegerにしているように思えますが、それではどんどん泥沼に嵌ると思います。


    http://blogs.wankuma.com/hatsune/
    2009年1月30日 1:22
  •  ご回答ありがとうございます。

    もとのコードのデータ項目のpasswordは(VARCHAR)だったのですが、数字しか使っていなかったのでINTGERにしてしまいました。

    これをSTRINGにしたら、問題は解消されました。

    できればintgerでやりたいと思い

    "' AND price = '" & password.Replace("'", "''") & "'"を

    "' AND price = " & password

    にしましたが dr.Read はTrue になりませんでした。

    取りあえず問題は解決しましたが、実力不足です。本書にて学習を進めていきたいと思います。

    ご回答いただき、ありがとうございました。

    2009年1月30日 15:19
  •  

    > "' AND price = '" & password.Replace("'", "''") & "'"を
    > "' AND price = " & password
    > にしましたが dr.Read はTrue になりませんでした。

    そんなことはないはずですけど。

    Access の goods テーブルの各フィールドのデータ型は以下のようになっていた
    のではないですか?

    goodsName  テキスト型
    price      数値型

    であれば、最初の質問のコードのまま、先にレスしたように、

    "' AND price = '" & password.Replace("'", "''") & "'"

    "' AND price = " & password

    に変更するだけで、間違いなくレコードが抽出され(userid と password が正し
    く入力されればですが)、dr.Read が True になるはずです。

    ただし、これも先のレスで書きましたが、

    Dim staffname As String  
    Dim adminflag As Boolean  

    ・・・中略・・・

    staffname = dr("category")  
    adminflag = dr("category")

    の部分が間違っているので、ここで例外がスローされ、やはり ret は False に
    なって、

    > 正しいID、パスワードを入れても"ユーザーIDまたはパスワードが違います。"
    > というエラーになってしまいます。

    という結果になりますよ。

    もし、category がテキスト型であるとすると、adminflag を String 型として宣
    言しないとダメです。

    > 本書にて学習を進めていきたいと思います。

    本もいいですが、回答者のレスをちゃんと読んでますか?

    2009年1月31日 4:20
  •     Dim staffid As String
        Dim staffname As String  
        Dim adminflag As String

    と、書き直したのですが

    OleDbExceptiongがキャッチされました

    クエリ式 'goodsName = 'XXXXX' AND price = '5124' の 文字列の構文エラーです。

    というエラーになっていまいます。

    2009年1月31日 16:31
  •  

    goodsName  テキスト型
    price      数値型

    のときは、WHERE 句は、

    goodsName = 'XXXXX' AND price = 5124

    2009年1月31日 17:50
  •  

    続きです。

    > クエリ式 'goodsName = 'XXXXX' AND price = '5124' の 文字列の構文エラーです。

    から想像すると、

    "' AND price = " & password

    ではなくて、

    "' AND price = '" & password

    になっているように思えます。(つまり .Replace... 以下は消したが、" の前の ' が
    残っている)

    大文字小文字、全角半角の違いを含めて、一字一句違わないか調べてください。

    なお、Dim adminflag As String に直すのは上記とは別の問題で、そこを直してもクエ
    リの構文エラーの問題は解決しません。(もちろん、それを直すのも必須ですが。クエ
    リの構文エラーの問題が解決できても、その後のステップ adminflag = dr("category")
    でエラーになるので)

    2009年2月1日 6:35
  • そのとおりでした。
    ”を削除したらパスワードを取得できました。

    型や、’の一字一句がこんなに大切なことなんだとわかりました。
    すっきりしました。

    ありがとうございました。

    2009年2月1日 14:28