Я делаю модуль для существующей программы, в которой пользователь должен войти в систему, выбрав базу данных, к которой он хочет подключиться.
После входа в систему он переходит к 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;
}
}
Если то, что ты хочешь сделать, состоит в том, чтобы просачиваться по нескольким контрактам, 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 может улучшать достаточно, но я думаю, что уже он дает тебе отпечаток как ты должен делать это.