WinForm+Access主从表绑定修改主表数据出错(而Sqlserver不会)
2008-12-11 14:45
876 查看
各位好,我用 C# WinForm+Access 做单据式的界面,绑定主从表时子表操作都没问题,但一修改主表,再保存就出错,提示[由于表 'BillDetail' 中了包含相关记录,不能删除或改变该记录。]。其实我并没修改主表的主键或其他有关联的数据,只是修改了一些备注的文字信息也是如此,不知何故?
我尝试换成SqlServer数据库,结构都一样,却没有此问题,不知何故?
千万别告诉我,将关系删除,我相信是有关系的问题,但不是关系的错。
图一:Access数据库结构:
![](http://p.blog.csdn.net/images/p_blog_csdn_net/tangzhongxin/EntryImages/20081211/20081211113347640.jpg)
图二:Sqlserver数据库结构
![](http://p.blog.csdn.net/images/p_blog_csdn_net/tangzhongxin/EntryImages/20081211/20081211113705000.jpg)
图三:WinForm界面与控件
![](http://p.blog.csdn.net/images/p_blog_csdn_net/tangzhongxin/EntryImages/20081211/20081211123320937.jpg)
以下是SqlSever的建库脚本,Access的结构也一样,WinForm中基本没什么自己写的代码,都是生成的。
if exists (select * from sysobjects where id = OBJECT_ID('[Products]') and OBJECTPROPERTY(id,
'IsUserTable') = 1)
DROP TABLE [Products]
GO
CREATE TABLE [Products] (
[Pkid] [int] IDENTITY (1, 1) NOT NULL ,
[ProductCode] [char] (8) COLLATE Chinese_PRC_CI_AS NOT NULL ,
[ProductName] [nvarchar] (50) COLLATE Chinese_PRC_CI_AS NOT NULL ,
CONSTRAINT [PK_Products] PRIMARY KEY CLUSTERED
(
[Pkid]
) ON [PRIMARY]
) ON [PRIMARY]
GO
SET IDENTITY_INSERT [Products] ON
INSERT [Products] ([Pkid],[ProductCode],[ProductName]) VALUES ( 2,'F0501200','绿茶洗发水')
INSERT [Products] ([Pkid],[ProductCode],[ProductName]) VALUES ( 3,'M0602600','香草沐浴露')
INSERT [Products] ([Pkid],[ProductCode],[ProductName]) VALUES ( 4,'C0518500','芦荟洗手液')
SET IDENTITY_INSERT [Products] OFF
GO
--------------------
if exists (select * from sysobjects where id = OBJECT_ID('[Bill]') and OBJECTPROPERTY(id,
'IsUserTable') = 1)
DROP TABLE [Bill]
GO
CREATE TABLE [Bill] (
[Guid] [uniqueidentifier] NOT NULL ,
[BillDateTime] [datetime] NOT NULL ,
[Person] [nvarchar] (50) COLLATE Chinese_PRC_CI_AS NOT NULL ,
CONSTRAINT [PK_Bill] PRIMARY KEY CLUSTERED
(
[Guid]
) ON [PRIMARY]
) ON [PRIMARY]
GO
INSERT [Bill] ([Guid],[BillDateTime],[Person]) VALUES ( 'b0caaa95-339c-4de7-b1ad-
1b0fadf78103','2008-12-02 23:55:00','唐古拉山')
INSERT [Bill] ([Guid],[BillDateTime],[Person]) VALUES ( '23704e6a-eca6-4622-9fe1-
caa7a3aa8eca','2007-09-24 8:23:00','李飞')
GO
--------------------
if exists (select * from sysobjects where id = OBJECT_ID('[BillDetail]') and OBJECTPROPERTY(id,
'IsUserTable') = 1)
DROP TABLE [BillDetail]
GO
CREATE TABLE [BillDetail] (
[Guid] [uniqueidentifier] NOT NULL ,
[LineNum] [int] NOT NULL ,
[ProductId] [int] NOT NULL ,
[Quantity] [decimal](18, 4) NOT NULL ,
[Price] [decimal](18, 4) NOT NULL ,
[Remark] [nvarchar] (50) COLLATE Chinese_PRC_CI_AS NULL ,
CONSTRAINT [PK_BillDetail] PRIMARY KEY CLUSTERED
(
[Guid],
[LineNum]
) ON [PRIMARY] ,
CONSTRAINT [FK_BillDetail_Bill] FOREIGN KEY
(
[Guid]
) REFERENCES [Bill] (
[Guid]
),
CONSTRAINT [FK_BillDetail_Products] FOREIGN KEY
(
[ProductId]
) REFERENCES [Products] (
[Pkid]
)
) ON [PRIMARY]
GO
INSERT [BillDetail] ([Guid],[LineNum],[ProductId],[Quantity],[Price],[Remark]) VALUES (
'b0caaa95-339c-4de7-b1ad-1b0fadf78103',1,2,23.5000,66.5800,'单独发货')
INSERT [BillDetail] ([Guid],[LineNum],[ProductId],[Quantity],[Price]) VALUES ( 'b0caaa95-339c-
4de7-b1ad-1b0fadf78103',2,3,33.5000,45.5800)
INSERT [BillDetail] ([Guid],[LineNum],[ProductId],[Quantity],[Price]) VALUES ( 'b0caaa95-339c-
4de7-b1ad-1b0fadf78103',3,4,24.0000,50.0000)
INSERT [BillDetail] ([Guid],[LineNum],[ProductId],[Quantity],[Price]) VALUES ( '23704e6a-eca6-
4622-9fe1-caa7a3aa8eca',1,4,44.0000,345.0000)
INSERT [BillDetail] ([Guid],[LineNum],[ProductId],[Quantity],[Price],[Remark]) VALUES (
'23704e6a-eca6-4622-9fe1-caa7a3aa8eca',2,3,52.0000,56.7800,'补货')
INSERT [BillDetail] ([Guid],[LineNum],[ProductId],[Quantity],[Price]) VALUES ( '23704e6a-eca6-
4622-9fe1-caa7a3aa8eca',3,2,23.5000,66.8000)
GO
呵呵,自己解决了。
观察了“TableAdapter”的“UpdateCommand”的SQL语句,哇,一大把:
UPDATE Bill
SET [Guid] = ?, BillDateTime = ?, Person = ?
WHERE ([Guid] = ?) AND (? = 1) AND (BillDateTime IS NULL) AND (? = 1) AND
(Person IS NULL) OR
([Guid] = ?) AND (BillDateTime = ?) AND (? = 1) AND (Person IS NULL) OR
([Guid] = ?) AND (? = 1) AND (BillDateTime IS NULL) AND (Person = ?) OR
([Guid] = ?) AND (BillDateTime = ?) AND (Person = ?)
去除它的“使用开放式并发”后:
UPDATE Bill
SET [Guid] = ?, BillDateTime = ?, Person = ?
WHERE ([Guid] = ?)
现在好看了……哇!为何要Update Guid字段,它是主键,不会变的!好,改掉它的!
UPDATE Bill
SET BillDateTime = ?, Person = ?
WHERE ([Guid] = ?)
现在没问题了罗。
心得:
(1)、微软的IDE是方便快捷,但在没明白它都给你干了些啥之前,最好别用它。
(2)、搞不懂MS ACCESS,Update 自己=自己这样的语句也是导致了修改事件?而SQL Server则不会。
我尝试换成SqlServer数据库,结构都一样,却没有此问题,不知何故?
千万别告诉我,将关系删除,我相信是有关系的问题,但不是关系的错。
图一:Access数据库结构:
![](http://p.blog.csdn.net/images/p_blog_csdn_net/tangzhongxin/EntryImages/20081211/20081211113347640.jpg)
图二:Sqlserver数据库结构
![](http://p.blog.csdn.net/images/p_blog_csdn_net/tangzhongxin/EntryImages/20081211/20081211113705000.jpg)
图三:WinForm界面与控件
![](http://p.blog.csdn.net/images/p_blog_csdn_net/tangzhongxin/EntryImages/20081211/20081211123320937.jpg)
以下是SqlSever的建库脚本,Access的结构也一样,WinForm中基本没什么自己写的代码,都是生成的。
if exists (select * from sysobjects where id = OBJECT_ID('[Products]') and OBJECTPROPERTY(id,
'IsUserTable') = 1)
DROP TABLE [Products]
GO
CREATE TABLE [Products] (
[Pkid] [int] IDENTITY (1, 1) NOT NULL ,
[ProductCode] [char] (8) COLLATE Chinese_PRC_CI_AS NOT NULL ,
[ProductName] [nvarchar] (50) COLLATE Chinese_PRC_CI_AS NOT NULL ,
CONSTRAINT [PK_Products] PRIMARY KEY CLUSTERED
(
[Pkid]
) ON [PRIMARY]
) ON [PRIMARY]
GO
SET IDENTITY_INSERT [Products] ON
INSERT [Products] ([Pkid],[ProductCode],[ProductName]) VALUES ( 2,'F0501200','绿茶洗发水')
INSERT [Products] ([Pkid],[ProductCode],[ProductName]) VALUES ( 3,'M0602600','香草沐浴露')
INSERT [Products] ([Pkid],[ProductCode],[ProductName]) VALUES ( 4,'C0518500','芦荟洗手液')
SET IDENTITY_INSERT [Products] OFF
GO
--------------------
if exists (select * from sysobjects where id = OBJECT_ID('[Bill]') and OBJECTPROPERTY(id,
'IsUserTable') = 1)
DROP TABLE [Bill]
GO
CREATE TABLE [Bill] (
[Guid] [uniqueidentifier] NOT NULL ,
[BillDateTime] [datetime] NOT NULL ,
[Person] [nvarchar] (50) COLLATE Chinese_PRC_CI_AS NOT NULL ,
CONSTRAINT [PK_Bill] PRIMARY KEY CLUSTERED
(
[Guid]
) ON [PRIMARY]
) ON [PRIMARY]
GO
INSERT [Bill] ([Guid],[BillDateTime],[Person]) VALUES ( 'b0caaa95-339c-4de7-b1ad-
1b0fadf78103','2008-12-02 23:55:00','唐古拉山')
INSERT [Bill] ([Guid],[BillDateTime],[Person]) VALUES ( '23704e6a-eca6-4622-9fe1-
caa7a3aa8eca','2007-09-24 8:23:00','李飞')
GO
--------------------
if exists (select * from sysobjects where id = OBJECT_ID('[BillDetail]') and OBJECTPROPERTY(id,
'IsUserTable') = 1)
DROP TABLE [BillDetail]
GO
CREATE TABLE [BillDetail] (
[Guid] [uniqueidentifier] NOT NULL ,
[LineNum] [int] NOT NULL ,
[ProductId] [int] NOT NULL ,
[Quantity] [decimal](18, 4) NOT NULL ,
[Price] [decimal](18, 4) NOT NULL ,
[Remark] [nvarchar] (50) COLLATE Chinese_PRC_CI_AS NULL ,
CONSTRAINT [PK_BillDetail] PRIMARY KEY CLUSTERED
(
[Guid],
[LineNum]
) ON [PRIMARY] ,
CONSTRAINT [FK_BillDetail_Bill] FOREIGN KEY
(
[Guid]
) REFERENCES [Bill] (
[Guid]
),
CONSTRAINT [FK_BillDetail_Products] FOREIGN KEY
(
[ProductId]
) REFERENCES [Products] (
[Pkid]
)
) ON [PRIMARY]
GO
INSERT [BillDetail] ([Guid],[LineNum],[ProductId],[Quantity],[Price],[Remark]) VALUES (
'b0caaa95-339c-4de7-b1ad-1b0fadf78103',1,2,23.5000,66.5800,'单独发货')
INSERT [BillDetail] ([Guid],[LineNum],[ProductId],[Quantity],[Price]) VALUES ( 'b0caaa95-339c-
4de7-b1ad-1b0fadf78103',2,3,33.5000,45.5800)
INSERT [BillDetail] ([Guid],[LineNum],[ProductId],[Quantity],[Price]) VALUES ( 'b0caaa95-339c-
4de7-b1ad-1b0fadf78103',3,4,24.0000,50.0000)
INSERT [BillDetail] ([Guid],[LineNum],[ProductId],[Quantity],[Price]) VALUES ( '23704e6a-eca6-
4622-9fe1-caa7a3aa8eca',1,4,44.0000,345.0000)
INSERT [BillDetail] ([Guid],[LineNum],[ProductId],[Quantity],[Price],[Remark]) VALUES (
'23704e6a-eca6-4622-9fe1-caa7a3aa8eca',2,3,52.0000,56.7800,'补货')
INSERT [BillDetail] ([Guid],[LineNum],[ProductId],[Quantity],[Price]) VALUES ( '23704e6a-eca6-
4622-9fe1-caa7a3aa8eca',3,2,23.5000,66.8000)
GO
呵呵,自己解决了。
观察了“TableAdapter”的“UpdateCommand”的SQL语句,哇,一大把:
UPDATE Bill
SET [Guid] = ?, BillDateTime = ?, Person = ?
WHERE ([Guid] = ?) AND (? = 1) AND (BillDateTime IS NULL) AND (? = 1) AND
(Person IS NULL) OR
([Guid] = ?) AND (BillDateTime = ?) AND (? = 1) AND (Person IS NULL) OR
([Guid] = ?) AND (? = 1) AND (BillDateTime IS NULL) AND (Person = ?) OR
([Guid] = ?) AND (BillDateTime = ?) AND (Person = ?)
去除它的“使用开放式并发”后:
UPDATE Bill
SET [Guid] = ?, BillDateTime = ?, Person = ?
WHERE ([Guid] = ?)
现在好看了……哇!为何要Update Guid字段,它是主键,不会变的!好,改掉它的!
UPDATE Bill
SET BillDateTime = ?, Person = ?
WHERE ([Guid] = ?)
现在没问题了罗。
心得:
(1)、微软的IDE是方便快捷,但在没明白它都给你干了些啥之前,最好别用它。
(2)、搞不懂MS ACCESS,Update 自己=自己这样的语句也是导致了修改事件?而SQL Server则不会。
相关文章推荐
- 【Sqlserver】修改数据库表中的数据:对缺失的数据根据已有的数据进行修补
- 修改数据时出错
- C#中DataGridView绑定了DataTable后,通过代码修改DataGridView中的数据,总有一行(被修改过并被用户选中的行集合中索引为0的行)不能被UpDate回数据库的问题和解决办法
- SQLServer 修改某条数据 不使用update
- oracle plsql修改数据时ORA-01480: STR 绑定值的结尾 Null 字符缺失 的错误解决办法。
- Windows 8 开发系列- 自定义Gridview 绑定列表数据时出错
- 腾讯云图片鉴黄集成到C# SQL Server 怎么在分页获取数据的同时获取到总记录数 sqlserver 操作数据表语句模板 .NET MVC后台发送post请求 百度api查询多个地址的经纬度的问题 try{}里有一个 return 语句,那么紧跟在这个 try 后的 finally {}里的 code 会 不会被执行,什么时候被执行,在 return 前还是后? js获取某个日期
- sqlserver数据导入mysql八: 把sqlserver中的存储过程注释后创建到mysql中(留着人工修改)
- bootstrapTable 数据绑定和修改列
- Vue关于数据绑定出错解决办法
- SQLSERVER创建该存储过程时不会出错,但是执行存储过程时报错
- C#数据库SQLServer查询、修改数据
- sqlserver中将数据为12-May 修改为2012-05形式
- 在Hibernate中配置Hilo进行数据绑定测试时出错:org.hibernate.MappingException: Could not instantiate id generator
- sqlserver 修改数据库表所有者
- oracle导出数据显示出现ora-00109或者LRM-00109出错修改办法
- 绑定数据 获取值,修改,新增 。记录日志及 获取拼音码及键 回车换行
- 数据连接,绑定,修改,更新,一条龙,全手动!
- SliverLight-Binding之动态修改和数据绑定
- Amcharts绑定新数据后不会刷新图表的解决办法