2017-04-11 16 views
0

이미 기존 DBF 파일에 명령을 삽입하는 데 문제가 있습니다. 내 변수 fullpath에 = "C : \ Kasa_NMP \ MAT_DAY.dbf"...이를 실행 한 후기존 DBF 파일에 어떻게 삽입합니까?

내가 얻을 :

유형의 처리되지 않은 예외 'System.Data.OleDb .OleDbException 'System.Data.dll에서 이 발생했습니다.

추가 정보 : INSERT INTO 문에 구문 오류가 있습니다. 내가 '넣어하려고하면

'내 fullpath에 주위 변수를 내가 얻을 :

유형의 처리되지 않은 예외 'System.Data.OleDb.OleDbException' 이가 system.data.dll에서 발생

추가 정보 : 쿼리의 구문 오류. 불완전한 쿼리 절.

public static void DataTableToDBF(string filePath, string fileName, DataTable dataTable) 
{ 
    string fullPath = filePath + fileName + ".dbf"; 

     using (OleDbConnection con = new OleDbConnection(GetConnection(filePath))) 
     { 
      con.Open(); 
      OleDbCommand cmd = new OleDbCommand(); 
      cmd.Connection = con; 

      foreach (DataRow row in dataTable.Rows) // Insert redaka u DBF file 
      { 
       string insertCommand = "INSERT INTO " + fullPath + "(datum1, faktura, sifra_dob, sifra, naziv_art, ulaz, izlaz," + 
        " jed_cijena, duguje, potrazuje, tarifa, rabat, n, pla, op, nab_cijena, porez_pr, sif_kup, time)" + 
       " VALUES(@datum, @faktura, @sifra_dob, @sifra, @naziv_art, @ulaz, @izlaz, @jed_cijena, @duguje, @potrazuje," + 
       " @tarifa, @rabat, @n, @pla, @op, @nab_cijena, @porez_pr, @sif_kup, @time)"; 

       cmd.Parameters.AddWithValue("@datum", DateTime.Parse(row["Datum_k"].ToString()).ToShortDateString()); 
       cmd.Parameters.AddWithValue("@faktura", row["Dokument"]); 
       cmd.Parameters.AddWithValue("@sifra_dob", row["BarKod"]); 
       cmd.Parameters.AddWithValue("@sifra", row["Sifra"]); 
       cmd.Parameters.AddWithValue("@naziv_art", row["NazivArtikla"]); 
       cmd.Parameters.AddWithValue("@ulaz", row["Ulaz"]); 
       cmd.Parameters.AddWithValue("@izlaz", row["Izlaz"]); 
       cmd.Parameters.AddWithValue("@jed_cijena", row["Cijena"]); 
       cmd.Parameters.AddWithValue("@duguje", row["Duguje"]); 
       cmd.Parameters.AddWithValue("@potrazuje", row["Potrazuje"]); 
       cmd.Parameters.AddWithValue("@tarifa", row["Tarifa"]); 
       cmd.Parameters.AddWithValue("@rabat", row["Rabat"]); 
       cmd.Parameters.AddWithValue("@n", 0); 
       cmd.Parameters.AddWithValue("@pla", row["Placanje"]); 
       cmd.Parameters.AddWithValue("@op", row["Operator"]); 
       cmd.Parameters.AddWithValue("@nab_cijena", row["NabavnaCijena"]); 
       cmd.Parameters.AddWithValue("@porez_pr", row["Porez"]); 
       cmd.Parameters.AddWithValue("@sif_kup", row["SifraKomitenta"]); 
       cmd.Parameters.AddWithValue("@time", row["Vrijeme"]); 

       cmd.CommandText = insertCommand; 
       cmd.ExecuteNonQuery(); 
      } 
      con.Close(); 
    } 
} 

private static string GetConnection(string path) 
{ 
    return "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" + path + ";Extended Properties=dBASE IV;"; 
} 
+0

put "cmd.CommandText = insertCommand;" in the paramters – BugFinder

+2

필드 중 하나에 대해 예약어를 사용하고있는 것 같습니다. - Time - 그 단어를 대괄호 안에 넣으라고 제안합니다. _..., sif_kup, [time]) "_ – Steve

+0

@Steve 아마 지금은 작은 분야에 대한 새로운 예외가 생겼지 만 고맙겠습니다. - 답으로 써야합니다 ... – ChenChi

답변

1

나는 DBF 데이터베이스 시스템 만 단어 시간이 높은 예약 된 키워드 의심되는 위해 예약 된 키워드에 대한 정확한 문서를 찾을 수 없습니다.
이것이 사실이라면 SYNTAX ERROR와 함께 위에서 언급 한 예외를 받게됩니다.

이 솔루션은 항상 동일합니다 :

  • A) 해당 컬럼에 대해 다른 이름을 사용하십시오.
  • B) A는 할 수없는 경우 당신은 당신의 코드에서 다른 문제가 발생하지만 다음 ..., sif_kup, [time])"

로 대괄호 내부의 시간을 묶습니다. 루프 내부에 매개 변수를 추가합니다. 이것은 두 번째 루프에서 매개 변수 컬렉션을 두 배로 늘 렸지만이 매개 변수의 위치가 더 나쁘다는 것을 의미합니다. OleDb는 컬렉션의 위치에 따라 매개 변수를 인식하기 때문에 다른 매개 변수를 무시하고 각 루프마다 동일한 값을 쓰게됩니다.
이 경우 commandtext를 설정하고 루프 외부에 매개 변수를 작성하여 비워 둡니다. 루프 내에서 쿼리를 실행하기 전에 값을 변경합니다.

또는 당신은 단순히 각 루프에서 또 다시 매개 변수를 추가하기 전에 루프 내부

cmd.Parameters.Clear(); 

를 작성할 수 있습니다.

+0

도움을 주셔서 감사합니다. – ChenChi