In my database, in one of the table I have a GUID column with allow nulls. I have a method with a Guid? parameter that inserts a new data row in the table. However when I say myNewRow.myGuidColumn = myGuid I get the following error: "Cannot implicitly convert type 'System.Guid?' to 'System.Guid'."
The ADO.NET API has some problems when it comes to handling nullable value types (i.e. it simply doesn't work correctly). We've had no end of issues with it, and so have arrived at the conclusion that it's best to manually set the value to null, e.g.
myNewRow.myGuidColumn = myGuid == null ? (object)DBNull.Value : myGuid.Value
It's painful extra work that ADO.NET should handle, but it doesn't seem to do so reliably (even in 3.5 SP1). This at least works correctly.
We've also seen issues with passing nullable value types to SqlParameters where the generated SQL includes the keyword
DEFAULT instead of
NULL for the value so I'd recommend the same approach when building parameters.
OK; how is myGuidColumn defined, and how is myGuid defined?
If myGuid is
Guid? and myGuidColumn is
Guid, then the error is correct: you will need to use
(Guid)myGuid to get the value (which will throw if it is null), or perhaps
myGuid.GetValueOrDefault() to return the zero guid if null.
If myGuid is
Guid and myGuidColumn is
Guid?, then it should work.
If myGuidColumn is
object, you probably need
DBNull.Value instead of the regular null.
Of course, if the column is truly nullable, you might simply want to ensure that it is
Guid? in the C# code ;-p