- PR -

ACCESS&ASP.NETログイン認証。

投稿者投稿内容
Keisuke
大ベテラン
会議室デビュー日: 2003/10/24
投稿数: 105
投稿日時: 2003-12-07 23:33
引用:

hirokoさんの書き込み (2003-12-07 23:04) より:
型 'object' を型 'string' に暗黙的に変換できません。というエラーが出ます。


メッセージのとおり、“暗黙的に”変換できないのだから、“明示的に”変換すれば良いのです。
hiroko
常連さん
会議室デビュー日: 2003/11/26
投稿数: 23
投稿日時: 2003-12-09 04:36
上記のにしお様のプログラムをお借りして、起動したのですが、なぜか
if (dr.Read()) {
// データがあった=認証成功
} else {
// データがなかった=認証失敗
}
となるはずが、結果が逆に出力されます。
というのは、IDとPASSが一致したら、認証OKと出力されるはずが、登録されていませんというメッセージが出力され、一致しなければ、認証OKというコードが出力されます。
自分でもよくわからないのですが、もしこうではないか?など気づいた方がいらっしゃいましたら、教えていただけないでしょうか?お願いいたします。
hiroko
常連さん
会議室デビュー日: 2003/11/26
投稿数: 23
投稿日時: 2003-12-09 04:58
他の所に同じコードで作ったら動きました・・・。
どこがおかしかったのかわかりませんが、解決しました。
お騒がせいたしました。
にしお
常連さん
会議室デビュー日: 2003/12/01
投稿数: 44
投稿日時: 2003-12-11 16:43
以前、この欄で皆様のお力添えにより認証処理を完成することができました。
ありがとうございました。
しかしながら、あの方法だと、IDが同じ人がいるため、パスワードを誤って入力したときに他人のものでログインできてしまうことになるので、今回
SelCmd.Connection.Open();
dataset.Clear();
SelCmd.Parameters.Add("会員ID",OleDbType.VarWChar);
adapter.SelectCommand.Parameters["会員ID"].Value=txt_left_id.Text;
adapter.Fill(dataset);
SelCmd.Connection.Close();
string loginpass;
if (dataset.Tables["会員名簿マスタ"].Rows.Count==0)
{
txt_left_pwd.Text="";
lbl_alarm.Text="会員IDとPasswardが<br>  一致しません。";
}
loginpass=dataset.Tables["会員名簿マスタ"].Rows[0]["パスワード"].ToString();

