R.Tanaka.Ichiro's Blog

主にC# な話題です

目次

Blog 利用状況

ニュース

比較演算子と代入演算子

漢字で書くと何やらゴツい感じですが、要するに、= と ==? のことです。

え?、良くわかりませんか?

if (i == 5) {
  int j = 2;
}

上には、= が出てきますが、== は比較で、 = は代入なのですよね。

C系の言語って、こういうところが洗練されていて好きなんですよね。

If (i = 5) Then
  Dim i As Integer = 2;
End if

VBだと、こんな感じになるんでしたっけ?(←なんだ、このとぼけっぷりは)

で、何が言いたいかと言うと、先ほど C# でTableAdapter なクラスを作っていて、気がつくと以下のようなものがあったのですよ。


private MySqlCommand CreateDeleteCommand() {
  MySqlCommand r = new MySqlCommand();
  r.Connection = this.Connection;
  r.CommandText = (
    @"DELETE FROM `ItemMaster` WHERE (" +
    @"(`Code` = ?) AND " +
    @"((? = 1 AND `Name` IS NULL) OR (`Name`?= ?)) AND " +
    @"((??= 1 AND `Unit` IS NULL) OR (`Unit`?= ?)))"
  );
  r.CommandType = CommandType.Text;

  MySqlDbType    t = MySqlDbType.VarChar;
  DataRowVersion  v = DataRowVersion.Original;
  r.Parameters.Add(this.CreateParameter("Original_Code",  t, "Code",  v, false));
  r.Parameters.Add(this.CreateParameter("IsNull_Name",   t, "Name",  v, true));
  r.Parameters.Add(this.CreateParameter("Original_Name",  t, "Name",  v, false));
  r.Parameters.Add(this.CreateParameter("IsNull_Unit",    t, "Unit",   v, true));
  r.Parameters.Add(this.CreateParameter("Original_Unit",   t, "Unit",   v, false));

  return r;
}

へぇ~、MySQL使ってるんだ~、と思った人は過去ログを読んでいない人。


やっぱり、== な表現になれちゃうと気持ち悪いですね。

って、そんな話題でした。(特に意味の無い話でした)

投稿日時 : 2006年12月21日 16:00

Feedback

# re: 比較演算子と代入演算子 2006/12/21 16:12 R・田中一郎

ところで、以下のパラメーター部分の細工の意味ですが、何やっているのか誰かに詳しく教えて欲しいのです。

>    "((? = 1 AND `Unit` IS NULL) OR (`Unit` = ?)))"

以前、どこかで読んで深く納得したのですが、今はすっかり忘れているのです。

何か、華麗なことしているのは記憶にあるんですが。

# re: 比較演算子と代入演算子 2006/12/21 16:13 中博俊

プログラムにSQLカコワルイ
?カコワルイ
イクナイ(-へー)

# re: 比較演算子と代入演算子 2006/12/21 16:17 シャノン

> プログラムにSQLカコワルイ

カコワルイ。デモヤラザルヲエナイorz
ウチノシステムも中サンニセッケイシテホシイ。

# re: 比較演算子と代入演算子 2006/12/21 16:19 じゃんぬ

> If (i = 5) Then
>   Dim i As Integer = 2;
> End if
>
> VBだと、こんな感じになるんでしたっけ?(←なんだ、このとぼけっぷりは)

