这是一个多表连接以及如何在ASPNET中回存空值到外键字段的问题。
数据库的背景是这样的:
设备表 A,外键:supply_id (供应商序号) 数据类型:int , 允许空
供应商表B,主键:supply_id(供应商序号) 数据类型:int , 作为标识种子
1、 由于 不是每个设备都有供应商的记录,所以有A中多条记录的supply_id都为NULL,
2、 由于B中的supply_id 是作为从1开始的标识种子,为了对应关系,保持数据的完整性,将A.supply_id 的内容是大于等于1的整数。
我使用了A对B的左外连接。
这是我上午讨论的结果,似乎在显示数据方面测试通过了。但是下午我用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());
之前的外连接不变,经过测试可以解决数据一致性和完整性