2009-07-23 13 views
17

INT型のIDのフィールドを1つ返すSQLクエリがあります。Int32.TryParse()または(int?)command.ExecuteScalar()

そしてC#コードで整数として使用する必要があります。

どの方法が高速で、メモリを少なくしますか?

又は

int? id = (int?)command.ExecuteScalar(); 
if(id.HasValue) 
{ 
    // use id.Value 
} 

又は

int? id = command.ExecuteScalar() as int?; 
if(id.HasValue) 
{ 
    // use id.Value 
} 
+1

私はこれが古いですけど、関連ドナルドクヌース引用:「プログラマについて考える、またはそのプログラムの重要度の低い部分の速さ、気にせ膨大な時間を無駄に、そして効率でこれらの試みは、実際には強力なを持っていますデバッグとメンテナンスを考慮した場合のマイナスの影響。時間の約97%という小規模な効率性を忘れてはならない。早すぎる最適化はすべての悪の根源だが、その3%で機会を逃してはいけない。 –

+0

ちょっと@DannyNeumann、一般的に、私は2009年からの質問以来、ここにそれを投稿することは意味がないと思います。特に、効率的なコードを書くことは依然として重要です。そして、これが私がそうすることを学んだ方法です。私は毎日、クヌスの言葉にぴったりの恐ろしい、恐ろしいコードを見ています。つまり、非クリティカルな部品の時期尚早の最適化に多くの時間を費やすべきではないが、同時に非クリティカルな部品を非効率的に書くべきではない。 – abatishchev

答えて

22

3つのパフォーマンスの差はごくわずかです。ボトルネックは、DBからアプリケーションにデータを移動することであり、簡単なキャストやメソッド呼び出しではありません。

私は行くだろう:

int? id = (int?)command.ExecuteScalar(); 
if(id.HasValue) 
{ 
    // use id.Value 
} 

それ以前に失敗した1日の人々は、文字列または日付を返すようにコマンドを変更した場合、少なくともそれがクラッシュすると、あなたは修正するチャンスがありますそれ。

私はちょうど一緒に行くだけですintキャストIF私はいつもコマンドが単一の結果を返すことを期待していました。

私は通常、実行スカラーを実行するよりも、実行中のスカラーを実行するよりもスカラーが壊れやすいと感じています(最初の行の最初の列が戻り値であるという規則は、

+0

ExecuteScalar()は、VBntで大きな勝利を収めています。ここでは、CInt()またはCStr()を実行できます。 –

2

後者。 Convert.ToInt32()もオプションです。

+1

最初の方法は、多くの理由でサタンからです。遅くて読みにくいです。ヤック –

+0

Convert.ToInt32()は私のために働いたのに対し、キャストはcommand.ExecuteScalar(); – JYelton

1

最大Nullable Typeクールファクタにid.HasValueを使用してください!

19

nullを返すコマンドが必要な場合は、データベースのNULL(DBNull)が.NETのnullと同じではないことに注意してください。だから、DBNullからintへの変換?失敗するでしょう。

私は次のことをお勧めしたい:

object result = command.ExecuteScalar(); 
int? id = (int?)(!Convert.IsDBNull(result) ? result : null); 
+2

スカラーが行を返さない場合は、nullが返されることに注意してください。最初の列の最初の行がnullの場合、問題が発生する可能性があります。 –

+1

しかし、もう一度IDとID(少なくともID /キーとして読んでいます)ので、DBNullは問題ではありません –

+0

@Sam Saffronは空の行セットに同意しました。 @Rune FS、ここでは基本ロジックはわかりません。変数名のみに基づいてクエリがnullを返すかどうかを仮定しません。 – VladV

5

(特にMySQLので闘っているユーザーの場合)上記の作品のどれも は、なぜあなたは、次を試してみませんか?

int id = Convert.ToInt32(cmd.ExecuteScalar().ToString()); 
2
int Result = int.Parse(Command.ExecuteScalar().ToString()); 

C#で動作します。

+2

これは最初に文字列にダンプしてオブジェクトがすでにint型であるときに解析するという悪い方法です。ただキャストする必要があります。 – abatishchev

-2
if ((Int32)cmd.ExecuteScalar() ** 1) //en esta parece qu esta el error pero no lo veo 
{ 
    Response.Redirect("Default.aspx"); 
} 
else 
{ 
    Response.Redirect("error.htm") ; 
} 
+1

これは答えですか?それとも助けを得ようとしていますか?そのスペイン語のコメントは*「エラーがここにあるように見えるが、私はそれを見ることができない」* – brasofilo

関連する問題