问题描述
大家好,
我是C#的新手,我正在尝试制作一个将excel文件导入linq列表的应用程序,然后将其导入数据库.在表单本身上,我有2个按钮,导入"和取消"(取消"按钮适用于后台工作人员)和4个datagridview.首次单击导入按钮时,它将完美运行,所有内容均写入数据库.但是如果您取消或导入新文件,则会收到错误消息:
属性"ID"是对象键信息的一部分,不能修改.
我发现datagridview,list或objData4中的项目仍然包含上一次导入的项目,因此我有一行代码可以清除所有来源中的所有内容,包括objData,list,datagridview,datasource,但是我仍然得到那个错误.我已经在这里待了将近2个星期了.如果有人可以帮助我,那就太好了!
在此先感谢
如果您需要查看代码,请告诉我.
更新6.27.11
我取消注释以下几行,以确保在导入新文件之前清除所有内容:
itemMasterList.Clear();
objData1.Clear();
但是然后我在dmConsumption.SaveChanges();处得到了这个新错误.行:
已成功提交对数据库的更改,但是在更新对象上下文时发生了错误. ObjectContext可能处于不一致状态.内部异常消息:AcceptChanges无法继续,因为该对象的键值与ObjectStateManager中的另一个对象发生冲突.在调用AcceptChanges之前,请确保键值是唯一的.
我完全不知所措,有人可以帮我吗?
这是代码^^
Hi All,
I''m new to C# and I''m trying to make an application that will import an excel file into a linq list which in turn will import that to a database. On the form itself i have a 2 buttons, Import and Cancel (the cancel button is for the background worker) and 4 datagridview. When you click the import button for the first time, it will run perfectly, everything is written into the database. but if you cancel, or import a new file, I get an error message:
The property ''ID'' is part of the object''s key information and cannot be modified.
I figured that the items in either the datagridview, list, or the objData4 still contains the items from the previous import, so I have a line of code that will clear everything from all sources, objData, list, datagridview, datasource, but i still get that error. I''ve been at this for almost 2 weeks now. if anyone can help me it would be so amazing!!!
Thanks in Advance
if you need to see the code, please let me know.
Update 6.27.11
I un-commented out the following lines, to ensure that everything was cleared before importing a new file:
itemMasterList.Clear();
objData1.Clear();
but then i get this new error at the dmConsumption.SaveChanges(); line:
The changes to the database were committed successfully, but an error occurred while updating the object context. The ObjectContext might be in an inconsistent state. Inner exception message: AcceptChanges cannot continue because the object''s key values conflict with another object in the ObjectStateManager. Make sure that the key values are unique before calling AcceptChanges.
im totally at a loss, can someone please help me out?
heres the code ^^
<br />
<pre lang="cs">#region Excel Import Button<br />
private void button1_Click(object sender, EventArgs e)<br />
{<br />
pBarStat.Value = 0;<br />
dgView1.DataSource = null;<br />
<br />
//with this uncommented i get this error:<br />
//The property ''ID'' is part of the object''s key information and cannot be modified.<br />
//itemMasterList.Clear();<br />
//salesLineList.Clear();<br />
//itemLedgerList.Clear();<br />
//purchaseLineList.Clear();<br />
//objData4.Clear();<br />
//itemMasterList.Clear();<br />
<br />
#region Delete Statements<br />
<br />
//Sales Line<br />
foreach (var deleteMe in dmConsumption.SalesLines)<br />
{<br />
dmConsumption.SalesLines.DeleteObject(deleteMe);<br />
}<br />
<br />
<br />
//Purchase Line<br />
foreach (var deleteMe in dmConsumption.PurchaseLines)<br />
{<br />
dmConsumption.PurchaseLines.DeleteObject(deleteMe);<br />
}<br />
<br />
<br />
//Item Ledger<br />
foreach (var deleteMe in dmConsumption.ItemLedgers)<br />
{<br />
dmConsumption.ItemLedgers.DeleteObject(deleteMe);<br />
}<br />
<br />
<br />
//Item Master<br />
foreach (var deleteMe in dmConsumption.ItemMasters)<br />
{<br />
dmConsumption.ItemMasters.DeleteObject(deleteMe);<br />
}<br />
dmConsumption.SaveChanges();<br />
#endregion<br />
<br />
try<br />
{<br />
openFile.InitialDirectory = System.Environment.GetFolderPath(Environment.SpecialFolder.Desktop);<br />
openFile.Title = "Import Excel File From:";<br />
openFile.FileName = "";<br />
openFile.Filter = "Excel 97-2003|*.xls";<br />
<br />
if (openFile.ShowDialog() == DialogResult.OK)<br />
{<br />
source = openFile.FileName;<br />
if (IMWorker.IsBusy)<br />
{<br />
button1.Enabled = false;<br />
Status.Text = "Cancelling...";<br />
IMWorker.CancelAsync();<br />
}<br />
else<br />
{<br />
button1.Enabled = false;<br />
button3.Enabled = true;<br />
button3.Visible = true;<br />
Status.Text = "Processing data...";<br />
<br />
IMWorker.RunWorkerAsync();<br />
}<br />
}<br />
}<br />
catch (Exception ex)<br />
{<br />
MessageBox.Show(ex.ToString());<br />
}<br />
}<br />
#endregion</pre><br />
<br />
<br />
<pre lang="cs">#region IMWorker<br />
<br />
#region IMWorker DoWork<br />
public void IMworker_DoWork(object sender, DoWorkEventArgs e)<br />
{<br />
Thread.Sleep(1000);<br />
excelPop = ExcelConnection();<br />
objDA1.SelectCommand = excelPop[0];<br />
objDA1.Fill(objData1);<br />
increment = objData1.Tables[0].Rows.Count;<br />
<br />
pBarStat.ProgressBar.Invoke((MethodInvoker)delegate()<br />
{<br />
pBarStat.Maximum = increment;<br />
});<br />
<br />
if (dgView1.InvokeRequired)<br />
{<br />
dgView1.Invoke(new MethodInvoker(delegate { dgView1.DataSource = objData1.Tables[0].DefaultView; }));<br />
}<br />
foreach (DataRow row in objData1.Tables[0].Rows)<br />
{<br />
<br />
var IM = new itemMaster();<br />
try<br />
{<br />
IM.ID = row["No#"].ToString();<br />
}<br />
catch (Exception ex)<br />
{<br />
IM.IMError = "Error";<br />
}<br />
<br />
try<br />
{<br />
IM.name1 = row["Description"].ToString();<br />
}<br />
catch (Exception ex)<br />
{<br />
IM.IMError = "Error";<br />
}<br />
<br />
try<br />
{<br />
IM.name2 = row["Description 2"].ToString();<br />
}<br />
catch (Exception ex)<br />
{<br />
IM.IMError = "Error";<br />
}<br />
<br />
try<br />
{<br />
IM.unitPrice = double.Parse(row["Unit Cost"].ToString());<br />
}<br />
catch (Exception ex)<br />
{<br />
IM.unitPrice = 0;<br />
IM.IMError = "Error";<br />
}<br />
<br />
itemMasterList.Add(IM);<br />
pBarStat.ProgressBar.Invoke((MethodInvoker)delegate()<br />
{<br />
pBarStat.Value = increment;<br />
});<br />
//itemMasterWorker.ReportProgress(xy);<br />
}<br />
<br />
<br />
foreach (var imItem in itemMasterList)<br />
{<br />
ItemMaster newItemMaster = new ItemMaster();<br />
newItemMaster.ID = imItem.ID.ToString();<br />
newItemMaster.Generic = imItem.name1.ToString();<br />
newItemMaster.Brand = imItem.name2.ToString();<br />
newItemMaster.UnitPrice = decimal.Parse(imItem.unitPrice.ToString());<br />
<br />
dmConsumption.ItemMasters.AddObject(newItemMaster);<br />
}<br />
dmConsumption.SaveChanges();<br />
//i get this error here {"Violation of PRIMARY KEY constraint ''PK_ItemMasters''. Cannot insert duplicate key in object ''dbo.ItemMasters''.\r\nThe statement has been terminated."}<br />
}<br />
#endregion<br />
<br />
#region IMWorker Complete<br />
private void IMWorker_RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e)<br />
{<br />
if (e.Error != null)<br />
{<br />
MessageBox.Show(e.Error.Message);<br />
}<br />
<br />
button3.Visible = false;<br />
button3.Enabled = false;<br />
button1.Enabled = true;<br />
button1.Visible = true;<br />
<br />
if (e.Cancelled)<br />
{<br />
MessageBox.Show("Operation Cancelled", "Cancelled", MessageBoxButtons.OK, MessageBoxIcon.Exclamation);<br />
Status.Text = "Ready...";<br />
return;<br />
}<br />
else<br />
{<br />
Status.Text = "Operation Successfull!";<br />
pBarStat.Value = increment;<br />
}<br />
}<br />
#endregion</pre><br />
<br />
推荐答案
for (int i = 0; i < itemMasterList.Rows.Count; i++)
{
if (itemMasterList.Rows[i]row["No#"].ToString() == string.Empty)
{
itemMasterList.Rows[i].Delete();
}
}
itemMasterList.AcceptChanges();
希望这会有所帮助..
问候,
Algem
Hope this could help..
Regards,
Algem
这篇关于使用linq列表进行数据库操作的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持!