2015-05-16 46 views
6

Próbuję wstawić 5 rekordów do tabeli bazy danych SQL Server z DataGridView przy użyciu C#.Jak przechowywać wiele rekordów w SQL Server przy użyciu DataGridView

Z mojego kodu pobiera on dane z kilku rekordów, ale wstawi tylko pierwszy rekord do bazy danych. Czy ktoś może mi pomóc zapisać 5 rekordów w bazie danych jednym kliknięciem przycisku zapisu?

Oto mój kod:

DataSet ds = new DataSet(); 

    SqlConnection cs = new SqlConnection(@"Data Source=DELL-PC;Initial Catalog=Image_DB;Integrated Security=True"); 

    SqlDataAdapter da = new SqlDataAdapter(); 

    SqlCommand cmd = new SqlCommand(); 

    BindingSource Input = new BindingSource(); 
    DataView dview = new DataView(); 

    private void Form1_Load(object sender, EventArgs e) 
    { 
     //create a DataGridView Image Column 
     DataGridViewImageColumn dgvImage = new DataGridViewImageColumn(); 
     //set a header test to DataGridView Image Column 
     dgvImage.HeaderText = "Images"; 
     dgvImage.ImageLayout = DataGridViewImageCellLayout.Stretch; 

     DataGridViewTextBoxColumn dgvId = new DataGridViewTextBoxColumn(); 
     dgvId.HeaderText = "ID"; 

     DataGridViewTextBoxColumn dgvName = new DataGridViewTextBoxColumn(); 
     dgvName.HeaderText = "Name"; 
     dataGridView1.Columns.Add(dgvId); 
     dataGridView1.Columns.Add(dgvName); 
     dataGridView1.Columns.Add(dgvImage); 
     dataGridView1.AutoSizeColumnsMode = DataGridViewAutoSizeColumnsMode.Fill; 
     dataGridView1.RowTemplate.Height = 120; 
     dataGridView1.AllowUserToAddRows = false; 
    } 

    // button add data to dataGridView 
    // insert image from pictureBox to dataGridView 
    private void btn_Add_Click(object sender, EventArgs e) 
    { 
     MemoryStream ms = new MemoryStream(); 
     pictureBox1.Image.Save(ms, pictureBox1.Image.RawFormat); 
     byte[] img = ms.ToArray(); 
     dataGridView1.Rows.Add(txt_UserID.Text, txt_Name.Text, img); 
    } 

    // browse image in pictureBox1 Click 
    private void pictureBox1_Click(object sender, EventArgs e) 
    { 
     OpenFileDialog opf = new OpenFileDialog(); 
     opf.Filter = "Choose Image(*.jpg; *.png; *.gif)|*.jpg; *.png; *.gif"; 
     if (opf.ShowDialog() == DialogResult.OK) 
     { 
      pictureBox1.Image = Image.FromFile(opf.FileName); 
     } 
    } 

    private void btn_Save_Click(object sender, EventArgs e) 
    { 
     for (int i = 5; i < dataGridView1.Rows.Count; i++) 
     { 
      string col1 = dataGridView1[0, dataGridView1.CurrentCell.RowIndex].Value.ToString(); 
      string col2 = dataGridView1[1, dataGridView1.CurrentCell.RowIndex].Value.ToString(); 
      string col3 = dataGridView1[2, dataGridView1.CurrentCell.RowIndex].Value.ToString(); 

      string insert_sql = "INSERT INTO Input(UserID, UserName, PassImage) VALUES ('" + col1 + "','" + col2 + "','" + col3 + "')"; 

      this.getcom(insert_sql); 
     } 

     MessageBox.Show("Record Added"); 
    } 

    public SqlConnection GetSqlConnection() //connection function 
    { 
     string str_sqlcon = "Data Source=DELL-PC;Initial Catalog=Image_DB;Integrated Security=True"; 

     SqlConnection mycon = new SqlConnection(str_sqlcon); 
     mycon.Open(); 

     return mycon; 
    } 

    public void getcom(string sqlstr) //function for adding rows 
    { 
     SqlConnection sqlcon = this.GetSqlConnection(); // Watch out same string type as GetSQLConnection function 
     SqlCommand sqlcom = new SqlCommand(sqlstr, sqlcon); 
     sqlcom.ExecuteNonQuery(); 
     sqlcom.Dispose(); 
     sqlcon.Close(); 
     sqlcon.Dispose(); 
    } 

Odpowiedz

5

Problem jest w tym „za” pętli, jesteś nie używając i w pętli for.

lepiej wypróbuj tę.

for (int i = 0; i < dataGridView1.Rows.Count; i++) 
 
{ 
 
    string col1 = dataGridView1.Rows[i].Cells[0].Value.ToString(); 
 
    string col2 = dataGridView1.Rows[i].Cells[1].Value.ToString(); 
 
    string col3 = dataGridView1.Rows[i].Cells[2].Value.ToString(); 
 
    string insert_sql = "INSERT INTO Input(UserID, UserName, PassImage) VALUES ('" + col1 + "','" + col2 + "','" + col3 + "')"; 
 
    this.getcom(insert_sql); 
 
} 
 
             

zmienić logikę kodu, jeśli to konieczne.

+0

Wielkie dzięki! zadziałało .... – Sumi

+0

Czy możesz powiedzieć, w jaki sposób mogę ograniczyć użytkownika, aby przekazać dane wejściowe dokładnie 5 rekordów inaczej wygeneruje wiadomość. – Sumi

+0

wykonaj zmianę w ** dla pętli **, -> 'dla (i = 0; i <6; i ++)', więc wstawi tylko 5 rekordów. Jeśli chcesz wyświetlić komunikat, użyj zdarzeń klienta datagridview lub wypróbuj logikę w ** jeśli ** 'if (dataGridView1.Rows.count> 5)'. @ Sumi – Balaji

4
for (int i = 5; i < dataGridView1.Rows.Count; i++) 

zmiana to for (int i = 0; i < dataGridView1.Rows.Count; i++)

Jesteś przypisywania 5 do i więc po jednym włóż ją wyjdzie z pętli bo i staną 6.

także „i”, określając DataGridView row..else zawsze będzie wskazywać na jednym rzędzie i włóż 5 rzędów ale z samej wartości

Powiązane problemy