なりません。(プ

# re: 比較演算子と代入演算子 2006/12/21 16:22 中博俊

ちなみに
if(i==5)int j =2;
だとリリースビルドでは消滅する罠

# re: 比較演算子と代入演算子 2006/12/21 16:35 επιστημη

DBスキル25.7[わんくまー]なεπιには、コード中にSQL文字列が現れるのって
腹ん中で別のイキモノが蠢いてるみたいでなんかきしょいっす。

# re: 比較演算子と代入演算子 2006/12/21 16:43 とっちゃん

コードでしかSQLを書けないシステムな人が来ましたよー
#設計とかそんな高尚なネタじゃねーんだよ!

ま、おいらの場合、SQL でアクセスするといっても、MSI なんだけどねwww

読むためだけに、SQL勉強しました。でも、記載があるページがわずか2ページしかなくて、ろくに使いこなせてません。
MSI-SQLの仕様公開してくれー>MSw

# re: 比較演算子と代入演算子 2006/12/21 16:49 επιστημη

ちなみにPASCALだと = が比較で := が代入っす。

# re: 比較演算子と代入演算子 2006/12/21 16:49 ぽぴ王子

> コード中にSQL文字列が現れるの

それ、なんてLINQ?

# re: 比較演算子と代入演算子 2006/12/22 10:59 trapemiya

あれ? 書き込めない。 テスト、テスト、あーあーあー。

# re: 比較演算子と代入演算子 2006/12/22 11:03 trapemiya

>    "((? = 1 AND `Unit` IS NULL) OR (`Unit` = ?)))"

同時実行制御です。
まず、ORの前半部分について。ここの?には、UnitがNULLかどうかが入ります。UnitがNULLの場合、1になります。その時、現在のUnitもNULLなら('Unit' IS NULL)なら、自分がレコードを読んでから誰もこのレコードを変更していないということになり、削除しても良いということになります。
次にORの後半部分です。
ここの?には自分がレコードを読んだ時のUnitの値が入ります。つまり、'Unit' = ?が成り立つということは、自分がレコードを読んでから誰もこのレコードを変更していないということになり、削除しても良いということになります。

# re: 比較演算子と代入演算子 2006/12/22 11:09 trapemiya

もうちょっと、続きがあるんですが、どうしても書き込めないので(コメントスパム対策?)、あきらめます。でも、上の説明でわかりますよね。

# re: 比較演算子と代入演算子 2006/12/22 14:04 R・田中一郎

中博俊 さん

>プログラムにSQLカコワルイ
>?カコワルイ
>イクナイ(-へー)

今回 TableAdapter を自作するのは初めてなので、DataSet をテンプレートから自動生成したものを元に TableAdapter を自作していたものなのです。
サンプルは、これを流用したものでした。

この辺りは、これから自分のスタイルに修正を加えるつもりなのですが、SQL に関しては、どこか別のところ(const でメンバとして登録するとか、リソースファイルにまとめるとか)に置いた方がいんですかね?

・・・と言うか、そうするつもりではいたのですが。

-------------------------------------------------
シャノン さん

>カコワルイ。デモヤラザルヲエナイorz

確かに。
SQLがコードに混ざるのは、読みにくいですしメンテもしにくいですよね。

-------------------------------------------------
じゃんぬ さん

>> If (i = 5) Then
>>   Dim i As Integer = 2;
>> End if
>>
>> VBだと、こんな感じになるんでしたっけ?(←なんだ、このとぼけっぷりは)
>
>なりません。(プ

あれ?

Dim i as Integer = 2.

でしたっけ?

-------------------------------------------------
επιστημη さん

>DBスキル25.7[わんくまー]なεπιには、コード中にSQL文字列が現れるのって

新しい、わんくまのスキルって、10わんくまーって表すんですね。

>腹ん中で別のイキモノが蠢いてるみたいでなんかきしょいっす。

う~ん、やっぱり外に出した方がいいのかな~

>ちなみにPASCALだと = が比較で := が代入っす。

そうでしたね。(すっかり忘れてました)
やっぱり別の表記の方が、すっきりします。

-------------------------------------------------
とっちゃん

>#設計とかそんな高尚なネタじゃねーんだよ!

キレてますか?

>ま、おいらの場合、SQL でアクセスするといっても、MSI なんだけどねwww

納得です。
使いこなすのも大変そうですね・・・

-------------------------------------------------
ぽぴ王子 さん

>それ、なんてLINQ?

LINQの話だったのか・・・orz

-------------------------------------------------
trapemiya さん

>あれ? 書き込めない。 テスト、テスト、あーあーあー。

僕も最初書き込めなくて、やばそうなところを削ったら書き込めました。

>同時実行制御です。

そうでした。そうでした。ありがとうございます。

確かどこかで解説を見たと思ったのですが、見つからなくて・・・・

>ます。でも、上の説明でわかりますよね。

丁寧に説明していただいてありがとうございました。
何やっているのかはソースコードを読んでわかったのですが、何故こんなことしているのかは今一つ理解できていませんでした^^;
今回、よくわかりました。

#コメントに残しておこう・・・

# re: 比較演算子と代入演算子 2006/12/22 15:41 R・田中一郎

コメントじゃなくて、今日のネタにしてしまいました。

# 変更されていない時だけ実行 2006/12/22 15:41 R.Tanaka.Ichiro's Blog

変更されていない時だけ実行

# re: 比較演算子と代入演算子 2006/12/23 9:26 ひろえむ

確かにたまにストアド使うなってプロジェクトありますね(^^;
そういう場面では私はSQLを1関数にしちゃいます(^^;
コードにSQLを混ぜると読みにくくてしょーがないので
private string GetWankumaSQL() {
return "select id from wankuma where id = @id";
}
なんて感じで・・・・。
こうするとSQLのデバッグはSQLに集中できるし、コードのデバッグはコードに集中できます(^^;

# re: 比較演算子と代入演算子 2006/12/25 15:57 R・田中一郎

>確かにたまにストアド使うなってプロジェクトありますね(^^;

ストアドにしましょうという話だったことに、今気づきました^^;

>そういう場面では私はSQLを1関数にしちゃいます(^^;

なるほど、これはすっきり書けて良いですね。

# 私が間違っておりました 2006/12/28 11:21 R.Tanaka.Ichiro's Blog

私が間違っておりました

# 2006年12月度ページビュー 2007/01/04 1:29 R.Tanaka.Ichiro's Blog

2006年12月度ページビュー

タイトル
名前
Url
コメント