2008-09-30 10 views
3

Je suis un novice quand il s'agit de SQL. Lors de la création d'une procédure stockée avec des paramètres tels que:Procédure stockée Valeur par défaut

@executed   bit, 
@failure   bit, 
@success   bit, 
@testID    int, 
    @time    float = 0, 
@name    varchar(200) = '', 
@description  varchar(200) = '', 
@executionDateTime nvarchar(max) = '', 
@message   nvarchar(max) = '' 

Ceci est la forme correcte pour les valeurs par défaut dans T-SQL? J'ai essayé d'utiliser NULL au lieu de ''.

Lorsque j'ai tenté d'exécuter cette procédure via C#, j'obtiens une erreur indiquant que la description est attendue mais non fournie. En l'appelant comme ceci:

 cmd.Parameters["@description"].Value = result.Description; 

résultat.Description est null. Cela ne devrait-il pas par défaut être NULL (bien dans mon cas en ce moment) en SQL?

est ici la commande d'appel:

 cmd.CommandText = "EXEC [dbo].insert_test_result @executed, 
          @failure, @success, @testID, @time, @name, 
          @description, @executionDateTime, @message;"; 

     ... 
     cmd.Parameters.Add("@description", SqlDbType.VarChar); 
     cmd.Parameters.Add("@executionDateTime", SqlDbType.VarChar); 
     cmd.Parameters.Add("@message", SqlDbType.VarChar); 

     cmd.Parameters["@name"].Value = result.Name; 
     cmd.Parameters["@description"].Value = result.Description; 
     ... 

     try 
     { 
      connection.Open(); 
      cmd.ExecuteNonQuery(); 
     } 
     ... 
     finally 
     { 
      connection.Close(); 
     } 

Répondre

11

Une meilleure approche serait de changer le CommandText juste le nom de la SP et le CommandType StoredProcedure - alors les paramètres fonctionneront beaucoup plus proprement:

cmd.CommandText = "insert_test_result"; 
cmd.CommandType = CommandType.StoredProcedure; 

Cela permet également un passage plus simple par nom plutôt que par position.

En général, ADO.NET veut DBNull.Value, pas null. Je viens d'utiliser une méthode pratique qui passe en boucle sur mes args et remplace toutes les valeurs NULL avec des DBNull.Value - aussi simple que (emballé):

foreach (IDataParameter param in command.Parameters) 
    { 
     if (param.Value == null) param.Value = DBNull.Value; 
    } 

Cependant! La spécification d'une valeur avec null est différente de la laisser supposer la valeur par défaut. Si vous voulez utiliser la valeur par défaut, n'incluez pas le paramètre dans la commande.

0

Si vous n'utilisez pas de paramètres nommés, MSSQL prend les paramètres dans l'ordre reçu (par index). Je pense qu'il y a une option pour cela sur l'objet cmd.

afin que votre SQL devrait être plus comme

EXEC [dbo].insert_test_result 
@executed = @executed, 
@failure = @failure, 
@success = @success, 
@testID = @testID, 
@time = @time, 
@name = @name, 
@description = @description, 
@executionDateTime = @executionDateTime, 
@message = @message; 
+0

plus facile de définir CommandType à SPROC et CommandText "insert_test_result", cependant. –

0

cmd.CommandText = "insert_test_result"; 
cmd.Parameters.Add(new SQLParameter("@description", result.Description)); 
cmd.Parameters.Add(new SQLParameter("@message", result.Message)); 
try 
{ 
    connection.Open(); 
    cmd.ExecuteNonQuery(); 
} 
finally 
{ 
    connection.Close(); 
}