J'ai un scénario où une chaîne en C # peut être null
. J'ai besoin qu'il soit NULL
sur SQLServer.
Je l'envoie à SQLServer en utilisant Dapper avec une requête comme:
connection.Query<MyObject>("[dbo].[sp_MyStoredProcedure]"), new
{
StartDate: startDate
}, commandType: CommandType.StoredProcedure);
Où startDate
est la chaîne qui peut parfois être égale à null
.
Le paramètre de la procédure stockée est
@StartDate varchar(10) = NULL
Quand il est NULL
il renvoie tous les enregistrements. J'ai confirmé que ce comportement fonctionne via SSMS.
J'ai lu cet article de Marc Gravell qui dit:
Le problème null vs DBNull est une cause constante de confusion; cependant, généralement, si les gens disent
null
dans C #, ils entendentnull
dans SQL. C'est l'approche adoptée par Dapper.
Cela m'amène à croire que lorsque la string
est définie sur null
, elle doit envoyer DBNull.Value
à SQLServer.
Cependant, cela ne semble pas être le cas. Je récupère 0 enregistrements de SQLServer lors de l'envoi d'une chaîne null
. Cela semble indiquer l'envoi d'une chaîne vide plutôt qu'une valeur DBNull.Value
.
En outre, je ne peux pas envoyer directement DBNull.Value
:
connection.Query<MyObject>("[dbo].[sp_MyStoredProcedure]"), new
{
StartDate: DBNull.Value
}, commandType: CommandType.StoredProcedure);
Cela produit une exception dans Dapper:
Le membre StartDate de type System.DBNull ne peut pas être utilisé comme valeur de paramètre
Comment puis-je envoyer NULL
à SQLServer, en utilisant Dapper, quand j'ai une string
en C # qui peut être null
?
Dapper envoie en effet NULL
lorsqu'une chaîne est null
. Cette hypothèse était une erreur de ma part basée sur des informations erronées. Néanmoins, cette question peut aider quelqu'un d'autre qui fait une hypothèse tout aussi erronée.
De plus, la réponse acceptée fournit un bon mécanisme pour traiter les paramètres facultatifs ou conditionnels.
Vous pouvez choisir de ne pas envoyer StartDate.
Exemple:
dynamic parameters = new {
};
if (!string.IsNullOrWhiteSpace(startDate))
{
parameters.StartDate = startDate;
}
connection.Query<MyObject>("[dbo].[sp_MyStoredProcedure]"), parameters, commandType: CommandType.StoredProcedure);
Modifier:
En outre, votre procédure stockée doit accepter les valeurs NULL. Voici un exemple:
CREATE PROCEDURE [ExampleProc]
@StartDate datetime = null
AS
Select @StartDate
Oui, dapper sait remplacer reference- null
par DBNull.Value
chaque fois qu'il le voit. Parce que DBNull
est mon ennemi juré, et si je ne le revois jamais dans mon code d’application (le code de la bibliothèque est différent), je mourrai un peu plus heureux.
Voir aussi: https://stackoverflow.com/a/9632050/23354