Имя переменной '@' уже объявлено

Я делаю модуль для существующей программы, в которой пользователь должен войти в систему, выбрав базу данных, к которой он хочет подключиться.

После входа в систему он переходит к form, который я показываю здесь ниже, где документ Excel импортируется и показывает его в DatagridView.

Пока это работает правильно, но теперь мне нужно сделать запрос к базе данных с информацией, которая была в этом документе Excel, я хочу проконсультироваться со всем столбцом DatagridView, но при этом он говорит, что переменная уже высказал предложения?

public partial class Form1 : Form
{

    Class1 objeto = new Class1();


    public Form1()
    {
        //Insertar.AllowUserToAddRows = false;
        InitializeComponent();
    }
    public static class compartirVariable
    {
        public static String variable;
    }

    private void Form1_load(object sender, EventArgs e)
    {
        Insertar.AllowUserToAddRows = false;
    }

    private void Btncerrar_Click(object sender, EventArgs e)
    {
        //volver al inicio de sesion
        Dispose();
        login AbrirVentana = new login();
        this.Hide();
        AbrirVentana.Show();
    }



    private void btncargar_Click(object sender, EventArgs e)
    {
        string hoja = "libro1";    //constante de el numero de la hoja
        string direccion = "1";        //variable receptora de la direccion del documento
        try
        {
            OpenFileDialog openfile1 = new OpenFileDialog();
            if (openfile1.ShowDialog() == System.Windows.Forms.DialogResult.OK)
            {
                direccion = openfile1.FileName;
            }
            {
                string pathconn = "Provider = Microsoft.jet.OLEDB.4.0; Data source=" + direccion + ";Extended Properties=\"Excel 8.0;HDR= yes;\";"; //conexion concatenando la variable con la direccion del archivo excel
                OleDbConnection conn = new OleDbConnection(pathconn);
                OleDbDataAdapter MyDataAdapter = new OleDbDataAdapter("Select * from [" + hoja + "$]", conn); //consulta concatenando la constante con el nombre de la hoja
                DataTable dt = new DataTable();
                MyDataAdapter.Fill(dt);
                Insertar.DataSource = dt;


            }
        }
        catch (Exception Error){
            MessageBox.Show("Error: " + Error.Message);
        }

    }


    private void btnlimpiar_Click(object sender, EventArgs e)
    {
        SqlConnection conexion = new SqlConnection("Data Source = 172.29.110.115; Initial Catalog =" + compartirVariable.variable + "; User ID = sa ; Password = complementos");

        SqlCommand autocomplementar = new SqlCommand("SELECT * FROM y_personal_contratos where contrato = @Contrato", conexion);

        conexion.Open();

        try
        {

            foreach (DataGridViewRow row in Insertar.Rows)
            {

                //autocomplementar.Parameters.Clear;
                autocomplementar.Parameters.AddWithValue("@Contrato", row.Cells["Contrato"].Value);
                autocomplementar.ExecuteNonQuery();
            }
        }

        catch (Exception Error)
        {
            MessageBox.Show("Error: " + Error.Message);
        }

        dgvprueba.DataSource = autocomplementar;
    }
}
1
задан 28.11.2019, 18:40
1 ответ

Если то, что ты хочешь сделать, состоит в том, чтобы просачиваться по нескольким контрактам, query sql, который estГЎs используя не правилен. DeberГ-схвати использовать IN:

SqlCommand autocomplementar = new SqlCommand("SELECT * FROM y_personal_contratos where contrato in @Contrato", conexion);

И потом ты должен прилагать контракты в переменной string перед aГ±adir sqlparameter. Что-либо подобное:

string condicion="(";
foreach (DataGridViewRow row in Insertar.Rows)
{
    condicion+=row.Cells["Contrato"].Value +",";
}
condicion=condicion.Remove(condicion.Length - 1) + ")";
autocomplementar.Parameters.AddWithValue("@Contrato", row.Cells["Contrato"].Value);
autocomplementar.ExecuteNonQuery();

cГіdigo может улучшать достаточно, но я думаю, что уже он дает тебе отпечаток как ты должен делать это.

1
ответ дан 01.12.2019, 10:40

Теги

Похожие вопросы