J'essaie d'insérer le mot «null» (littéralement) dans un paramètre pour une procédure stockée. Pour une raison quelconque, SqlServer semble penser que je veux dire NULL et non "Null". Si je fais une vérification pourInsertion de «null» (littéralement) dans un paramètre de procédure stockée
IF @LastName IS NULL // Test: Do stuff
Ensuite, il contourne cela parce que le paramètre n'est pas nul.
Mais quand je fais:
INSERT INTO Person (<params>) VALUES (<stuff here>, @LastName, <more stuff here>); // LastName is 'Null'
bombes Il en disant que LastName n'accepte pas les valeurs NULL. Je détesterais sérieusement avoir ce nom de famille, mais quelqu'un le fait ... et il bombarde l'application. Nous utilisons SubSonic 2.0 (ouais, c'est assez vieux mais la mise à jour est douloureuse) comme notre DAL et en passant par là, je vois que ça crée les paramètres correctement (pour ce que je peux dire).
J'ai essayé de créer une table temporaire pour voir si je pouvais la répliquer manuellement, mais cela semble fonctionner correctement. Voici l'exemple que je crée:
DECLARE @myval VARCHAR(50)
SET @myval = 'Null'
CREATE TABLE #mytable(name VARCHAR(50))
INSERT INTO #mytable VALUES (@myval)
SELECT * FROM #mytable
DROP table #mytable
Toute réflexion sur la façon dont je peux résoudre ce problème?
edit: La méthode que le nom de famille est définie est this - myPerson.LastName = textBoxLastName.Text;
edit: Lors de l'utilisation de SqlServer Profiler, je vois qu'il envoie null. Deux choses bizarres, je me demande pourquoi mon "IF @lastName IS NULL" ne tire pas ... mais maintenant je dois regarder SubSonic plus loin pour voir si quelque chose change à la dernière minute dont je n'étais pas conscient. Je vais enquêter plus loin et faire un rapport.
edit: La seule contrainte est une valeur par défaut de ''.
edit: Ok, j'ai confirmé que c'est IS SubSonic essayant de jouer intelligemment. Bonne idée pour utiliser le Profiler, j'ai complètement oublié cela. Dernière modification: Il est intéressant de noter, à l'avenir, que SubSonic remplace cela à la dernière minute dans le fournisseur de données (dans mon cas SqlDataProvider). Dans le DataService.cs où il appelle Execute Scalar, les paramètres n'ont pas encore été ajustés. Ils sont ajustés quand il exécute ExecuteScalar pour le DataProvider, qui est une classe abstraite (donc Postgre et Oracle auront chacun leurs propres bits de code). Plus précisément, le SubSonic.SqlDataProvider.AddParams est ce qui m'a mordu.
Existe-t-il des contraintes sur cette colonne, qui interdisent l'insertion de la valeur littérale "Null"? – shahkalpesh
Encore une chose - Définissez-vous explicitement le paramètre avec la chaîne littérale Null avant de passer un appel à la procédure stockée? – shahkalpesh
Je suppose que SubSonic peut être raccourci et le changer en NULL (en fait NULL au lieu de 'Null'). Avez-vous vérifié le texte d'insertion réel avec SQL Profiler? –