- PR -

DataRowを利用したif文

1
投稿者投稿内容
C#初心者
常連さん
会議室デビュー日: 2005/12/22
投稿数: 24
投稿日時: 2005-12-25 02:05
C#で作っています。
ログイン画面を作ろうと思っています。
pass.textに入力した値と、
DataRowにデータベースから取得した、パスワードの情報 dr["パスワード"]を
照合して、正しいかチェックしようとしましたが、

予期しない参照比較です。比較値を取得するには型 'string' に右辺をキャストしてください。 とエラーが出ました。この構文のどこを変更すればよろしいでしょうか。

if (pass.Text == dr["パスワード"])
{
処理
}
ココで詰まってしまって、すごく困っています。よろしくお願いします。
べる
ぬし
会議室デビュー日: 2003/09/20
投稿数: 1093
投稿日時: 2005-12-25 02:50
dr["パスワード"] はおそらくSystem.Object型ですよね。で、pass.Text はきっと
System.String型です。それを比較しようとしたからエラーが出たんです。

言われている通り右辺をキャストしましょう。(string)dr["パスワード"]

#私はいつも dr["パスワード"].ToString() でやっちゃいますが。
囚人
ぬし
会議室デビュー日: 2005/08/13
投稿数: 1019
投稿日時: 2005-12-25 17:16
引用:

#私はいつも dr["パスワード"].ToString() でやっちゃいますが。


このやり方推奨派の方結構いらっしゃると思うんですが、私は反対意見です。

絶対確実に String オブジェクトである事を期待するならば、String にキャストすべきではないでしょうか。
絶対確実に String ならばキャストは成功し、それで良し。何らかの理由で(バグ、インデクサのスペルミス)で String 型でなかったのならば、実行時エラーが起きて欲しいからです。

ToString() を呼び出す方法ならば、「必ず」成功してしまい、間違いだと分かるのは、更に後になり、どこで間違っているのか分かり難くなります。

どうでしょう。
_________________
囚人のジレンマな日々
じゃんぬねっと
ぬし
会議室デビュー日: 2004/12/22
投稿数: 7811
お住まい・勤務地: 愛知県名古屋市
投稿日時: 2005-12-25 18:14
  • xxxDataReader.GetString メソッドに name を対応して欲しい。
  • そんなことより、型付けされた DataSet を使いたい。

_________________
C# と VB.NET の入門サイト
じゃんぬねっと日誌
一郎
ぬし
会議室デビュー日: 2002/10/11
投稿数: 1081
投稿日時: 2005-12-26 11:26
引用:

囚人さんの書き込み (2005-12-25 17:16) より:
引用:

#私はいつも dr["パスワード"].ToString() でやっちゃいますが。


このやり方推奨派の方結構いらっしゃると思うんですが、私は反対意見です。


私も反対ですね。
「インスタンスそのものをstring型として参照する」と「インスタンスの状態を文字列で表現する」はまったく別の意味ですから。
べる
ぬし
会議室デビュー日: 2003/09/20
投稿数: 1093
投稿日時: 2005-12-26 22:54
まず、
引用:
言われている通り右辺をキャストしましょう。(string)dr["パスワード"]

私の正規の回答はこちら↑です。

dr["パスワード"].ToString()
この方法を推奨しません。推奨派の方が結構いらっしゃるのなら意外ですね。

引用:
絶対確実に String オブジェクトである事を期待するならば、String にキャストすべきではないでしょうか。
絶対確実に String ならばキャストは成功し、それで良し。何らかの理由で(バグ、インデクサのスペルミス)で String 型でなかったのならば、実行時エラーが起きて欲しいからです。

Stringでない場合にエラーになってほしいのなら、もちろんキャストすべきですね。

作ってるものや開発スタイルにもよるんですが、

・DBから、intだかvarcharだかわからないけど、とりあえず番号が渡される、と決まっているとき
・「DBにNULLが入っているときは空文字」にしたいとき(DbNull比較が面倒で)
などなど、.ToString()しちゃうかな。

たとえば、dr["name"].ToString() で得た値を、ただ表示するだけの場合とかに、
運用に移ってからバグが出たことを考えると、ひとつの項目の表示に失敗しただけで
ランタイムエラーになるよりは、バグとしては報告してもらって、修正してる間も、
運用は止まらないほうがいい場合もあります。

#インデクサのスペルミスの場合は.ToString()してもその前にエラーになってくれますね。
囚人
ぬし
会議室デビュー日: 2005/08/13
投稿数: 1019
投稿日時: 2005-12-27 10:08
引用:

dr["パスワード"].ToString()
この方法を推奨しません。


ですよね^^;

引用:

推奨派の方が結構いらっしゃるのなら意外ですね。


DataRow に限らず、「object」を入れるようになっているコレクション系でよく見かけます。
HttpSessionState だとか、ArrayList だとかで String を管理しているときですね。
「推奨」しているわけではないのかな。

引用:

・「DBにNULLが入っているときは空文字」にしたいとき(DbNull比較が面倒で)
などなど、.ToString()しちゃうかな。


ぬぉ。DbNull.ToString() は空文字ですかぁ。いい事聞いた。
いちいち比較してました…。


_________________
囚人のジレンマな日々
1

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