Warum kann ich DBNull.Value nicht in ein nullfähiges Bildfeld in SQL Server 2005 einfügen?
-
13-11-2019 - |
Frage
Warum kann ich nicht einfügen? DBNull.Value
in eine Nullable image
-Feld in SQL Server 2005?
Ich habe diesen Code ausprobiert:
SqlConnection conn = new SqlConnection(@"Data Source=.\sqlexpress;Initial Catalog=PrescriptionTrackingSystem;Integrated Security=True");
conn.Open();
SqlTransaction transaction = conn.BeginTransaction();
SqlCommand command = new SqlCommand(@"INSERT INTO Customer(
ID
,Name
,TelephoneNumber
,DateOfBirth,
InsuranceProvider,
PolicyNumber,Photo)
VALUES(
@ID
,@Name
,@TelephoneNumber
,@DateOfBirth,
@InsuranceProvider,
@PolicyNumber,
@Photo)", conn);
command.Transaction = transaction;
command.Parameters.AddWithValue("@ID", 1000);
command.Parameters.AddWithValue("@Name", item.Name);
command.Parameters.AddWithValue("@TelephoneNumber", item.TelephoneNumber);
if (item.DateOfBirth != null)
{
command.Parameters.AddWithValue("@DateOfBirth", item.DateOfBirth);
}
else
{
command.Parameters.AddWithValue("@DateOfBirth", DBNull.Value);
}
command.Parameters.AddWithValue("@InsuranceProvider", item.InsuranceProvider);
command.Parameters.AddWithValue("@PolicyNumber", item.PolicyNumber);
if (item.Photo != null)
{
command.Parameters.AddWithValue("@Photo", item.Photo);
}
else
{
command.Parameters.AddWithValue("@Photo", DBNull.Value);
}
int count = command.ExecuteNonQuery();
transaction.Commit();
conn.Close();
Artikel ist vom Typ Customer
.
public class Customer
{
public string Name { get; set; }
public DateTime? DateOfBirth { get; set; }
public string TelephoneNumber { get; set; }
public string InsuranceProvider { get; set; }
public int? PolicyNumber { get; set; }
public byte [] Photo { get; set; }
}
Beim Einfügen erhalte ich diese Ausnahme:
Operand type clash: nvarchar is incompatible with image
Warum DBNull.Value
hat nur Probleme mit image
?Warum nicht mit datetime
?
Lösung
Sie könnten Folgendes versuchen:
command.Parameters.Add("@Photo", SqlDbType.Image).Value = DBNull.Value;
Andere Tipps
Ich denke, das könnte damit zu tun haben, dass Sie SqlParameter.SqlDbType nicht explizit definieren und denken, dass NVARCHAR angenommen wird.Anstatt AddWithValue zu verwenden, versuchen Sie, einen neuen SqlParameter hinzuzufügen und SqlDbType explizit auf SqlDbType.Image festzulegen.
Hier ist die MSDN-Ref was besagt, dass der Standardwert NVARCHAR ist.
Sie müssen den Typ des Parameters explizit als SqlDbType.Image angeben
Ich habe das so gelöst:
If (Photo.Equals(DBNull.Value)) Then
cmd.Parameters.Add("Photo", SqlDbType.Image).Value = DBNull.Value
Else
cmd.Parameters.AddWithValue("Photo", Photo)
End If