C# と VB.NET の質問掲示板

ASP.NET、C++/CLI、Java 何でもどうぞ

C# と VB.NET の入門サイト

Re[11]: if文で…


(過去ログ 67 を表示中)

[トピック内 16 記事 (1 - 16 表示)]  << 0 >>

■39105 / inTopicNo.1)  if文で…
  
□投稿者/ へたれ (1回)-(2009/07/30(Thu) 11:59:22)

分類:[C#] 

つい最近までVBを使用していて、5日ほど前にC#の勉強をするよう言われて
今プログラムを作成中なのですが…
プログラミングの知識が非常に薄いため初歩的すぎる部分で躓いています…。

OracleDataReaderでデータを読み込んで、その読み込んだデータの値が0だった場合は「正常終了」、
1だった場合は「異常終了」と表示させたいのですが、
そのためにif文を書くとエラーが出ます…。
コードは以下です。
String mySQL2 = "簡単なSELECT文";
OracleCommand myCmd2 = new OracleCommand(mySQL2, cnn);

OracleDataReader myRead2 = myCmd2.ExecuteReader();

while (myRead2.Read())
{
if (myRead2.GetValue(0) = 0)
lblStat.Text = "正常終了";
else
lblStat.Text = "異常終了";
}
エラーが出るのは「if (myRead2.GetValue(0) = 0)」の部分で、
エラーの内容は「代入式の左辺には変数、プロパティ、またはインデクサを指定してください」と、
「型'object'を'bool'に暗黙的に変換できません。明示的な変換が存在します。(castが不足していないかどうかを確認してください。)」です。

どなたかお答えをよろしくお願いします。
引用返信 編集キー/
■39107 / inTopicNo.2)  Re[1]: if文で…
□投稿者/ Hongliang (440回)-(2009/07/30(Thu) 12:18:32)
2009/07/30(Thu) 12:19:10 編集(投稿者)

> エラーが出るのは「if (myRead2.GetValue(0) = 0)」の部分で、
> エラーの内容は「代入式の左辺には変数、プロパティ、またはインデクサを指定してください」と、

C# では、代入と等値演算に別の演算子を使用します。
代入は =
等値は == (= が二つ)
です。

> 「型'object'を'bool'に暗黙的に変換できません。明示的な変換が存在します。(castが不足していないかどうかを確認してください。)」です。

OracleDataReader.GetValue(Int32)
http://msdn.microsoft.com/ja-jp/library/system.data.oracleclient.oracledatareader.getvalue.aspx
を見れば分かりますが(インテリセンスにも出てきますね)、このメソッドの返値は Object 型です。
Object 型のものと Int32(int)型のものは、等値演算で比較することはできません。
GetValue(0) で取得できるのが int であるのが明らかなら、これをキャストして int 型にすることで等値演算が可能になります。
http://msdn.microsoft.com/ja-jp/library/ms173105.aspx
ただし、もしこの列が NULL 許容列なら、int 型の他に DBNull.Value が入っている可能性があります。このとき int にキャストすると例外が発生します。その場合は、OracleDataReader.IsDBNull(Int32) などで事前に確認するのが良いでしょう。
引用返信 編集キー/
■39114 / inTopicNo.3)  Re[2]: if文で…
□投稿者/ へたれ (2回)-(2009/07/30(Thu) 13:37:40)
No39107 (Hongliang さん) に返信

> C# では、代入と等値演算に別の演算子を使用します。
> 代入は =
> 等値は == (= が二つ)
> です。

そうなんですか!!
全然知りませんでした。ありがとうございます。

