这是一个多表连接以及如何在ASPNET中回存空值到外键字段的问题。

这是一个多表连接以及如何在ASPNET中回存空值到外键字段的问题。

数据库的背景是这样的:

设备表  A,外键:supply_id (供应商序号) 数据类型:int  , 允许空

供应商表B,主键:supply_id(供应商序号) 数据类型:int  , 作为标识种子

1、  由于 不是每个设备都有供应商的记录,所以有A中多条记录的supply_id都为NULL

2、  由于B中的supply_id 是作为从1开始的标识种子,为了对应关系,保持数据的完整性,将A.supply_id 的内容是大于等于1的整数。

我使用了AB的左外连接。

   这是我上午讨论的结果,似乎在显示数据方面测试通过了。但是下午我用ASPNET访问设备表,对其进行操作就出现了问题。

   我用DropDownList 控件来绑定供货商表的,

     /*绑定供应商DPDOWNLIST*/

                   string sup_sql="select supply_id,supply_name from supply";

                   mysql.runload(sup_sql);//mysql是一个公共类,集合了数据库的连接和访问

                   DropDownList2.Items.Add(new ListItem("","0"));//下拉菜单的第一项为空,为了显示那些无供应商的设备。Text为空,VALUE为O

                   while(mysql.MyDataReader.Read())

                        DropDownList2.Items.Add(new ListItem(mysql.MyDataReader[1].ToString(),mysql.MyDataReader[0].ToString()) );//供货商表的绑定,刚好可以实现序号(SUPPLY_ID)和供应商名(supply_name)一个作SELECTINDEX,以及VALUE值,一个作TEXT值。

 

然后我连接数据库,开始对数据进行访问,没有问题。

  If(mysql.mydatareader[suppy_id]==“”)

  DropDownList1.SelectIndex=0;

Else

{

  DropDownList1.SelectIndex= Convert.ToInt(mysql.mydatareader[suppy_id].ToString())

}

 

问题出在修改数据并回存回数据库中!

我修改供应商是更换   DropDownList1.SelectIndex的值,所以回存的SQL语句为

 update machine set supply_id=DropDownList1.SelectIndex

当我选择空值的时候,(无供应商),DropDownList1.SelectIndex=0,0被回存到了原有A.supply_ID中,当时我们规定为了数据完整,这个字段的内容是从1开始的,这就造成了与读数据期间取数的矛盾。

解决办法:

将数据库中所有的外键为空值的地方改成0, DropDownList绑定supply表的时候已经腾出了一个为Slectindex=0,VALUE =0的空位,与这里无关,但是在数据库访问的时候,要把

If(mysql.mydatareader[suppy_id]==“”)

  DropDownList1.SelectIndex=0;

Else

{

  DropDownList1.SelectIndex= Convert.ToInt(mysql.mydatareader[suppy_id].ToString())

}

这一大段 改成

DropDownList1.SelectIndex= Convert.ToInt(mysql.mydatareader[suppy_id].ToString());

之前的外连接不变,经过测试可以解决数据一致性和完整性
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值