Comment puis-je envoyer une chaîne comme NULL à SQLServer à l'aide de Dapper?

c# dapper sql-server

Question

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);

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 entendent null 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

Question

Comment puis-je envoyer NULL à SQLServer, en utilisant Dapper, quand j'ai une string en C # qui peut être null ?


Important

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.

Réponse acceptée

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

Réponse d'expert

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




Sous licence: CC-BY-SA with attribution
Non affilié à Stack Overflow
Est-ce KB légal? Oui, apprenez pourquoi
Sous licence: CC-BY-SA with attribution
Non affilié à Stack Overflow
Est-ce KB légal? Oui, apprenez pourquoi