2013-06-12 5 views
1

아래 코드는 OleDB를 사용하여 데이터베이스로 나가고 정보로 데이터 세트를 채 웁니다. 그런 다음 데이터 집합에 무언가가 있는지 확인한 다음 데이터 집합에 무언가가 있는지 확인한 다음 해당 데이터 집합을 함수 끝에 추가 된 데이터 테이블에 추가합니다.데이터 테이블에 문제 추가하기

for (int i = 0; i < UserClassDict[UserName].ControlNumber.Count; i++) 
        { 
         string query = "SELECT * FROM [FNF Taxes] WHERE ControlNumber =" + UserClassDict[UserName].ControlNumber[i] + ";"; 
         adapter.SelectCommand = new OleDbCommand(query, conn); 
         DataSet dataset = new DataSet(); 
         adapter.Fill(dataset); 

         if (dataset.Tables[0].Rows.Count > 0) 
         { 
          dt = dataset.Tables[0]; 
               } 
        } 

제 질문은 이쪽입니다. 이 블록이있는 for 루프를 통해 알 수 있듯이 여러 번 실행되며 DB에서 끌어 와서 데이터 테이블에 추가 할 각 행을 원합니다. 따라서 데이터 테이블이 반환 될 때 모든 X 양의 행이 있습니다. 그러나 위의 코드 블록에서와 같이 데이터 테이블에 추가되는 행은 가져온 가장 최근 행입니다.

+0

나는 quetsion이 무엇인지 이해하기가 어렵습니다. –

+0

이 SQL을 작성하는 데 사용되는 기술은 주입 공격에 취약합니다. 이 특정 쿼리는 C# 개체가 숫자 데이터 형식 인 것처럼 보이지만 동일한 기술을 사용하여 쿼리로 데이터를 대체하는 다른 쿼리가 있다면 해킹 당할 가능성이 큽니다. –

+0

몇 가지 추가 코드가 도움이 될 수 있습니다. – ErickBest

답변

3

사용 DataTable.Merge() :

DataTable dt = null; 
for (int i = 0; i < UserClassDict[UserName].ControlNumber.Count; i++) 
{ 
    string query = "SELECT * FROM [FNF Taxes] WHERE ControlNumber =" + UserClassDict[UserName].ControlNumber[i] + ";"; 
    adapter.SelectCommand = new OleDbCommand(query, conn); 
    DataSet dataset = new DataSet(); 
    adapter.Fill(dataset); 

    if (dataset.Tables[0].Rows.Count > 0) 
    { 
     if (dt == null) 
      dt = dataset.Tables[0].Clone(); 
     dt.Merge(dataset.Tables[0]); 
    } 
} 
return dt; 
0

내가 아는 가장 정직 방법의 DataTable의 동일한 인스턴스를 계속로드하는 것입니다.

private DataTable _dt = new DataTable(); 

... 

private void FillMyDataTable() 
{ 
    ... 
    sda.Fill(_dt); 
} 

또는 귀하의 경우

DataSet : 다음과 같을 수 클래스를 생각해 보자. 또 다른 옵션은 DonBoitnott이 솔루션으로 제공 한 Merge입니다.

0

이 수준에서 연결 방법을 적용하십시오. dt = dataset.Tables [0]; ... Iteration 내에서 객체 선언을 피할 것입니다 ... Loop가 너무 바쁘게 보입니다 ... for loop에서 i을 잘 활용하면 과 같이 [0],과 같은 값을 얻을 수 있습니다. .... dt에 연결된 데이터를 저장할 수 있습니다.

0

나는 한 번 쿼리를 실행할 수 있다고 믿는다. 이러한 모든 객체를 루프에 만들 필요는 없습니다.

   string where = ""; 
       string query = "SELECT * FROM [FNF Taxes] WHERE ControlNumber = {0};"; 
       for (int i = 0; i < UserClassDict[UserName].ControlNumber.Count; i++) 
       { 
        if(i == UserClassDict[UserName].ControlNumber.Count -1) 
         where+=UserClassDict[UserName].ControlNumber[i] ; 
        else 
         where += UserClassDict[UserName].ControlNumber[i] + ","; 

       } 

       adapter.SelectCommand = new OleDbCommand(string.Format(query,where), conn); 
       DataSet dataset = new DataSet(); 
       adapter.Fill(dataset); 

       if (dataset.Tables[0].Rows.Count > 0) 
       { 
        if (dt == null) 
         dt = dataset.Tables[0]; 
       } 
관련 문제