- - PR -
DataRowを利用したif文
1
投稿者 | 投稿内容 | ||||||||||||
---|---|---|---|---|---|---|---|---|---|---|---|---|---|
|
投稿日時: 2005-12-25 02:05
C#で作っています。
ログイン画面を作ろうと思っています。 pass.textに入力した値と、 DataRowにデータベースから取得した、パスワードの情報 dr["パスワード"]を 照合して、正しいかチェックしようとしましたが、 予期しない参照比較です。比較値を取得するには型 'string' に右辺をキャストしてください。 とエラーが出ました。この構文のどこを変更すればよろしいでしょうか。 if (pass.Text == dr["パスワード"]) { 処理 } ココで詰まってしまって、すごく困っています。よろしくお願いします。 | ||||||||||||
|
投稿日時: 2005-12-25 02:50
dr["パスワード"] はおそらくSystem.Object型ですよね。で、pass.Text はきっと
System.String型です。それを比較しようとしたからエラーが出たんです。 言われている通り右辺をキャストしましょう。(string)dr["パスワード"] #私はいつも dr["パスワード"].ToString() でやっちゃいますが。 | ||||||||||||
|
投稿日時: 2005-12-25 17:16
このやり方推奨派の方結構いらっしゃると思うんですが、私は反対意見です。 絶対確実に String オブジェクトである事を期待するならば、String にキャストすべきではないでしょうか。 絶対確実に String ならばキャストは成功し、それで良し。何らかの理由で(バグ、インデクサのスペルミス)で String 型でなかったのならば、実行時エラーが起きて欲しいからです。 ToString() を呼び出す方法ならば、「必ず」成功してしまい、間違いだと分かるのは、更に後になり、どこで間違っているのか分かり難くなります。 どうでしょう。 _________________ 囚人のジレンマな日々 | ||||||||||||
|
投稿日時: 2005-12-25 18:14
_________________ C# と VB.NET の入門サイト じゃんぬねっと日誌 | ||||||||||||
|
投稿日時: 2005-12-26 11:26
私も反対ですね。 「インスタンスそのものをstring型として参照する」と「インスタンスの状態を文字列で表現する」はまったく別の意味ですから。 | ||||||||||||
|
投稿日時: 2005-12-26 22:54
まず、
dr["パスワード"].ToString() この方法を推奨しません。推奨派の方が結構いらっしゃるのなら意外ですね。
作ってるものや開発スタイルにもよるんですが、 ・DBから、intだかvarcharだかわからないけど、とりあえず番号が渡される、と決まっているとき ・「DBにNULLが入っているときは空文字」にしたいとき(DbNull比較が面倒で) などなど、.ToString()しちゃうかな。 たとえば、dr["name"].ToString() で得た値を、ただ表示するだけの場合とかに、 運用に移ってからバグが出たことを考えると、ひとつの項目の表示に失敗しただけで ランタイムエラーになるよりは、バグとしては報告してもらって、修正してる間も、 運用は止まらないほうがいい場合もあります。 #インデクサのスペルミスの場合は.ToString()してもその前にエラーになってくれますね。 | ||||||||||||
|
投稿日時: 2005-12-27 10:08
ですよね^^;
DataRow に限らず、「object」を入れるようになっているコレクション系でよく見かけます。 HttpSessionState だとか、ArrayList だとかで String を管理しているときですね。 「推奨」しているわけではないのかな。
ぬぉ。DbNull.ToString() は空文字ですかぁ。いい事聞いた。 いちいち比較してました…。 _________________ 囚人のジレンマな日々 |
1