2016-11-29 4 views
0

나는 조금 둘러 보았다했지만 답변의 대부분은 나는 현재에서 약간의 도움을 얻었다 코드 블록의이 비트를 사용하고 "Select count(*) from MyTable where id = 1"C# 많은 데이터를 MS Access 데이터베이스에 삽입하기 전에 레코드가 존재하는지 어떻게 확인합니까?

처럼 인터페이스 할 수없는 SQL 저장 프로 시저, 또는 미리 정해진 값에 해당하는 다른 질문. 보시다시피 Access 데이터베이스가 전체적으로 삽입됩니다. 고유 한 ID라는 테이블에 다른 열을 추가한다고 가정하고, 이미 삽입되었는지 여부를 어떻게 확인할 수 있습니까?

using (OleDbConnection conn = new OleDbConnection(Con)) 
using (OleDbCommand cmd = new OleDbCommand()) 
{ 
    cmd.Connection = conn; 
    conn.Open(); 
    for (int i = 0; i <= DGVExcel.Rows.Count - 1; i++) 
    { 
     cmd.CommandText = 
      "Insert INTO ACTB (FirstName, LastName, GrossIncome, LessTNT, TaxableIncomeCE, TaxableIncomePE, GrossTaxableIncome, LessTE, LessPPH, NetTax, TaxDue, HeldTaxCE, HeldTaxPE, TotalTax) " + 
      "VALUES(@First, @Last, @Gross, @LessTNT, @TCI, @ADDTI, @GTI, @LessTE, @LessPPH, @LessNTI, @TD, @TWCE, @TWPE, @TATW)"; 
     //cmd.Parameters.AddWithValue("@ID", Convert.ToInt32(txtID.Text)); 
     cmd.Parameters.AddWithValue("@First", DGVExcel.Rows[i].Cells[0].Value); 
     cmd.Parameters.AddWithValue("@Last", DGVExcel.Rows[i].Cells[1].Value); 
     cmd.Parameters.AddWithValue("@Gross", Convert.ToDouble(DGVExcel.Rows[i].Cells[2].Value)); 
     cmd.Parameters.AddWithValue("@LessTNT", 
      Convert.ToDouble(DGVExcel.Rows[i].Cells[3].Value)); 
     cmd.Parameters.AddWithValue("@TCI", Convert.ToDouble(DGVExcel.Rows[i].Cells[4].Value)); 
     cmd.Parameters.AddWithValue("@ADDTI", Convert.ToDouble(DGVExcel.Rows[i].Cells[5].Value)); 
     cmd.Parameters.AddWithValue("@GTI", Convert.ToDouble(DGVExcel.Rows[i].Cells[6].Value)); 
     cmd.Parameters.AddWithValue("@LessTE", Convert.ToDouble(DGVExcel.Rows[i].Cells[7].Value)); 
     cmd.Parameters.AddWithValue("@LessPPH", 
      Convert.ToDouble(DGVExcel.Rows[i].Cells[8].Value)); 
     cmd.Parameters.AddWithValue("@LessNTI", 
      Convert.ToDouble(DGVExcel.Rows[i].Cells[9].Value)); 
     cmd.Parameters.AddWithValue("@TD", Convert.ToDouble(DGVExcel.Rows[i].Cells[10].Value)); 
     cmd.Parameters.AddWithValue("@TWCE", Convert.ToDouble(DGVExcel.Rows[i].Cells[11].Value)); 
     cmd.Parameters.AddWithValue("@TWPE", Convert.ToDouble(DGVExcel.Rows[i].Cells[12].Value)); 
     cmd.Parameters.AddWithValue("@TATW", Convert.ToDouble(DGVExcel.Rows[i].Cells[13].Value)); 
     cmd.ExecuteNonQuery(); 
    } 
} 

는 여기에 지금까지 최대 무슨 생각 :

cmd = ("If not exists(Select*from ACTB where ID = @ID.... 

내가 값을 미리 결정할 수 없습니다 잊어 빌어 먹을 아. 어떻게 든 Datagridview에서 끌어 와야합니다. 행 수가 많기 때문에 단순히 DGV.Rows [i] .Cells [1]을 지정할 수 없습니다. 맞습니까?

EDIT : Datagridview와 비슷한 필드가있는 경우 명시 적으로 알 필요가있는 게시물을 암시하지 못했습니다. 그 이유는 별도의 함수에서 DB의 원래 값을 추가하기 때문입니다. 중복은 없지만 값은 업데이트됩니다. Employee1이 10000 명의 급여를 가지고있는 것처럼, 테이블은 복제본을보고 필드의 일치하는 DB의 원본에 버전 급여를 추가합니다.

+0

Db가 고유 필드에 중복 값을 추가하지 않는다고 생각하지 않습니다. 예외가 발생합니다. – Prajwal

+0

실 거예요? 흠, 글쎄, 이전에 생각한 아이디어를 구현하지 못했지만 @Prajwal이라는 질문이 있습니다. 전체 DataGridView의 내용을 데이터베이스에 추가하기 때문에이 예외가 발생하면 전체 쿼리가 중단됩니다. 이상적으로는 예외가있는 필드를 제외하고 해당 필드를 삽입합니다. 게시물에 암시하지 않은 또 다른 시나리오는 Datagridview에서 DB에 비슷한 필드가 있는지 명시 적으로 알고 데이터베이스의 원래 값을 추가해야합니다. – Aroueterra

+0

다른 검색어를 사용하여 언제든지 확인할 수 있습니다. 고유 ID를 사용하여 항목을 선택하고 0 행을 반환하면 해당 벌금. 그렇지 않으면 추가하지 마십시오. – Prajwal

답변

-1

하나의 옵션은 @ID를 찾는 WHERE 절을 명령문에 포함시키는 것입니다.

WHERE ACTB.ID <> @ID 

이것은 ID가 삽입에 의해 생성 된 자동 증가 필드가 아니라고 가정합니다. 그런 다음 성 및 성 등 WHERE 절의 다른 필드를 사용할 수 있습니다.

+0

자동 증분 ID 필드가있는 동안. 필자가 언급 한 ID 필드는 직원에게 고유하며 전적으로 고유 한 것입니다. 당신의 질문이 정확히 무엇인지 모르겠습니다. – Aroueterra