> OracleDataReader.GetValue(Int32)
> http://msdn.microsoft.com/ja-jp/library/system.data.oracleclient.oracledatareader.getvalue.aspx
> を見れば分かりますが(インテリセンスにも出てきますね)、このメソッドの返値は Object 型です。
> Object 型のものと Int32(int)型のものは、等値演算で比較することはできません。
> GetValue(0) で取得できるのが int であるのが明らかなら、これをキャストして int 型にすることで等値演算が可能になります。
> http://msdn.microsoft.com/ja-jp/library/ms173105.aspx
> ただし、もしこの列が NULL 許容列なら、int 型の他に DBNull.Value が入っている可能性があります。このとき int にキャストすると例外が発生します。その場合は、OracleDataReader.IsDBNull(Int32) などで事前に確認するのが良いでしょう。

この部分の意味がよく分からなかったのですが…
どういうことなのでしょうか…;;
引用返信 編集キー/
■39115 / inTopicNo.4)  Re[3]: if文で…
□投稿者/ επιστημη (2074回)-(2009/07/30(Thu) 13:53:03)
επιστημη さんの Web サイト
> この部分の意味がよく分からなかったのですが…

どの部分ですか? なにがわかりませんか?


引用返信 編集キー/
■39116 / inTopicNo.5)  Re[3]: if文で…
□投稿者/ よねKEN (395回)-(2009/07/30(Thu) 13:56:22)
2009/07/30(Thu) 13:57:02 編集(投稿者)

No39114 (へたれ さん) に返信
> ■No39107 (Hongliang さん) に返信
>>OracleDataReader.GetValue(Int32)
>>http://msdn.microsoft.com/ja-jp/library/system.data.oracleclient.oracledatareader.getvalue.aspx
>>を見れば分かりますが(インテリセンスにも出てきますね)、このメソッドの返値は Object 型です。
>>Object 型のものと Int32(int)型のものは、等値演算で比較することはできません。
>>GetValue(0) で取得できるのが int であるのが明らかなら、これをキャストして int 型にすることで等値演算が可能になります。
>>http://msdn.microsoft.com/ja-jp/library/ms173105.aspx
>>ただし、もしこの列が NULL 許容列なら、int 型の他に DBNull.Value が入っている可能性があります。このとき int にキャストすると例外が発生します。その場合は、OracleDataReader.IsDBNull(Int32) などで事前に確認するのが良いでしょう。
>
> この部分の意味がよく分からなかったのですが…
> どういうことなのでしょうか…;;

この部分というのはどの部分ですか?

(1) このメソッドの返値は Object 型です。
(2) Object 型のものと Int32(int)型のものは、等値演算で比較することはできません。
(3) GetValue(0) で取得できるのが int であるのが明らかなら、
(4) これをキャストして int 型にすることで等値演算が可能になります。
(5) ただし、もしこの列が NULL 許容列なら、int 型の他に DBNull.Value が入っている可能性があります。
(6) このとき int にキャストすると例外が発生します。その場合は、OracleDataReader.IsDBNull(Int32) などで事前に確認するのが良いでしょう。

引用返信 編集キー/
■39118 / inTopicNo.6)  Re[4]: if文で…
□投稿者/ へたれ (3回)-(2009/07/30(Thu) 14:00:59)
言葉が足りなくてすみません…

> (2) Object 型のものと Int32(int)型のものは、等値演算で比較することはできません。
> (3) GetValue(0) で取得できるのが int であるのが明らかなら、
> (4) これをキャストして int 型にすることで等値演算が可能になります。

まずこの3つが分かりません…
引用返信 編集キー/
■39119 / inTopicNo.7)  Re[5]: if文で…
□投稿者/ .SHO (985回)-(2009/07/30(Thu) 14:16:53)
>>(2) Object 型のものと Int32(int)型のものは、等値演算で比較することはできません。

そのままじゃん。。orz
引用返信 編集キー/
■39120 / inTopicNo.8)  Re[5]: if文で…
□投稿者/ よねKEN (396回)-(2009/07/30(Thu) 14:25:47)
2009/07/30(Thu) 14:35:31 編集(投稿者)

No39118 (へたれ さん) に返信
>>(2) Object 型のものと Int32(int)型のものは、等値演算で比較することはできません。

Object o = 1;
int i = 1;

