(转)MDB链接SQLSERVER导致写入冲突,头疼的问题,原来错在这里!!

完整提示为:
写入冲突
                        从您开始编辑此记录以来,该记录已被另一用户更改。如果现在
                        保存记录,将会覆盖其他用户所做的更改。                      

将更改内容复制到剪贴板上可以让您看到其他用户输入的值,当
                        您决定要修改时,可再将剪贴板上的更改内容粘贴回来。

图片如下:
按此在新窗口浏览图片

而且只要用 ACCESS 界面修改就会永远有这个提示,永远无法解决。
            表的结构为


/****** Object:  Table [dbo].[cg_LimitDetail]    Script Date: 2008-9-21 19:59:34 ******/
                        if exists (select * from dbo.sysobjects where id = object_id(N'[dbo].[cg_LimitDetail]') and OBJECTPROPERTY(id, N'IsUserTable') = 1)
                        drop table [dbo].[cg_LimitDetail]
                        GO                       

/****** Object:  Table [dbo].[cg_LimitDetail]    Script Date: 2008-9-21 19:59:34 ******/
                        Create TABLE [dbo].[cg_LimitDetail] (
                            [id] [int] IDENTITY (1, 1) NOT NULL ,
                            [LimitGroupId] [int] NULL ,
                            [LimitConst] [nvarchar] (50) COLLATE Chinese_PRC_CI_AS NULL ,
                            [LimitValue] [bit] NULL
                        ) ON [PRIMARY]
                        GO

Alter TABLE [dbo].[cg_LimitDetail] WITH NOCHECK ADD
                            CONSTRAINT [PK_cg_LimitDetail] PRIMARY KEY  CLUSTERED
                            (
                                [id]
                            )  ON [PRIMARY]
                        GO


后来又发现了如果在 SQL SERVER 中定义字段为“货币”,然后随便输入一些值,在 ODBC 链接到 ACCESS 以后也无法正常显示。软件版本为 WINDOWS 2003 SP2 英文版+SQL SERVER 2000 英文版+ACCESS 2003简体中文版

回答:

 一开始百思不得其解,但是仔细一看发现,其中一个字段是 bit(SQL Server) 也就是 ACCESS 的 Yes/No。这个数据类型在 ACCESS 与 SQL SERVER 中是不一样的。ACCESS 中 TRUE 是 -1 ,而 SQL SERVER 中 TRUE 是1,需要转换的。问题就出在这里,我实际在修改字段时并没有指定值,但是 ACCESS 自动将其设置为 0 ,也就是 FALSE 。但是用 SQL SERVER 事件探查器查出来可就不同了:           

exec sp_executesql N'Update "dbo"."cg_LimitDetail" SET "LimitConst"=@P1  Where "id" = @P2 AND "LimitGroupId" = @P3 AND "LimitConst" IS NULL AND "LimitValue" = @P4', N'@P1 nvarchar(50),@P2 int,@P3 int,@P4 bit', N'33', 3, 2, 0

大家看到,最后一个参数 @P4 竟然是 0 ,但是实际上在 SQL SERVER 中是 Null 。

终于找到问题了,要解决这个问题可以直接在 SQL SERVER 设计表时直接指定 BIT 字段的默认值为 0。
ACCESS中与SQL SERVER中数据类型不同,有些数据类型在链接表时ACCESS无法自动识别进行转换,也不提示有用的错误信息,所以应该算是个BUG吧。在这种环境下尽量使用不要转换的数据类型,比如长整、双精度之类的数据类型。

微软MVP huanghai先生在直接用ADO绑定窗体数据源时也遇到上述问题,且即使定义默认值也无法解决,最终解决方案是使用长整。

