0
votes

Le nom de la variable '@personnel_number' a déjà été déclaré. Les noms de variables doivent être uniques dans un lot de requête ou une procédure stockée

J'essaie de montrer le nom de l'employé sur la base de personnal_no, mais tout en faisant, j'ai eu une erreur

Le nom de la variable '@personnel_number' a déjà été déclaré. Les noms de variables doivent être uniques dans un lot de requête ou une procédure stockée p> blockQuote>

My Code: P>

protected void txtEmployeeNumber_TextChanged(object sender, EventArgs e)
{
    string EmployeeNo = "";
    string constring = ConfigurationManager.ConnectionStrings["SQLDBConnection"].ConnectionString;

    SqlConnection con = new SqlConnection(constring);
    SqlCommand cmd = new SqlCommand("select Employee_Name from [138.201.225.134].[iProfile].[dbo].[tbl_Employee] WHERE Personnel_Number= @Personnel_Number", con);
    cmd.CommandType = CommandType.Text;

    foreach (GridViewRow row in grdRegister.Rows)
    {
        if (row.RowType == DataControlRowType.DataRow)
        {
            EmployeeNo = (row.Cells[1].FindControl("txtEmployeeNumber") as TextBox).Text;
        }
        cmd.Parameters.AddWithValue("@Personnel_Number", EmployeeNo);

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

        SqlDataAdapter da = new SqlDataAdapter(cmd);
        DataTable dt = new DataTable();
        da.Fill(dt);

        if (dt.Rows.Count > 0)
        {
            (row.Cells[2].FindControl("txtEmployeeName1") as TextBox).Text = dt.Rows[0]["Employee_Name"].ToString();
        }
    }
}


7 commentaires

Il y a une boucle qui ajoutez @personnel_number plusieurs fois .... Comme l'erreur dit ... Déplacez-le tout dans la boucle.


Oui, tandis que la boucle exécute la deuxième erreur d'erreur, mais comment puis-je le réparer? même je ne peux pas placer exécutenonkury () en dehors de la boucle


Place sqlcommand cmd = ... dans la boucle


Duplicaté possible de Le nom de la variable '@param' a déjà été déclaré


cmd.parameters.clear () au début de votre boucle


@ bradbury9 vous voulez dire après cmd.commandtype = CommandType.text;


@Nitspatel Vérifiez ma réponse, non seulement je le montre, mais également donner conseil à cette fonction.


6 Réponses :


2
votes

Vous pouvez utiliser la méthode effacer code> à la fin de chaque itération. TRY.LIQue:

