关联数据表删除总报异常? 数据库C# 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 主从关系是这样的:AllocIn为配货单表,有主键AllocInIDAllocInDet为配货明细表,主键AllocInDetID和一个外键AllocInID至于主从关系,我试过了,先删除主表AllocIn, 再删除这个Id下面的所有AllocInDet表项,代码如下,也是不可以。DataSet ds1; //TSM.Model.CK_AllocInDet modelCK_AllocInDet = m_bllCK_AllocInDet.GetModel(id); //string searchText = modelCK_AllocInDet.CK_AllocInID.ToString(); string strWhere = "CK_AllocInID = " + id; ds1 = m_bllCK_AllocInDet.GetList(strWhere); ds1.Tables[0].Clear(); m_bllCK_AllocIn.Delete(id);报错如下,和前次一样,这是完整的错误信息窗口。 System.Data.SqlClient.SqlException: DELETE 语句与 REFERENCE 约束"FK__CK_AllocI__CK_Al__5B0E7E4A"冲突。该冲突发生于数据库"testDP",表"dbo.CK_AllocInDet", column 'CK_AllocInID'。语句已终止。在 Maticsoft.DBUtility.DbHelperSQL.ExecuteSql(String SQLString, SqlParameter[] cmdParms) 位置 E:\testDP\DBUtility\DbHelperSQL.cs:行号 568在 TSM.DAL.CK_AllocIn.Delete(Int32 CK_AllocInID) 位置 E:\testDP\DAL\CK_AllocIn.cs:行号 112在 TSM.BLL.CK_AllocIn.Delete(Int32 CK_AllocInID) 位置 E:\testDP\BLL\CK_AllocIn.cs:行号 56在 FineUIDemo.AllocIn.Grid1_RowCommand(Object sender, GridCommandEventArgs e) 位置 E:\testDP\EmptyProjectNet20\CK_AllocIn.aspx.cs:行号 139恳求各位大侠有以教我,拜谢了。。 试过了,也是不行。先删除主表Alloc配送单表,再删除AllocDet表。一样报错呢 数据库早先在定义时,考虑的是ON UPDATE CASCADE 即便主表没了,从表还可以查得到。现在看来,没得法了 我最初贴的源码就是这样的,先删从表AllocDet,再是主表,不行呢。 protected void Grid1_RowCommand(object sender, GridCommandEventArgs e) { int id = Convert.ToInt32(Grid1.DataKeys[e.RowIndex][0]); if (e.CommandName == "Delete") { try { /* 这里删除时,先删除从表AllocInDet明细表的内容 */ DataSet ds1; string strWhere = "CK_AllocInID = " + id; ds1 = m_bllCK_AllocInDet.GetList(strWhere); ds1.Tables[0].Clear();最后一行,那样删除表,有没有问题呢??????? 这样根本没有删除表,要用delete方法去删 是的,我也发现了,只是清除了ds中的数据,而相关的数据库并没有变化问题是,怎么根据ds来删除数据库表呢,删除接口要求输入的是主键,请以教我,谢谢先。 以下是我做的尝试,仍然不行。求教了。 /* 这里删除时,先删除从表AllocInDet明细表的内容 */ DataSet ds1; string strWhere = "CK_AllocInID = " + id; ds1 = m_bllCK_AllocInDet.GetList(strWhere); int cnt = ds1.Tables[0].Rows.Count; SqlDataAdapter myDA = new SqlDataAdapter(); /* for (int i = 0; i < cnt; i++) { // 想逐行删除,又不知怎么从ds中获取每行的主键 ds1.Tables[0].Rows[i]. } */ try { myDA.Update(ds1.Tables[0]); } catch (Exception ex) { this.Response.Write(ex.Message); } 这样也试过了,我了了去个。。搞不定,看得数据库得重来 DataSet ds1; string strWhere = "CK_AllocInID = " + id; ds1 = m_bllCK_AllocInDet.GetList(strWhere); int cnt = ds1.Tables[0].Rows.Count; for (int i = 0; i < cnt; i++) { DataRow deleteRow = ds1.Tables[0].Rows[i]; deleteRow.Delete(); } SqlDataAdapter myDA = new SqlDataAdapter(); try { myDA.Update(ds1.Tables[0]); } catch (Exception ex) { this.Response.Write(ex.Message); } 给你支个招,你绑定时候多绑定一列隐藏的,然后绑定主键,就OK了这是主表AllocIn的后台实现,明细表AllocInDet表是通过AllocIn表的AllocID(在明细表中为外键)查到的一个数据集(如上代码),怎么绑定得了明细表的主键呢, 我也想直接使用BLL层接口直接删除数据库表,可是不知道如何根据数据集拿到每行的主键呢,BLL层接口删除数据表项如下:id为主键m_bllCK_AllocIn.Delete(id); 给你支个招,你绑定时候多绑定一列隐藏的,然后绑定主键,就OK了这是主表AllocIn的后台实现,明细表AllocInDet表是通过AllocIn表的AllocID(在明细表中为外键)查到的一个数据集(如上代码),怎么绑定得了明细表的主键呢,噢,总算看明白了,你查询的时候可以查出来主键,没错吧,然后在数据集中这样去拿:string ID= ds1.Tables[0].Rows[i]["主键列"].ToString();这样就OK了 关于C#调用 win32的DLL,如何调用指针呢? C# 序列化问题 请教,C#中调用C++类的函数时,参数int*如何表示 双击datagridview一行如何弹出一个窗口,显示这行的详细信息? 关于条码打印问题 不会吧 List<string>赋值传值还是地址 如何用C#产生一个文档,然后自动向里面写东西? 有没有好点的C#编辑器? except Vs .net 各位大佬求帮助 Datatable排序问题 请教一下,如何用C#判断调用的cmd程序执行完成?
AllocIn为配货单表,有主键AllocInID
AllocInDet为配货明细表,主键AllocInDetID和一个外键AllocInID至于主从关系,我试过了,先删除主表AllocIn, 再删除这个Id下面的所有AllocInDet表项,代码如下,也是不可以。
DataSet ds1;
//TSM.Model.CK_AllocInDet modelCK_AllocInDet = m_bllCK_AllocInDet.GetModel(id);
//string searchText = modelCK_AllocInDet.CK_AllocInID.ToString();
string strWhere = "CK_AllocInID = " + id;
ds1 = m_bllCK_AllocInDet.GetList(strWhere);
ds1.Tables[0].Clear();
m_bllCK_AllocIn.Delete(id);报错如下,和前次一样,这是完整的错误信息窗口。
System.Data.SqlClient.SqlException: DELETE 语句与 REFERENCE 约束"FK__CK_AllocI__CK_Al__5B0E7E4A"冲突。该冲突发生于数据库"testDP",表"dbo.CK_AllocInDet", column 'CK_AllocInID'。
语句已终止。
在 Maticsoft.DBUtility.DbHelperSQL.ExecuteSql(String SQLString, SqlParameter[] cmdParms) 位置 E:\testDP\DBUtility\DbHelperSQL.cs:行号 568
在 TSM.DAL.CK_AllocIn.Delete(Int32 CK_AllocInID) 位置 E:\testDP\DAL\CK_AllocIn.cs:行号 112
在 TSM.BLL.CK_AllocIn.Delete(Int32 CK_AllocInID) 位置 E:\testDP\BLL\CK_AllocIn.cs:行号 56
在 FineUIDemo.AllocIn.Grid1_RowCommand(Object sender, GridCommandEventArgs e) 位置 E:\testDP\EmptyProjectNet20\CK_AllocIn.aspx.cs:行号 139恳求各位大侠有以教我,拜谢了。。
试过了,也是不行。先删除主表Alloc配送单表,再删除AllocDet表。一样报错呢
{
int id = Convert.ToInt32(Grid1.DataKeys[e.RowIndex][0]); if (e.CommandName == "Delete")
{ try
{
/* 这里删除时,先删除从表AllocInDet明细表的内容 */
DataSet ds1;
string strWhere = "CK_AllocInID = " + id; ds1 = m_bllCK_AllocInDet.GetList(strWhere);
ds1.Tables[0].Clear();最后一行,那样删除表,有没有问题呢???????
是的,我也发现了,只是清除了ds中的数据,而相关的数据库并没有变化问题是,怎么根据ds来删除数据库表呢,删除接口要求输入的是主键,请以教我,谢谢先。
/* 这里删除时,先删除从表AllocInDet明细表的内容 */
DataSet ds1;
string strWhere = "CK_AllocInID = " + id; ds1 = m_bllCK_AllocInDet.GetList(strWhere);
int cnt = ds1.Tables[0].Rows.Count;
SqlDataAdapter myDA = new SqlDataAdapter();
/*
for (int i = 0; i < cnt; i++)
{ // 想逐行删除,又不知怎么从ds中获取每行的主键
ds1.Tables[0].Rows[i].
}
*/
try
{
myDA.Update(ds1.Tables[0]);
}
catch (Exception ex)
{
this.Response.Write(ex.Message);
}
DataSet ds1;
string strWhere = "CK_AllocInID = " + id; ds1 = m_bllCK_AllocInDet.GetList(strWhere);
int cnt = ds1.Tables[0].Rows.Count;
for (int i = 0; i < cnt; i++)
{
DataRow deleteRow = ds1.Tables[0].Rows[i];
deleteRow.Delete();
} SqlDataAdapter myDA = new SqlDataAdapter();
try
{
myDA.Update(ds1.Tables[0]);
}
catch (Exception ex)
{
this.Response.Write(ex.Message);
}
我也想直接使用BLL层接口直接删除数据库表,可是不知道如何根据数据集拿到每行的主键呢,
BLL层接口删除数据表项如下:id为主键
m_bllCK_AllocIn.Delete(id);
噢,总算看明白了,你查询的时候可以查出来主键,没错吧,然后在数据集中这样去拿:
string ID= ds1.Tables[0].Rows[i]["主键列"].ToString();
这样就OK了