我有一个vb.net项目,我从Access转换为SQL Server。
在Access中,显然我的所有日期/时间字段都保存为DateTime
。但是,这是我的问题:
当我将数据库迁移到SQL Server 2008时,它现在将它们保存为datetime2
列,而不是datetime
。这会导致Crystal Reports出现问题,因为它会将这些问题转换为字符串,而不是datetime
。
我在表格中有数百条记录,因此我无法将其删除并重新设计,因此还有其他方法可以将列从datetime2
更改为datetime
,没有丢失我保存在表格中的数据?
答案 0 :(得分:2)
默认情况下,Access的迁移助手会更新为较新的datetime2列。
如果继续使用Access的默认(旧版)SQL驱动程序或将Crystal报表作为SQL Server的客户端,则在使用旧驱动程序时,所有此类列都将作为STRINGS返回。
我建议的两个解决方案是:
一: 再次重新迁移数据和表,但是在您调整数据大小之前,您需要更改SSMA中的字段映射以使用较旧的日期时间格式而不是datetime2。
二: 不要使用旧版ODBC驱动程序。使用本机10或11驱动程序,因此datetime2列将作为实际日期时间列与ODBC驱动程序一起返回。这种建议的唯一缺点是默认情况下不安装这些本机SQL 10或11驱动程序 - 因此人们经常使用较旧的旧驱动程序以便于分发 - 特别是对于连接到SQL服务器的Access前端。公平地说,较旧的旧SQL驱动程序非常陈旧 - 因此一般建议最近使用本机11驱动程序。
虽然使用本机10或11驱动程序将解决此问题,但必须在每个工作站上安装这些驱动程序。因此,使用带有水晶的新SQL驱动程序将解决此问题。
在每个查询中,必须开始编写自定义查询并查看SQL服务器端以将日期/时间2列“转换”为旧日期时间格式,这将是令人难以置信的愚蠢 - 我强烈忽略这些建议在这里浮动。 CR可以工作并使用datetime2 - 但是在使用旧的SQL驱动程序时却不行 - 只需采用原生驱动程序,这个问题就会消失。
答案 1 :(得分:0)
对此的修复是在SQL Server中使用查询。
ALTER TABLE table_name ADD new_column datetime
SET new_column = old_column
ALTER TABLE DROP old_column
这还可能包括编辑主键等和关系的需要,但这些可以直接重新添加。 最后,使用旧列名重命名新列,并将其移动到正确的位置。
答案 2 :(得分:-1)
前段时间我遇到了将Access中的日期导出为SQL Server或其他任何内容的可导入格式的问题。 Access不会将它们导出为SQL可以导入的正确格式,因此我必须编写一个解析器/转换器来将日期转换为可导入的格式。