2010-08-02 4 views
1

donc je suis en train de connecter une base de données sql. J'ai une page asp.net et quand l'utilisateur sélectionne la liste déroulante pour l'état et sélectionne la valeur à Fermé, puis clique sur le bouton mettre à jour le ticket, j'en ai besoin pour mettre à jour la colonne Closed_date dans la table.C# if instruction avec dropdownlist.selectedvalue

ma table a la colonne Closed_Date type datetime. J'ai une procédure stockée qui met à jour cette colonne en fonction du numéro de ticket.

ici est où je vais avoir du mal:

 con = new SqlConnection(_strConStr); 
     cmd = new SqlCommand(); 
     cmd.Connection = con; 
     cmd.CommandType = CommandType.StoredProcedure; 
     cmd.CommandText = "iz_sp_updateticket"; 
     cmd.Parameters.Add(new SqlParameter("@Priority", SqlDbType.Int)).Value = ddlPriority.SelectedValue; 
     cmd.Parameters.Add(new SqlParameter("@Status", SqlDbType.VarChar, 50)).Value = ddlStatus.SelectedValue; 
     cmd.Parameters.Add(new SqlParameter("@Environment", SqlDbType.VarChar, 50)).Value = ddlEnv.SelectedValue; 
     cmd.Parameters.Add(new SqlParameter("@Info", SqlDbType.VarChar)).Value = txtMessage.Text; 
     cmd.Parameters.Add(new SqlParameter("@Ticket", SqlDbType.Int)).Value = txtTicket.Text; 
     if (ddlStatus.SelectedValue == "Closed") 
     { 
      cmd.Parameters.Add(new SqlParameter("@Status", SqlDbType.VarChar, 50)).Value = ddlStatus.SelectedValue; 
      cmd.Parameters.Add(new SqlParameter("@Closed_Date", SqlDbType.DateTime)).Value = System.DateTime.Now; 
     } 
     else 
     { 
      cmd.Parameters.Add(new SqlParameter("@Status", SqlDbType.VarChar, 50)).Value = ddlStatus.SelectedValue; 
      cmd.Parameters.Add(new SqlParameter("@Closed_Date", SqlDbType.DateTime)).Value = DBNull.Value; 
     } 

     con.Open(); 
     cmd.ExecuteNonQuery(); 

Voici ma procédure stockée:

CREATE procedure [dbo].[iz_sp_updateticket] 
    @Ticket int, 
    @Priority varchar(50), 
    @Status varchar(50), 
    @Environment varchar(50), 
    @Info varchar(max), 
    @Closed_date datetime 
as 
    UPDATE stotickets 
    SET 
     Priority = @Priority, 
     [Status] = @Status, 
     Environment = @Environment, 
     Info = @Info, 
     Closed_date = @Closed_date 
    WHERE Ticket = @Ticket 

erreur

Procedure or function iz_sp_updateticket has too many arguments specified. 
+0

Quel est précisément votre problème? Je devine peut-être que votre procédure stockée doit être mise à jour pour vérifier si @Closed_Date est null et ne pas le mettre à jour si c'est le cas? Ou? –

+0

je l'ai compris. j'ai enlevé la 1ère mise à jour de statut et cela fonctionne maintenant – IGor

Répondre

3

Deux choses possibles sans en savoir plus sur la question:

  1. Vous voulez utiliser System.DateTime.Now, pas System.DateTime.Now.ToString() car le paramètre est du DateTime type de données.
  2. Vous ne pouvez pas passer directement null à un serveur de base de données, si vous voulez null, vous devez utiliser DBNull.Value.

Le code ressemblerait à quelque chose comme ceci:

if (ddlStatus.SelectedValue == "Closed") 
{ 
cmd.Parameters.Add(new SqlParameter("@Status", SqlDbType.VarChar, 50)).Value = 
     ddlStatus.SelectedValue; 
cmd.Parameters.Add(new SqlParameter("@Closed_Date", SqlDbType.DateTime)).Value = 
     System.DateTime.Now; 
} 
else 
{ 
cmd.Parameters.Add(new SqlParameter("@Status", SqlDbType.VarChar, 50)).Value = 
     ddlStatus.SelectedValue; 
cmd.Parameters.Add(new SqlParameter("@Closed_Date", SqlDbType.DateTime)).Value = 
     DBNull.Value; 
} 
+0

cela n'a pas fonctionné pour moi. erreur: Procédure ou fonction iz_sp_updateticket a trop d'arguments spécifiés. – IGor

+0

NVM cela a fonctionné! Je viens de voir que j'ai deux mises à jour de statut – IGor

0

Quelle est l'erreur que vous êtes obtenir?

En passant, je vois un problème possible: vous voulez utiliser System.DateTime.Now, pas System.DateTime.Now.ToString().

+0

erreur: Procédure ou fonction iz_sp_updateticket a trop d'arguments spécifiés. – IGor

2

Bien que, probablement pas la racine de votre problème, je pense que vous allez trop loin dans l'ajout de vos valeurs de paramètres. Pourquoi ne pas simplement utiliser la méthode AddWithValue. SQL est assez intelligent pour comprendre le type de valeur que vous essayez de transmettre en fonction du type de la valeur définie dans la procédure. par exemple.

if (ddlStatus.SelectedValue == "Closed") 
    { 
     cmd.Parameters.AddWithValue("@Status",ddlStatus.SelectedValue); 
     cmd.Parameters.AddWithValue("@Closed_Date",System.DateTime.Now); 
    } 
    else 
    { 
     cmd.Parameters.Add("@Status",ddlStatus.SelectedValue); 
     cmd.Parameters.Add("@Closed_Date", null); 
    } 

Sur une note de côté, vous pouvez éviter d'ajouter la @Closed_Date, null dans votre commande C#, en mettant simplement votre procédure stockée pour définir la valeur null au sein de la procédure elle-même. Ensuite, cela devient facultatif. par exemple.

CREATE PROCEDURE myProcedure 
    @Status VARCHAR(255), 
    @Closed_Date DATETIME = null 
AS 
BEGIN 
    -- Do something 
END