从 导入数据时,实体框架不会保存更改.DBF 文件

本文关键字:保存更改 DBF 文件 框架 实体 导入 数据 | 更新日期: 2023-09-27 18:32:00

我正在尝试从 导入表。DBF 文件到 MSSQL 数据库中...我的代码适用于 400 行,但如果超过此行,SaveChanges 根本不会更新数据库。

我的代码的作用:

打开 OleDb 连接,通过 SelectCommand 将数据读入数据表然后我开始"for 循环",将行放入实体模型对象中

当循环完成时,我保存了更改 - 但它不会影响 MSSQL db

Visual Studio没有显示任何错误或异常?!它适用于 .DBF 文件少于 400 行,但我有一个 1200 行的文件,我想保存到 DB 请帮助!

DataTable dt = new DataTable();
try
{
    // define the connections to the .dbf file
    OleDbConnection connection = new OleDbConnection(@"Provider=Microsoft.Jet.OLEDB.4.0; Data Source=" + Path + ";Extended Properties=dBase III");
    OleDbCommand command = new OleDbCommand("SELECT sif_komin, naziv, oib, mjesto, adresa, telefon, telefax, mobitel, kontakt from KUPCI.dbf", connection);
    //open the connection and read in all the data from .dbf file into a datatable
    connection.Open();
    dt.Load(command.ExecuteReader());
    connection.Close();
}
catch(OleDbException)
{
    //handle exception
}
using (Entities db = new Entities()) //Entity object
{
    try
    {
        db.Komitents.RemoveRange(db.Komitents);
        for (int i = 0; i < 400; i++)
        {
            DataRow row = dt.Rows[i];
            if (row["naziv"].ToString() != "")// skips header row
            {
                Komitent k = new Komitent();
                k.Sif_komit = Convert.ToInt32(row["sif_komin"].ToString());
                k.Naziv = row["naziv"].ToString();
                k.Oib = row["oib"].ToString();
                k.Mjesto = row["mjesto"].ToString();
                k.Adresa = row["adresa"].ToString();
                k.Telefon = row["telefon"].ToString();
                k.Telefax = row["telefax"].ToString();
                k.Mobitel = row["mobitel"].ToString();
                k.Kontakt = row["kontakt"].ToString();
                db.Komitents.Add(k);
                bw.ReportProgress((int)(100.0 / dt.Rows.Count) * i, null);
                if (pb.InvokeRequired)
                {
                    this.Invoke((MethodInvoker)delegate
                    {
                        pb.Value = (int)((100.0 / dt.Rows.Count) * i);
                    });
                }
            }
        }
        db.SaveChanges();

从 导入数据时,实体框架不会保存更改.DBF 文件

我怀疑这个问题是否真的与实体框架有关。保存 400 个项目甚至 100,000 个项目应该没有任何区别!

我已经更新了您的代码

检查 AddRange 中真正发生的事情,列表是否真的包含 1200 个项目或 0 个项目?

   using (Entities db = new Entities()) //Entity object
    {
        try
        {
            db.Komitents.RemoveRange(db.Komitents);
            // Jonathan: Let make 2 SaveChanges call for now to understand what's happening
            db.SaveChanges();
            // Jonathan: Create a list to use AddRange to improve performance
            List<Komitent> list = new List<Komitent>();
            for (int i = 0; i < 400; i++)
            {
                DataRow row = dt.Rows[i];
                if (row["naziv"].ToString() != "")// skips header row
                {
                    Komitent k = new Komitent();
                    k.Sif_komit = Convert.ToInt32(row["sif_komin"].ToString());
                    k.Naziv = row["naziv"].ToString();
                    k.Oib = row["oib"].ToString();
                    k.Mjesto = row["mjesto"].ToString();
                    k.Adresa = row["adresa"].ToString();
                    k.Telefon = row["telefon"].ToString();
                    k.Telefax = row["telefax"].ToString();
                    k.Mobitel = row["mobitel"].ToString();
                    k.Kontakt = row["kontakt"].ToString();
                    list.Add(k);
                    bw.ReportProgress((int)(100.0 / dt.Rows.Count) * i, null);
                    if (pb.InvokeRequired)
                    {
                        this.Invoke((MethodInvoker)delegate
                        {
                            pb.Value = (int)((100.0 / dt.Rows.Count) * i);
                        });
                    }
                }
            }
            // Jonathan: Put a break point here to make sure the list contains 1200 rows
            db.AddRange(list);
            db.SaveChanges();
        }
        catch
        {
            // Jonathan: Let throw the error for now until it fixed
            throw;
        }
    }

编辑:添加信息以了解正在发生的事情

提示 1:使用 SQL 事件探查器查看插入命令是否至少发送到 SQL Server,或者根本不发送到 SQL Server。

提示 2:尝试查找具有潜在错误的行,尝试添加 500、550、552 等,直到找到开始导致问题的行数正确。查看最后一行,看看是否一切正常,或者将其替换为自定义值。

提示 3:确保在两个 catch 中都有一个断点,以防函数调用者也使用 try/catch 并且不处理错误。