2011-12-05 4 views
2

출석 시스템을 만들고 격자보기를 사용하여 데이터를 삽입하려고합니다. 그리드에는 많은 행이있을 수 있습니다. 모든 일이 잘되고 데이터도 잘 들어갑니다. 그러나 각 행을 확인하려면 for 루프를 사용하고 있습니다. 이렇게하면 행 수가 증가 할 때 성능이 상당히 느려집니다. 또한 행 수가 늘어 나면 왕복 횟수가 늘어납니다.'for'루프를 사용하지 않고 gridView에 여러 행을 삽입하십시오.

아무에게도 더 좋은 해결책을 제공 할 수 있습니까?

나는 유 모두에 따라 내 코드를 수정해야 .....하지만 지금 문제는 코드 만 괜찮 이것보다 다른 그리드를 여러 번의 마지막 행을 ...... 삽입되어 발생할 수 있습니다.

MySqlDataAdapter myworkdatta = myworkdatta = new MySqlDataAdapter("SELECT CID,EID,TID,ATTENDENCE FROM EMPLOYEEATT ORDER BY AID DESC LIMIT 1", conn); 
            DataSet myworkdsatt = new DataSet(); 
            myworkdatta.Fill(myworkdsatt, "EMPLOYEEATT"); 

            int i; 
            for (i = 0; i < emplist_gv.Rows.Count; i++) 
            { 
             string tid = emplist_gv.Rows[i].Cells[6].Value.ToString(); 
             string eid = emplist_gv.Rows[i].Cells[0].Value.ToString(); 
             string atid = emplist_gv.Rows[i].Cells[7].Value.ToString(); 

             MySqlCommand cmdwk = new MySqlCommand("INSERT INTO EMPLOYEEATT (CID,EID,TID,ATTENDENCE) VALUES (@cid,@eid,@tid,@attendence)", conn); 
             MySqlParameter spcidatt = new MySqlParameter("@cid", calid); 
             MySqlParameter speid = new MySqlParameter("@eid", eid); 
             MySqlParameter sptid = new MySqlParameter("@tid", tid); 
             MySqlParameter spattendence = new MySqlParameter("@attendence", atid); 

             cmdwk.Parameters.Add(spcidatt); 
             cmdwk.Parameters.Add(speid); 
             cmdwk.Parameters.Add(sptid); 
             cmdwk.Parameters.Add(spattendence); 

             myworkdatta.InsertCommand = cmdwk; 

             DataRow drowk = myworkdsatt.Tables["EMPLOYEEATT"].NewRow(); 
             drowk["CID"] = calid; 
             drowk["EID"] = eid; 
             drowk["TID"] = tid; 
             drowk["ATTENDENCE"] = atid; 

             myworkdsatt.Tables["EMPLOYEEATT"].Rows.Add(drowk); 

            } 

            myworkdatta.Update(myworkdsatt, "EMPLOYEEATT"); 
+0

이동 루프 전에 선택하고, 루프 후 루프 및 업데이트 테이블 내부 테이블의 변경 :

곧, 코드 블록과 같을 것이다. 루프를 한 번 반복하는 동안 2 번 선택하고 데이터를 삽입하는 것은 좋지 않습니다. – Reniuz

+0

Select 문은 마지막 행 ID를 가져오고 일반 exp로 1 씩 증가하기 때문에 필요합니다. – Aaraadhana

+0

나는 .....에 따라 코드를 수정했다. 그러나 이제는 그리드의 마지막 행을 여러 번 삽입하는 문제가 발생했다.이 외에도 코드는 괜찮다. – Aaraadhana

답변

1

당신이 선택 SQL 문을 고려하면 루프에서 저를 가지고 충분히 쉽게 그 값을 사용할 수있는 특정 행과 관련된 모든 것을 포함하지 않는 것 같습니다.

당신은 내가 이유를 이해하지 않는 각 행에 삽입 할 필요가 있기 때문에, 다음이 데이터베이스를 제거하기 어려운 것 같다가 안타.

당신은 대량 당신이 MySQL 용 벌크 삽입 볼 수 있었다 삽입하고있는 경우 : MySql Bulk insert

+0

이 행을 Datatable temp에 저장할 수 없습니다. 나중에 데이터베이스로 업데이트 ... – Aaraadhana

+0

내가 마지막 행 ID를 가져오고 일반 exp로 1 씩 증가시키기 때문에 Select 문이 필요합니다. – Aaraadhana

+0

원하는 경우 파일에 저장하고 백그라운드에서 배치 프로세스를 실행할 수 있습니다. 메모리 나 다른 곳에 저장 될 수 없으므로 계속해서 디스크 쓰기가 진행됩니다. DB 작성보다 훨씬 빠릅니다. –

0

당신은 SqlBulkCopy을 사용할 수 있습니다, 그것은 사용하기 쉽습니다. 기본적으로 데이터 테이블 (또는 데이터 판독기)을 제공하면 해당 소스의 행을 대상 테이블로 복사합니다.

DataTable dataTableInGridView = (DataTable)emplist_gv.DataSource; 
using (SqlConnection connection = 
      new SqlConnection(connectionString)) 
{ 
    using (SqlBulkCopy bulkCopy = 
        new SqlBulkCopy(connection)) 
    { 
     bulkCopy.DestinationTableName = 
      "dbo.BulkCopyDemoMatchingColumns"; 
     try 
     { 
      // Write from the source to the destination. 
      bulkCopy.WriteToServer(dataTableInGridView); 
     } 
     catch (Exception ex) 
     { 
      // Handle exception 
     } 
    } 
} 
+0

감사합니다. 결과를 업데이트하려고합니다 ... – Aaraadhana

+0

SqlBulkCopy가 MySQl에서 지원되지 않습니다. – Aaraadhana

관련 문제