17

INT型のIDという1つのフィールドのみを返す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
}
4

7 に答える 7

23

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

私は一緒に行きます:

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

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

コマンドが単一の結果を返すことを常に期待していた場合は、単純なintキャストIFを使用することもできます。

私は通常、execute scalar を実行するよりも out パラメーターを返すことを好みます。execute scalar は壊れやすいと感じます (最初の行の最初の列が戻り値であるという規則は、私には適切ではありません)。

于 2009-07-23T22:57:58.983 に答える
19

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

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

object result = command.ExecuteScalar();
int? id = (int?)(!Convert.IsDBNull(result) ? result : null);
于 2009-07-23T23:29:02.853 に答える
5

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

int id = Convert.ToInt32(cmd.ExecuteScalar().ToString());
于 2012-07-15T14:11:21.560 に答える
3
int Result = int.Parse(Command.ExecuteScalar().ToString());

C#で動作します。

于 2012-09-04T16:44:43.713 に答える
2

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

于 2009-07-23T22:52:03.507 に答える
1

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

于 2009-07-23T22:59:50.587 に答える