使用 ODBC 连接时如何在 MS Access 或 SQL Server 中使用日期数据类型
Posted
技术标签:
【中文标题】使用 ODBC 连接时如何在 MS Access 或 SQL Server 中使用日期数据类型【英文标题】:How to use date data type in either MS Access or SQL Server when using ODBC connection 【发布时间】:2018-08-27 23:10:40 【问题描述】:我有一个 C# 程序,它使用 DSN(ODBC 驱动程序)连接到数据库。
我在程序中运行的所有查询都使用 SQL。一切正常,但在查询中使用日期时间数据类型时(在 SELECT 语句或 WHERE 子句中)。
当 DSN 是 MS ACCESS 数据库时,我必须使用这样的东西:
WHERE SomeDate = #1/1/2005#
但是如果同一个数据库在 SQL Server 中,我应该使用这样的东西:
WHERE SomeDate = '1/1/2005'
有没有一种方法可以在同一个程序中进行管理,而无需为 SQL Server 执行例程,而为 MS ACCESS 执行另一个例程?
我尝试通过获取 OdbcConnection 对象的属性,但我找不到检测驱动程序是 MS Access 还是 SQL Server 的方法。
【问题讨论】:
使用SQL参数,传一个实际的日期就没有问题 如果你对 sql server 使用文字,你应该总是使用yyyy-mm-dd
而不是 1/1/2005
。后一种格式可以是 m/d 或 d/m。
你考虑过参数化查询吗?这样,日期等。不需要封闭。
@DanGuzman 是的。我已经考虑过了,但这是我最后的机会,因为查询已经通过“cmd.ExecuteNonQuery() 方法创建和执行。我不想要对源代码进行更多更改。
【参考方案1】:
您可能在 SQL Server 中使用过数据类型 Datetime2。如果使用本机 SQL Server ODBC 驱动程序,它将被读取为文本。
所以要么:
-
使用 Microsoft® ODBC Driver 11 for SQL Server® - 或更新版本,17 是最新的:
Microsoft® ODBC Driver 17 for SQL Server®
-
将字段的数据类型更改为日期时间
【讨论】:
【参考方案2】:您可以将 Access 数据库设置为 ANSI-92 模式。这将允许您使用单引号查询日期字段。
如果这是现有数据库或有其他应用程序使用它,请注意。这可能会对数据库中不符合 ANSI 的任何现有查询引入重大更改。同样,如果有其他应用程序使用此数据库,它们的查询也可能会中断。
另外,请注意OdbcConnection
确实具有Driver
属性,您可以对其进行探测以确定数据源。在我的机器上,指向 SQL Server 数据库的 DSN 返回 sqlncli11.dll
,因为我使用的是 SQL Server Native Client 11.0。您可以使用此属性来驱动应用程序中查询的语法。您可以创建一个数据访问层,将其中的一部分从您的代码的其余部分中抽象出来。
【讨论】:
可以按程序设置该模式吗?我正在使用的数据库也被其他程序使用....所以,如果我将模式更改为数据库,可能会影响其他程序的行为。 哪个版本的访问? 您绝对永远不想在现有数据库上使用此选项。现在,每个使用诸如“*”之类的东西作为通配符的查询都会中断,因为您必须使用“Smi%”之类的东西来代替访问“Smi”。仅当从第一天开始以这种方式创建整个应用程序时,才可以选择此选项-一旦您选择“一种方式”或“另一种方式”,则必须修改所有现有 SQL 以符合您的给定选择。出乎意料地翻转此选项将使现有应用程序变得非常混乱(因为许多 sql 语句现在格式错误)。 @jstuardo p.s.我尝试为 SQL Server 源和 MS Access 创建一个 OdbcConnection。虽然驱动程序属性为空访问,但它是 SQL Server 的 sqlncli11.dll,因此也可用于区分数据源。 @MehdiIbrahim 你的意思是像“if (!String.IsNullOrEmpty(conn.Driver)) dateLimiter = "'";"?那么,当 Driver 属性中有内容时,限制器应该是单引号吗?我会测试它。谢谢。以上是关于使用 ODBC 连接时如何在 MS Access 或 SQL Server 中使用日期数据类型的主要内容,如果未能解决你的问题,请参考以下文章
如何使用 MySQl 的 ODBC 连接器在 MS Access 中的 VBA 中执行和查询?
MS Access 直通查询 - 使用 ODBC 连接字符串时非常慢,手动选择数据源时速度快 - 问题出在哪里