web-dev-qa-db-ja.com

Int32.TryParse()または(int?)command.ExecuteScalar()

1つのフィールド(INT型のID)のみを返すSQLクエリがあります。

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

どちらの方法がより速く、より少ないメモリを使用しますか?

int id;
if(Int32.TryParse(command.ExecuteScalar().ToString(), out id))
{
  // use id
}

または

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

または

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

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

私は一緒に行きます:

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

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

また、単純なintキャストを使用します[〜#〜] if [〜#〜]コマンドが単一の結果を返すことを常に期待していました。

私は通常、スカラーの実行よりも出力パラメーターを返す方を好みます。スカラーの実行は壊れやすいと感じます(最初の行の最初の列が戻り値であるという慣習は私には適切ではありません)。

22
Sam Saffron

コマンドがnullを返すことを期待する場合は、データベースnull( DBNull )は.NETnullと同じではないことに注意してください。では、DBNullをintに変換しますか?失敗します。

私は次のことを提案します:

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

上記のいずれも機能しない場合(特にMySQLと戦っているユーザーの場合)、次のことを試してみませんか?

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

c#で動作します。

3
Sin

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

2
Joel Coehoorn

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

1
xyz