EntityFramework 从 .DBF 文件导入数据时不保存更改
EntityFramework doesn't SaveChanges when importing data from .DBF file
我正在尝试将 Table 从 .DBF 文件导入 MSSQL 数据库...
我的代码适用于 400 行,但如果超过 400 行,SaveChanges 根本不会更新数据库。
我的代码的作用:
打开 OleDb 连接,通过 SelectCommand 将数据读入 DataTable
然后我开始 "for loop" 将行放入实体模型对象
循环完成后,我保存更改 - 但它不影响 MSSQL 数据库
Visual Studio 显示没有错误或异常?!它适用于 400 行以下的 .DBF 文件,但我有一个 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();
我怀疑这个问题真的与 Entity Framework 有关。保存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 Profiler 查看插入命令是否至少发送到 SQL 服务器或根本不发送。
提示 2:尝试查找有潜在错误的行,尝试添加 500、550、552 等...直到找到正确的行数开始导致问题。查看最后一行是否一切正常或将其替换为自定义值。
提示 3:确保在两个 catch 中都有一个断点,以防函数调用者也使用 try/catch 并且不处理错误。
我正在尝试将 Table 从 .DBF 文件导入 MSSQL 数据库... 我的代码适用于 400 行,但如果超过 400 行,SaveChanges 根本不会更新数据库。
我的代码的作用:
打开 OleDb 连接,通过 SelectCommand 将数据读入 DataTable 然后我开始 "for loop" 将行放入实体模型对象
循环完成后,我保存更改 - 但它不影响 MSSQL 数据库
Visual Studio 显示没有错误或异常?!它适用于 400 行以下的 .DBF 文件,但我有一个 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();
我怀疑这个问题真的与 Entity Framework 有关。保存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 Profiler 查看插入命令是否至少发送到 SQL 服务器或根本不发送。
提示 2:尝试查找有潜在错误的行,尝试添加 500、550、552 等...直到找到正确的行数开始导致问题。查看最后一行是否一切正常或将其替换为自定义值。
提示 3:确保在两个 catch 中都有一个断点,以防函数调用者也使用 try/catch 并且不处理错误。