这是我要做的事情的简要说明:在SQL端有一个全局临时表,我可以在C#wpf中从中选择它,并将其列在名为“ DataGridIns”的dataGrid中。我想通过chkBox选择一些行,然后使用StoredProcedure将其插入SQl中的表中。
因此,当我单击以发送SendRow时,它开始如下:
HoEntities database = new HoEntities(); //using Entity FrameWork
try
{
for (int i = 0; i < DataGridIns.Items.Count - 1; i++)
{
mChkBox = DataGridIns.Columns[0].GetCellContent(DataGridIns.Items[i]) as CheckBox;
if (mChkBox.IsChecked == true)
{
var dataitem = DataGridIns.Items[2].ToString();
_nullChckBox++;
var dateSelect = DataGridIns.Columns[1].GetCellContent(DataGridIns.Items[i]) as TextBlock;
var mainNameTBk = DataGridIns.Columns[2].GetCellContent(DataGridIns.Items[i]) as TextBlock;
var chinCodeTBk = DataGridIns.Columns[3].GetCellContent(DataGridIns.Items[i]) as TextBlock;
var chinNameTBk = DataGridIns.Columns[4].GetCellContent(DataGridIns.Items[i]) as TextBlock;
var mainCodeTBk = DataGridIns.Columns[6].GetCellContent(DataGridIns.Items[i]) as TextBlock;
var iodDescTBk = DataGridIns.Columns[7].GetCellContent(DataGridIns.Items[i]) as TextBlock;
}
database.sp_Ins_Main // using Stored Procedure insert in to mainTable
(
mainCodeTBk.Text.Trim(),
mainNameTBk.Text.Trim(),
Convert.ToInt32(chinCodeTBk.Text.Trim()),
chinNameTBk.Text.Trim(),
iodDescTBk.Text.Trim(),
dateSelect.Text.Trim()
);
database.SaveChanges();
}
}
catch (Exception ex)
{
MessageBox.Show(ex.ToString());
}
当我设置BreakPoint并逐步到达它时,到达
database.sp_Ins_Main
和如下所示从实体框架中的DataModel跳转到我的DataModel.Context.cs:
public virtual int sp_Ins_Main(string mainCode, string mainName,
Nullable<int> chinCode, string chinName,
string iodDesc, string date)
{
var mainCodeParameter = mainCode != null ?
new ObjectParameter("MainCode", mainCode) :
new ObjectParameter("MainCode", typeof(string));
var mainNameParameter = mainName != null ?
new ObjectParameter("MainName", mainName) :
new ObjectParameter("MainName", typeof(string));
var chinCodeParameter = chinCode.HasValue ?
new ObjectParameter("chinCode", chinCode) :
new ObjectParameter("chinCode", typeof(int));
var chinNameParameter = chinName != null ?
new ObjectParameter("chinName", chinName) :
new ObjectParameter("chinName", typeof(string));
var iodDescParameter = iodDesc != null ?
new ObjectParameter("iodDesc", iodDesc) :
new ObjectParameter("iodDesc", typeof(string));
var dateParameter = date != null ?
new ObjectParameter("Date", date) :
new ObjectParameter("Date", typeof(string));
return ((IObjectContextAdapter)this).ObjectContext.ExecuteFunction("sp_Ins_Main", mainCodeParameter, mainNameParameter, chinCodeParameter, chinNameParameter, iodDescParameter, dateParameter);
}
并且从Return((IObjectContextAdapter)this)行开始……我得到了我在标题问题中所说的错误。
System.Data.SqlClient.SqlError:不允许新事务,因为会话中正在运行其他线程。
我从Temp Table中选择的方式错误,然后坐在datagrid select中,而我只想在Sql中插入表中?如何解决呢?
这里是问题:
https://stackoverflow.com/a/6118275/421195
我遇到了同样的问题,但情况有所不同。
我在列表框中有一个项目列表。用户可以单击一个项目并选择删除,但我正在使用存储的proc来删除该项目,因为删除项目涉及很多逻辑。
当我调用存储的过程时,删除工作正常,但以后再调用SaveChanges会导致错误。
我的解决方案是在EF之外调用存储的proc,这很好用。出于某种原因,当我使用EF的处理方式调用storage> proc时,会留下一些空白。]