使用 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 连接字符串时非常慢,手动选择数据源时速度快 - 问题出在哪里

MS Access 中通过 ODBC 连接 MS SQL 表的查询非常慢

MS Access中的ODBC连接失败

JDBC 驱动程序 MS Access 连接

MS Access ODBC 问题