SQLServerデータベースにVARCHAR列を設定するためのINSERTステートメントで使用されるパラメーターを設定するための次のコードがあります。私の値オブジェクト(iloという名前)には、String.Emptyに初期化されてから、XMLから読み取られた値に設定される、またはそのXML要素が空の場合はString.EmptyのままになるDescriptionというプロパティがあります。
したがって、データベースに挿入するときに、プロパティがまだString.Emptyに設定されている場合は、null値を挿入してもらいたいと思います。
database.AddInParameter(cmd, "@description", DbType.String,
(ilo.Description.Equals(string.Empty)) ?
DBNull.Value :
ilo.Description);
つまり、基本的に、ilo.Descriptionがstring.emptyと等しい場合は、パラメーターをDBNull.Valueに設定し、そうでない場合はilo.Descriptionに設定します。
これにより、VisualStudioで次のエラーが発生します...
エラー141「System.DBNull」と「string」の間に暗黙の変換がないため、条件式のタイプを判別できません
なんで?
不思議なのは、エラーなしで次のことができるということです。これは、上記のようなインライン条件構文を使用するのとまったく同じであるはずです!?!
if(ilo.Description.Equals(string.Empty))
{
database.AddInParameter(cmd, "@description", DbType.String, DBNull.Value);
}
else
{
database.AddInParameter(cmd, "@description", DbType.String, ilo.Description);
}
他の投稿を検索して、以下の投稿を見つけましたが、それは私の質問に実際には答えていません。
明らかな回避策は、インライン(三項)構文の代わりにif / elseステートメントを使用することなので、なぜ私はもっと興味がありますか?
このリンクにはある種の答えがありますが、これは機能しないと私にはBSのように思われるので、より良い説明が必要です。私はそれをバグと呼ぶでしょう!
http://msdn.microsoft.com/en-us/library/ty67wk28.aspx
編集:2021年3月30日、私がこの質問を書いてから9年になります。最後に、C#9の時点で、この問題は修正されています。三項式は、暗黙的に変換できる限り、混合型をサポートするようになりました。