Cómo mostrar entradas específicas de la base de datos en un cuadro de texto en una aplicación WinForm

ACTUALIZACIÓN: Gracias a todos, el código no fue el problema, aunque la información sobre la inyección de SQL fue útil, mi problema fue que estaba usando una versión anterior de mi base de datos que no tenía el ID de producto correspondiente, por lo que estaba usando el primer producto que pudo encontrar. Me siento muy estúpido ahora, pero gracias por las sugerencias.

Actualmente tengo el siguiente código:

SqlConnection connection = new SqlConnection(@"Data Source=(LocalDB)\v11.0 AttachDbFilename=C:\Users\h8005267\Desktop\Practical Project\Build\System4\System\StockControl.mdf;Integrated Security=True;Connect Timeout=30"); connection.Open(); SqlCommand cmd = new SqlCommand("SELECT * FROM Product WHERE ProductID='" + textBox3.Text + "'", connection); SqlDataReader re = cmd.ExecuteReader(); if (re.Read()) { textBox4.Text = re["ProductTitle"].ToString(); // only fills using first product in table textBox5.Text = re["ProductPublisherArtist"].ToString(); comboBox1.Text = re["ProductType"].ToString(); textBox6.Text = re["Price"].ToString(); } else { MessageBox.Show("Please enter a valid item barcode"); } re.Close(); connection.Close(); 

El problema que tengo actualmente es que aunque los cuadros de texto muestran la información al hacer clic en el botón, la información que se muestra es solo la primera fila de datos en la base de datos, NO la fila correspondiente al cuadro de texto3 en la statement de SQL.

Intenta esto en su lugar. Evite generar sentencias SQL dinámicamente de la forma en que lo está haciendo. Está abriendo su base de datos a riesgos de inyección SQL. Parámetros utilizados insead.

 using (var connection = new SqlConnection("connection string")) { connection.Open(); using (var cmd = new SqlCommand("SELECT * FROM Product WHERE ProductID=@MYVALUE", connection)) { cmd.Parameters.Add("@MYVALUE", SqlDbType.VarChar).Value = textBox3.Text; SqlDataReader re = cmd.ExecuteReader(); if (re.Read()) { textBox4.Text = re["ProductTitle"].ToString(); // only fills using first product in table textBox5.Text = re["ProductPublisherArtist"].ToString(); comboBox1.Text = re["ProductType"].ToString(); textBox6.Text = re["Price"].ToString(); } else { MessageBox.Show("Please enter a valid item barcode"); } } } 

poner un punto de interrupción en esa línea

 SqlDataReader re = cmd.ExecuteReader(); 

e ingrese lo siguiente en textBox3

 '; DROP TABLE Product; SELECT ' 

Los ‘se deben introducir en su cuadro de texto. ahora ejecute su método y lea atentamente el comando sql resultante … bienvenido a sql injection;)

@M Patel: gracias por tu comentario y tienes toda la razón

El resultado sería el siguiente SQL.

 SELECT * FROM Product WHERE ProductID=''; DROP TABLE Product; SELECT '' 

Y esto permitiría a un usuario malicioso destruir su base de datos.

Para evitar que usted debe trabajar con declaraciones preparadas como M Patel sugirió en su respuesta

Tiene un problema de Inyección SQL con '" + textBox3.Text + "'"

y no tienes que nombrar tus controles de esa manera, tienes que usar nombres significativos

puedes usar este código

 using (SqlConnection connection = new SqlConnection(@"Data Source=(LocalDB)\v11.0 AttachDbFilename=C:\Users\h8005267\Desktop\Practical Project\Build\System4\System\StockControl.mdf;Integrated Security=True;Connect Timeout=30")) { connection.Open(); SqlCommand cmd = new SqlCommand("SELECT * FROM Product WHERE ProductID=@ProductID", connection); cmd.Parameters.AddWithValue("@ProductID", textBox3.Text); SqlDataReader re = cmd.ExecuteReader(); if (re.Read()) { textBox4.Text = re.GetString(re.GetOrdinal("ProductTitle")); // only fills using first product in table textBox5.Text = re.GetString(re.GetOrdinal("ProductPublisherArtist")); comboBox1.Text = re.GetString(re.GetOrdinal("ProductType")); textBox6.Text = re.GetString(re.GetOrdinal("Price")); } else { MessageBox.Show("Please enter a valid item barcode"); } re.Close(); }