foreach (GridViewRow row in grdRegister.Rows)
{
  SqlCommand cmd = new SqlCommand("select Employee_Name from [138.201.225.134].[iProfile].[dbo].[tbl_Employee] WHERE Personnel_Number= @Personnel_Number", con);
  cmd.CommandType = CommandType.Text;
  ....


1 commentaires

J'essaie déjà ce cmd.parameters.clear (); Mais toujours sa montrée



2
votes

Instancez la commande à l'intérieur de la boucle:

    protected void txtEmployeeNumber_TextChanged(object sender, EventArgs e)
    {
        string EmployeeNo = "";
        string constring = ConfigurationManager.ConnectionStrings["SQLDBConnection"].ConnectionString;
        SqlConnection con = new SqlConnection(constring);

        foreach (GridViewRow row in grdRegister.Rows)
        {
            if (row.RowType == DataControlRowType.DataRow)
            {
                EmployeeNo = (row.Cells[1].FindControl("txtEmployeeNumber") as TextBox).Text;
            }

            SqlCommand cmd = new SqlCommand("select Employee_Name from [138.201.225.134].[iProfile].[dbo].[tbl_Employee] WHERE Personnel_Number= @Personnel_Number", con);
            cmd.CommandType = CommandType.Text;
            cmd.Parameters.AddWithValue("@Personnel_Number", EmployeeNo);
            con.Open();
            cmd.ExecuteNonQuery();
            con.Close();
            SqlDataAdapter da = new SqlDataAdapter(cmd);
            DataTable dt = new DataTable();
            da.Fill(dt);
            if (dt.Rows.Count > 0)
            {
                (row.Cells[2].FindControl("txtEmployeeName1") as TextBox).Text = dt.Rows[0]["Employee_Name"].ToString();
            }
        }
    }


2 commentaires

Cette solution crée un objet SQLCOMMAND pour chaque ligne pouvant affecter négativement la performance.


@Nitspatel J'ai ajouté une description de ce que vous faisiez mal à ma réponse, espérons que cela vous aide à comprendre le problème.



2
votes

Ajoutez le paramètre Avant d'entrer dans la boucle, puis modifiez la valeur lorsque vous en boucle à travers chaque ligne:

cmd.Parameters.Add(new SqlParameter("@Personnel_Number", SqlDbType.VarChar));

foreach (GridViewRow row in grdRegister.Rows)
{
     //get EmployeeNo code

     cmd.Parameters["@Personnel_Number"].Value = EmployeeNo;    

     //rest of your code
}


2 commentaires

J'aime comment vous ajoutez le sqlparameter , mais je me demande comment vous saviez que c'était une chaîne ...


@ Bradbury9 Je ne sais pas cela, mais je penserais que le développement serait capable de connaître leurs types de données et d'assigner en conséquence!



-2
votes

Vous faites de mauvaises choses mal.

- Mise à jour: J'étais tort aussi! Merci à @polyfun pour effacer cela pour moi. P>

1) Vous ne devez pas mettre à jour à l'intérieur de l'événement de texte de la zone de texte. H3>

Déplacez votre code sur un bouton. Exécutez la requête SQL chaque fois que vous entrez un personnage n'est pas si bon. P>

2) Vous recherchez un contrôle dans une boucle. H3> xxx pré>

trouver Il est une fois en dehors de la boucle - il accélérera tout le processus. P>

concernant votre question, vous analyse manuellement la réponse de la base de données. Pourquoi? H3>

Essayez d'utiliser DAPPER ! Il peut construire automatiquement des objets C # natifs de la réponse de la base de données!
Il prend en charge les variables et offre une protection contre injections SQL si vous êtes .
Voici un Documentation pour cela. Vous pouvez également utiliser Extensions DAPPER pour une meilleure expérience. P>

réponses au-dessus de moi sont un peu correctes, mais utilisez Dapper, vous n'avez pas à contrôler où vous ajoutez des paramètres et où vous les supprimez. p>

Voici un exemple de DAPPER: P>

var result = connection.Query<SomeClass>("select * from SomeTable where UserId = @userId", new { userId });


5 commentaires

Faisons une solution de contournement à la place faisant OP réaliser la mauvaise logique afin qu'il / elle puisse apprendre ...


1 est un mauvais conseil - pour la mise à l'échelle, vous devez minimiser la portée des SQLConnections et sur la mise en commun de la connexion par défaut, conformément aux recommandations de Microsoft: docs.microsoft.com/en-us/dotnet/api/... .


@Polyfun oh. Je ne savais pas ça! Merci d'avoir refusé cela pour moi.


Mis à jour mon message


@ Bradbury9 Je suppose que vous avez raison, mais op pouvez éviter des problèmes comme ceux-ci à l'aide d'une bibliothèque. Pourquoi réinventer la roue?



2
votes

Si vous avez le ajoutez () ou addwithvalue () à l'intérieur de la boucle mais le sqlcommand est en dehors de celui-ci, sur la deuxième itération J'essaierais d'ajouter un autre paramètre avec le même nom de paramètre.

Notez que je choisirais le premier plutôt que le plus tard, et vous doit prendre en compte cesser d'utiliser AddWithValue

Vous devez soit: < Pré> xxx

ou xxx


0 commentaires

0
votes

Comme mentionné par @APomene, vous pouvez résoudre votre problème en ajoutant une ligne unique suivante au début de chaque itération comme exemple d'échantillon xxx pré>

mais imho vous n'avez pas besoin de faire ce qui suit ** P>

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


0 commentaires