if (o == i) // ←このようにObject型とint型を==で比較はできません。
{
}

という意味です。

>>(3) GetValue(0) で取得できるのが int であるのが明らかなら、

上記の例では変数oはObject型ですが、その中身はint型の1であることが明らかです。
しかし、
Object o = "あいう";
のように文字列を代入しておくこともできるのがObject型なので、
変数oの中身が何型の値が入っているかはプログラム次第です。

GetValue(0)で取得する元のOracleの列がありますね。
この列からデータを取得する場合に、どんな型の値が取得できるでしょうか?
もしそれがint型であるなら・・・という意味です。

>>(4) これをキャストして int 型にすることで等値演算が可能になります。

(2)の説明したコード例のif文は、
if ((int)o == i) // (int)でint型へのキャスト
のように変数oをint型にキャストすれば変数iと==で比較できます、
という意味です。

等号は「==」だと知らないということは、
C#の文法を一切学習されていないように見受けられますので、
C#の入門書一冊読まれることをお勧めします。
(VBをやってらっしゃったとのことなので、WebのC#の入門者向け情報でもいいと思います)
入門書一冊読めば、キャストの説明も載っていると思います。
引用返信 編集キー/
■39124 / inTopicNo.9)  Re[6]: if文で…
□投稿者/ へたれ (4回)-(2009/07/30(Thu) 14:47:04)
No39120 (よねKEN さん) に返信

一つ一つ丁寧に説明していただきありがとうございます。
おかげで解決の糸口が見えました。
まだエラーは出ますが頑張ってみたいと思います。

> 等号は「==」だと知らないということは、
> C#の文法を一切学習されていないように見受けられますので、
> C#の入門書一冊読まれることをお勧めします。
> 入門書一冊読めば、キャストの説明も載っていると思います。

はい、全くその通りで、C#の文法どころか
どの言語の文法も一切学習しておりません…。
入門書買ってきて読むことにします。
引用返信 編集キー/
■39130 / inTopicNo.10)  Re[7]: if文で…
□投稿者/ へたれ (5回)-(2009/07/30(Thu) 15:22:11)
すみません…
頑張ってみますとは言ったものの、やはり分からなかったので
質問させてください…。

if ((int)myRead2.GetValue(0) == 0)
lblStat.Text = "正常終了";
else
lblStat.Text = "異常終了";

このようにコードを書いてみたら「指定されたキャストは有効ではありません」
というエラーが出てしまいました。
どうやったら解決できるでしょうか…

引用返信 編集キー/
■39131 / inTopicNo.11)  Re[8]: if文で…
□投稿者/ Hongliang (441回)-(2009/07/30(Thu) 15:29:31)
まず、SELECT で返ってくるデータの先頭列の DB 上の型を確認してください。
次に、
object value = myRead2.GetValue(0);
としてこの次の行にブレークポイントを張り、value にどんな型のどんな値が入っているか確認してください。
引用返信 編集キー/
■39132 / inTopicNo.12)  Re[8]: if文で…
□投稿者/ よねKEN (397回)-(2009/07/30(Thu) 15:32:17)
No39130 (へたれ さん) に返信
> if ((int)myRead2.GetValue(0) == 0)
:略
> このようにコードを書いてみたら「指定されたキャストは有効ではありません」
> というエラーが出てしまいました。

(3) GetValue(0) で取得できるのが int であるのが明らかなら、

と書いているように「GetValue(0)で得られる値の型がintであるなら、intでキャストすれば」
と言われているのですから、int以外が戻ってくるのに、(int)でキャストはできません。

> どうやったら解決できるでしょうか…

myRead2.GetValue(0)が返す値の型を調べましょう。

Object.GetType()メソッドでインスタンス自身の型を得ることができますので、

Debug.WriteLine(myRead2.GetValue(0).GetType());

とか書けば戻ってきている値の型は調べれると思います。