if(txt_left_pwd.Text==loginpass)
{
Label1.Visible=false;
という形で、まずテキストボックスのIDとデータベース内のIDが等しいレコードをfillでデータセットに格納。もし格納できたならそれを元にパスワードをチェック。もし格納できなければエラーという形にしたいのです。
しかし、adapter.Fill(dataset);の段階で、『パラメータ ?_1 にはデフォルト値はありません。』というエラーが出ます。 検索したりヘルプを見たりしたのですが、よくわかりません。どうか今一度お力添えをいただきたいです。
よろしくお願いいたします。

以下、スタックトレース
[OleDbException (0x80040e10): パラメータ ?_1 にはデフォルト値はありません。]
System.Data.OleDb.OleDbCommand.ExecuteCommandTextErrorHandling(Int32 hr)
System.Data.OleDb.OleDbCommand.ExecuteCommandTextForSingleResult(tagDBPARAMS dbParams, Object& executeResult)
System.Data.OleDb.OleDbCommand.ExecuteCommandText(Object& executeResult)
System.Data.OleDb.OleDbCommand.ExecuteCommand(CommandBehavior behavior, Object& executeResult)
System.Data.OleDb.OleDbCommand.ExecuteReaderInternal(CommandBehavior behavior, String method)
System.Data.OleDb.OleDbCommand.ExecuteReader(CommandBehavior behavior)
System.Data.OleDb.OleDbCommand.System.Data.IDbCommand.ExecuteReader(CommandBehavior behavior)
System.Data.Common.DbDataAdapter.Fill(Object data, Int32 startRecord, Int32 maxRecords, String srcTable, IDbCommand command, CommandBehavior behavior)
System.Data.Common.DbDataAdapter.Fill(DataSet dataSet, Int32 startRecord, Int32 maxRecords, String srcTable, IDbCommand command, CommandBehavior behavior)
System.Data.Common.DbDataAdapter.Fill(DataSet dataSet)
pve_system.WebForm1.btn_left_login_Click(Object sender, EventArgs e) in c:\inetpub\wwwroot\pve_system\left.aspx.cs:371
System.Web.UI.WebControls.Button.OnClick(EventArgs e)
System.Web.UI.WebControls.Button.System.Web.UI.IPostBackEventHandler.RaisePostBackEvent(String eventArgument)
System.Web.UI.Page.RaisePostBackEvent(IPostBackEventHandler sourceControl, String eventArgument)
System.Web.UI.Page.RaisePostBackEvent(NameValueCollection postData)
System.Web.UI.Page.ProcessRequestMain() +1263


[ メッセージ編集済み 編集者: にしお 編集日時 2003-12-11 16:44 ]
Jitta
ぬし
会議室デビュー日: 2002/07/05
投稿数: 6267
お住まい・勤務地: 兵庫県・海手
投稿日時: 2003-12-11 17:31
え゛?!

> IDが同じ人がいるため、パスワードを誤って入力したときに
> 他人のものでログインできてしまうことになる

 それって、IDの振り方がおかしくないですか?IDentifyできないんじゃ、IDじゃないと思いますけど?
 また、パスワードが「誤っている」のか「正しい」のか判定もできないのでは?

ID = ABC12345 , PASS = xxABC
ID = ABC12345 , PASS = yyCBA

とあったとして、上のABC12345さんが間違えてパスワードをyyCBAと入力したときと、下のABC12345さんが正しくyyCBAと入力したときで、どういう違いがあるのでしょう?前回「そうです」とおっしゃったSELECT文は、IDとパスワードの両方が完全に一致しているときのみ結果を返すのですけど???

で、今回ご提示のソースですが、
adapter.Fill(dataset);
が通ったとして、ABC12345さんが2行返ってきます。ちなみに、返ってこないのは登録されていないIDを指定したときです。
#この辺の文意が不明ですが、格納とはDataTableの方にですよね?
上のABC12345さんも、下のABC12345さんも、どちらであっても2行返ってきます。そして、次のパスワードの照合ですが、インデックス0としか照会していないですよね。すると、時と場合によってどちらかの人は、パスワードが正しいのにログインできなくなります。
#この辺はデータベースの集合論たらいうもので、
#返ってくる2行の取り出し順序が不定なために起こる

ということで、IDは一意でなければならない、と思うのですが。。。
ふぐ
会議室デビュー日: 2003/06/09
投稿数: 7
投稿日時: 2003-12-11 17:59
引用:

Jittaさんの書き込み (2003-12-11 17:31) より:

 それって、IDの振り方がおかしくないですか?IDentifyできないんじゃ、IDじゃないと思いますけど?
 また、パスワードが「誤っている」のか「正しい」のか判定もできないのでは?




そうです。
認証のロジックではIDのみでユニークにならないとだめです。
メールアドレスとパスワードを考えてもらえばよく理解できる
と思います。
よってテーブルのキー、インデックスを再度ふり直した方が
よいかと思います。
では。
にしお
常連さん
会議室デビュー日: 2003/12/01
投稿数: 44
投稿日時: 2003-12-11 18:25
あぁ、申し訳ございません。
読み直してみて、説明が全然なっていませんでした。
登録の段階でIDは重複しないようになっています。
Jitta様の教わったやり方で認証するときも両方が完全に一致しているときのみ結果を返すというのも理解できております。
ただ、この後、この認証された人のデータ(名前、住所等)をセッションに入れようと思っておりまして、データセットにその人の情報が入っていればセッションに入れるのも楽なので、このような形を取ろうと思いました。
以前に教わって完成したやり方だと、認証の後、その人の情報を参照するのがデータセットから値を持ってくるより手間がかかると思ったからです。(初心者の私の考えなのであたっているかは別として…)
それでコードを変更した際上記のようなエラーが出ました。
困惑させ申し訳ありませんでした。

[ メッセージ編集済み 編集者: にしお 編集日時 2003-12-11 18:25 ]
にしお
常連さん
会議室デビュー日: 2003/12/01
投稿数: 44
投稿日時: 2003-12-11 20:35
申し訳ありません。
私のミスでした。
SELECT文でなぜかIDだけでなく、パスワードのところも?としていました。
度々お騒がせして申し訳ありません。
以後気をつけます。
Jitta様、ふぐ様、ありがとうございました。
毎回大変助かっております。
今後ともよろしくお願いいたします。
失礼いたします。

スキルアップ/キャリアアップ(JOB@IT)