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(); } } }
6 Réponses :
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;
....
J'essaie déjà ce cmd.parameters.clear (); Mais toujours sa montrée
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(); } } }
Cette solution crée un objet SQLCOMMAND code> 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.
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 }
J'aime comment vous ajoutez le sqlparameter code>, 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!
Vous faites de mauvaises choses mal.
- Mise à jour: J'étais tort aussi! Merci à @polyfun pour effacer cela pour moi. P>
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>
trouver Il est une fois en dehors de la boucle - il accélérera tout le processus. P>
Essayez d'utiliser DAPPER ! Il peut construire automatiquement des objets C # natifs de la réponse de la base de données! 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>
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> var result = connection.Query<SomeClass>("select * from SomeTable where UserId = @userId", new { userId });
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?
Si vous avez le Notez que je choisirais le premier plutôt que le plus tard, et vous doit prendre en compte cesser d'utiliser AddWithValue P> Vous devez soit: P> < Pré> xxx pré> ou p> ajoutez () code> ou
addwithvalue () code> à l'intérieur de la boucle mais le
sqlcommand code> 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.
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 mais imho vous n'avez pas besoin de faire ce qui suit ** P> con.Open();
cmd.ExecuteNonQuery();
con.Close();
Il y a une boucle qui ajoutez
@personnel_number code> 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 = ... code> dans la boucle
Duplicaté possible de Le nom de la variable '@param' a déjà été déclaré a>
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.