ただし、この方法はとりあえずの解決策を提示しているに過ぎません。
正確には、データベースの列の型(及びNull許可しているかどうか)と
.NETでの型との対応関係について理解・把握しておく必要があります。

引用返信 編集キー/
■39133 / inTopicNo.13)  Re[9]: if文で…
□投稿者/ くだん (21回)-(2009/07/30(Thu) 15:43:14)
No39132 (よねKEN さん) に返信
偉いなぁ。。。何度も何度も同じことを(;ー;
引用返信 編集キー/
■39192 / inTopicNo.14)  Re[9]: if文で…
□投稿者/ へたれ (6回)-(2009/07/31(Fri) 11:29:12)
2009/07/31(Fri) 11:30:17 編集(投稿者)

遅くなってしまい、申し訳ありません。
どうやらエラーが次々に出てくることにテンパってしまって
冷静に考えられなくなってたみたいで…
何度も同じことを説明させてしまって本当に申し訳ありませんでした。

Object o = 0

if (myRead2.GetValue(0) == o)
lblStat.Text = "正常終了";
else
lblStat.Text = "異常終了";

このようにコードを書き直したら無事に通りました…。

同じことを何度も何度も懇切丁寧に説明してくださったよねKEN様、
そして質問に答えてくださった皆様方、
本当にありがとうございました。

解決済み
引用返信 編集キー/
■39195 / inTopicNo.15)  Re[10]: if文で…
□投稿者/ よねKEN (398回)-(2009/07/31(Fri) 11:41:10)
No39192 (へたれ さん) に返信
> Object o = 0
>
> if (myRead2.GetValue(0) == o)
> lblStat.Text = "正常終了";
> else
> lblStat.Text = "異常終了";
>
> このようにコードを書き直したら無事に通りました…。

本当にうまく行っていますか?
私の予想では、そのコードは常に”異常終了”しかしないと思います。

仮に本当にうまく行っているとしたら、なぜうまく行くのか説明できますか?
説明できないなら、解決したとは言えません。

> 同じことを何度も何度も懇切丁寧に説明してくださったよねKEN様、

Debug.WriteLine(myRead2.GetValue(0).GetType());

これの結果はどうでしたか?
せっかく説明してもやってもらえないのであれば徒労ですね。

もしその場さえしのげたらOKとお考えなら
そういう考えは止めた方がトータルで苦労しなくて済みますよ。

引用返信 編集キー/
■39202 / inTopicNo.16)  Re[11]: if文で…
□投稿者/ すがり (65回)-(2009/07/31(Fri) 13:29:32)
ちょうどよさげなの見つけたので貼り付けておきます。

http://msdn.microsoft.com/ja-jp/library/53k8ybth(VS.80).aspx

[閑話休題]Javaで同じようなことをすると・・・(JDK1.6にて検証)
public class MainClass {
	public static void main(String[] args) {
		System.out.println( ( 2 + 2 ) == 4 );
		
		Object s = 1;
		Object t = 1;

		System.out.println( s == t );

		String a = "hello";
		String b = new String(a);
		String c = "hello";
		
		System.out.println( a == b );
		
		System.out.println( (Object)a == (Object)b );

		System.out.println( a.equals(b) ); // おまけ

		// String b = a; ならば上3つすべてtrueになります

		System.out.println( (Object)a == (Object)c );

		System.out.println( a == c ); // おまけ
		
		System.out.println( a.equals(c) ); // おまけ
	}
}

実行結果
true
true
false
false
true
true
true
true

C#のString.Copyに相当するものが見当たらないのでnew String(a)としています。
http://java.sun.com/javase/ja/6/docs/ja/api/java/lang/String.html#String(java.lang.String)

APIドキュメントを読むと近いことやっているんではないかと思うのですが・・・間違ってたらごめんなさい。

引用返信 編集キー/


トピック内ページ移動 / << 0 >>

このトピックに書きこむ

過去ログには書き込み不可

管理者用

- Child Tree -