<think>好的,用户想将单机软件的MDB文件数据迁移到数据库中。首先,我需要确定MDB文件通常是指Microsoft Access数据库文件,所以用户的问题应该是如何将Access数据库的数据导入到其他数据库系统中,比如SQL Server、MySQL或者MongoDB等。 接下来,我要考虑用户可能的场景。用户提到的是单机软件,可能他们现在有一个基于Access的应用程序,现在想要迁移到更强大的数据库系统,比如SQL Server或者云数据库,以支持更大的数据量或更好的性能。用户可能对数据库操作不太熟悉,需要详细的步骤和工具推荐。 根据引用[1],在将数据导入到MSSQL时,需要注意保留字的问题,可能需要修改字段名或添加中括号。所以在指导用户使用SQL Server导入导出向导时,要提醒他们注意这一点,避免导入失败。 另外,引用[3]提到MongoDB的高性能和GridFS,如果用户考虑迁移到NoSQL数据库,可能需要不同的工具和方法,比如使用MongoDB的导入工具或者自己编写脚本。但用户的问题可能更倾向于关系型数据库,所以可能需要先确认目标数据库类型,但用户没有明确说明,所以应该覆盖常见的情况。 用户可能需要多种方法,包括使用Access自带的导出功能、数据库管理工具、编程语言处理,或者第三方工具。需要分步骤说明每种方法,并指出注意事项,比如保留字、数据类型换、主键和索引的设置等。 还需要考虑数据量的大小,如果数据量很大,可能需要性能优化,比如分批导入。引用[4]提到缓存存储的高性能,但这里可能不适用,不过可以提醒用户导入后的性能优化,比如创建索引。 可能用户没有提到的潜在需求包括数据迁移后的验证,确保数据完整性和一致性,所以应该在步骤中加入验证的建议。 最后,生成相关问题,帮助用户进一步解决可能遇到的问题,比如处理导入误、大数据量迁移、自动化方法等。</think>### 分步解决方案:将MDB文件数据迁移到数据库 #### 1. 确认目标数据库类型 - **关系型数据库**:如SQL Server、MySQL、PostgreSQL等 - **NoSQL数据库**:如MongoDB(需处理非结构化数据) - 根据引用[3],若需要高性能和灵活结构可考虑MongoDB #### 2. 使用Access内置导出功能(适合小规模数据) ```sql -- Access菜单操作: 文件 → 导出 → 选择目标格式(CSV/Excel) -- 再通过目标数据库的导入工具加载文件 ``` *注意:可能丢失数据类型信息* #### 3. 使用数据库管理工具(推荐方法) **以SQL Server为例**: 1. 打开SSMS的"导入数据"向导 2. 选择数据源:`Microsoft Access` → 指定MDB路径 3. 目标选择:如`SQL Server Native Client` 4. 字段映射时需注意: - 自动添加中括号规避保留字冲突(如`[user]`代替`user`)[^1] - 检查数据类型换是否准确 5. 执行前建议生成SSIS包保存操作脚本 #### 4. 通过ODBC编程迁移(适合开发者) ```python import pyodbc # Access连接 conn_access = pyodbc.connect(r'DRIVER={Microsoft Access Driver (*.mdb)};DBQ=path/to/file.mdb') cursor_acc = conn_access.cursor() # 目标数据库连接(示例为MySQL) conn_mysql = pymysql.connect(host='localhost', user='root', database='target_db') # 分页读取写入 batch_size = 1000 while True: rows = cursor_acc.execute('SELECT * FROM table').fetchmany(batch_size) if not rows: break # 构造批量插入语句(注意字段义) placeholders = ','.join(['%s']*len(rows[0])) conn_mysql.cursor().executemany(f"INSERT INTO {table} VALUES ({placeholders})", rows) ``` #### 5. 处理特殊需求 - **大文件迁移**:使用`LIMIT/OFFSET`分批处理 - **字段兼容性**: - Access的`YESNO`类型需为`BIT`(SQL Server)或`BOOLEAN`(MySQL) - 自动编号字段需重置种子 - **二进制数据迁移**:使用Base64编码换(如图片字段) #### 6. 迁移后验证 ```sql -- 行数校验 SELECT COUNT(*) FROM source_table; -- Access SELECT COUNT(*) FROM target_table; -- 目标库 -- 抽样校验 CHECKSUM TABLE source_table, target_table; ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值