DbCommand.ExecuteScalarのMSDNドキュメントによると:
結果セットの最初の行の最初の列が見つからない場合は、null参照(Visual BasicではNothing)が返されます。データベースの値がnullの場合、クエリはDBNull.Valueを返します。
次のスニペットについて考えてみます。
using (var conn = new OracleConnection(...)) {
conn.Open();
var command = conn.CreateCommand();
command.CommandText = "select username from usermst where userid=2";
string getusername = (string)command.ExecuteScalar();
}
実行時(ODP.NETでテストされていますが、どのADO.NETプロバイダーでも同じである必要があります)、次のように動作します。
- 行が存在しない場合、
command.ExecuteScalar()
の結果 はnullであり、null文字列にキャストされ、getusername
に割り当てられます。 。 - 行が存在するが、ユーザー名にNULLが含まれている場合(これはDBでも可能ですか?)、
command.ExecuteScalar()
の結果DBNull.Value
です 、結果としてInvalidCastException
。
いずれにせよ、NullReferenceException
可能ではないはずなので、問題はおそらく他の場所にあります。