トップ回答者
アクセスの接続について

質問
-
現在本にてログイン画面の勉強中なんですが
本(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>
回答
-
回答者の意見を聞いてデバックしたのでしょうか?
パスワードが 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
すべての返信
-
以下のところで 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 コードを丸投げするのはやめて、自分で原因を追究してみませんか?
-
komi1さん の発言:
正しいID、パスワードを入れても"ユーザーIDまたはパスワードが違います。" というエラーになってしまいます。このエラーはご自分で設定されたエラーメッセージですから、本来どのようなエラーが出ているのかを確かめる必要があります。
CatchのところでexのMessageプロパティを確認してみて下さい。また、エラーの原因ですが、Order.MDBをアプリケーションルート配下のApp_Dataに置かれていますか?
★良い回答には回答済みマークを付けよう! わんくま同盟 MVP - Visual C# http://blogs.wankuma.com/trapemiya/ -
エラーを確認してみましたが、問題はアクセスのデータの項目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を何に変えたらいいのでしょうか?
-
回答者の意見を聞いてデバックしたのでしょうか?
パスワードが 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
-
もとのコードのデータ項目もpasswordはintegerだったのでしょうか。文字列型(VARCHAR2とかCHAR)だったのでは?もしそうならば、Accessのデータの項目passwordをintegerにしていた事が問題なのであれば、まずそれをString型にしてあげて、対応する変数もすべてString型するという変更はなぜ行わないのでしょうか。投稿を見ると、Accessのデータ項目はintegerのままで、変数をintegerにしているように思えますが、それではどんどん泥沼に嵌ると思います。
http://blogs.wankuma.com/hatsune/ -
komi1 の発言:エラーを確認してみましたが、問題はアクセスのデータの項目passwordをintegerにしていたことに問題がありました。もとのコードのデータ項目もpasswordはintegerだったのでしょうか。文字列型(VARCHAR2とかCHAR)だったのでは?もしそうならば、Accessのデータの項目passwordをintegerにしていた事が問題なのであれば、まずそれをString型にしてあげて、対応する変数もすべてString型するという変更はなぜ行わないのでしょうか。投稿を見ると、Accessのデータ項目はintegerのままで、変数をintegerにしているように思えますが、それではどんどん泥沼に嵌ると思います。
http://blogs.wankuma.com/hatsune/ -
ご回答ありがとうございます。
もとのコードのデータ項目のpasswordは(VARCHAR)だったのですが、数字しか使っていなかったのでINTGERにしてしまいました。
これをSTRINGにしたら、問題は解消されました。
できればintgerでやりたいと思い
"' AND price = '" & password.Replace("'", "''") & "'"を
"' AND price = " & password
にしましたが dr.Read はTrue になりませんでした。
取りあえず問題は解決しましたが、実力不足です。本書にて学習を進めていきたいと思います。
ご回答いただき、ありがとうございました。
-
> "' 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 型として宣
言しないとダメです。> 本書にて学習を進めていきたいと思います。
本もいいですが、回答者のレスをちゃんと読んでますか?
-
続きです。
> クエリ式 'goodsName = 'XXXXX' AND price = '5124' の 文字列の構文エラーです。
から想像すると、
"' AND price = " & password
ではなくて、
"' AND price = '" & password
になっているように思えます。(つまり .Replace... 以下は消したが、" の前の ' が
残っている)大文字小文字、全角半角の違いを含めて、一字一句違わないか調べてください。
なお、Dim adminflag As String に直すのは上記とは別の問題で、そこを直してもクエ
リの構文エラーの問題は解決しません。(もちろん、それを直すのも必須ですが。クエ
リの構文エラーの問題が解決できても、その後のステップ adminflag = dr("category")
でエラーになるので)