2015-10-13 27 views
5

Tôi đang cố chèn dữ liệu mới vào cơ sở dữ liệu .dbf cũ được tạo bằng Foxpro. Cơ sở dữ liệu có rất nhiều cột và tôi không cần phải điền vào từng cột.C# cách viết đúng vào .dbf (foxpro)

Kết nối hoạt động. Nhưng bây giờ im nhận được ngoại lệ "Trường XY không cho phép giá trị null" cho mỗi một tôi không thêm vào trong tuyên bố chèn của tôi. Nhưng cơ sở dữ liệu được cấu hình để cho phép các giá trị null.

Tôi đang sử dụng đoạn mã sau:

  OleDbConnection dbfcon = new OleDbConnection("Provider=VFPOLEDB.1;" + 
      "Data Source=" + Application.StartupPath + "\\Daten;"); 
     dbfcon.Open(); 

     String query = "INSERT INTO TB_KUVG (KDNR, Kuvg_id) " + 
      "VALUES(?,?)"; 
     OleDbCommand cmd = new OleDbCommand(query, dbfcon); 
     cmd.Parameters.AddWithValue("@KDNR", 1); 
     cmd.Parameters.AddWithValue("@Kuvg_id", 1); 
     cmd.ExecuteNonQuery(); 

     dbfcon.Close(); 

Vì vậy, những gì tôi làm sai? Có nên sử dụng cách khác để viết vào .dbf từ C#?

+1

Thông báo có vẻ khá rõ ràng. Bạn có một hoặc nhiều cột không cho phép giá trị NULL và bạn không chỉ định giá trị cho chúng trong truy vấn chèn của bạn. Tôi khuyên bạn nên kiểm tra từng cột trong bảng đó cho vấn đề này – Steve

Trả lời

5

Bạn gần như đã làm đúng. Lưu ý rằng tên tham số không quan trọng và sẽ được định vị theo vị trí (ví dụ: @KDNR được thêm trước để nó tương ứng với phần giữ chỗ đầu tiên). Những gì bạn đang thiếu là, nếu các trường bạn không vượt qua không chấp nhận giá trị NULL thì bạn nên thông báo cho kết nối mà thay vào đó bạn muốn giá trị "trống" cho các trường đó ('' cho chuỗi,// ​​cho ngày, 0 cho số và ngược lại). Để thông báo cho trình điều khiển, bạn thực thi 'SET NULL OFF' trên cùng một kết nối.

Trong khi thêm nó, tôi sửa đổi mã hiện tại của bạn một chút:

string dataFolder = Path.Combine(Application.StartupPath, "Daten"); 
String query = @"INSERT INTO TB_KUVG 
      (KDNR, Kuvg_id) 
      VALUES 
      (?,?)"; 
using (OleDbConnection dbfcon = new OleDbConnection("Provider=VFPOLEDB;Data Source=" + dataFolder)) 
{ 
    OleDbCommand cmd = new OleDbCommand(query, dbfcon); 
    cmd.Parameters.AddWithValue("@KDNR", 1); 
    cmd.Parameters.AddWithValue("@Kuvg_id", 1); 

    dbfcon.Open(); 
    new OleDbCommand("set null off",dbfcon).ExecuteNonQuery(); 
    cmd.ExecuteNonQuery(); 
    dbfcon.Close(); 
} 

PS: Application.StartupPath có thể không phải là một ý tưởng tốt vì nó có thể nằm trong "Program Files", mà là chỉ đọc.

PS2: Sẽ tốt hơn nếu bạn thêm thẻ "VFP" vào đó thay vì "DBF".

+0

cảm ơn lời khuyên của bạn, nó hoạt động tốt ngay bây giờ – Sandmaann

Các vấn đề liên quan