Google Apps 脚本 JDBC 连接到 Azure SQL 数据库 - 类型映射问题
Google Apps Script JDBC connection to Azure SQL db - type mapping problem
我正在尝试从 Google Apps 脚本(现在用于测试的独立脚本)连接到我的 Azure SQL 数据库, 使用 Apps Script JDBC Service.
// connection string (dbUrl): jdbc:sqlserver://...
var conn = Jdbc.getConnection(dbUrl, user, userPwd);
var stmt = conn.createStatement();
var rst = stmt.executeQuery('SELECT [ID], [DatetimeColumn], [Datetime2Column], [DateColumn], [TimeColumn] FROM [gscript].[testTable]')
// etc.
我遇到 某些(更新的?)SQL 服务器 date/time 数据类型的类型映射 问题:datetime2
、date
、time
。这些在我的脚本 (rst.getObject
) 中被映射和获取为 NVARCHAR
,即 作为字符串 (也由结果集元数据确认,见下文)。
只有 datetime
有效 - 映射为 java.sql.Timestamp
。
检查数据库和结果集元数据时,得到:
结果集 - SQL 服务器数据类型 datetime2
、date
、time
的列:
getColumnClassName: java.lang.String, getColumnType: -9, getColumnTypeName: nvarchar
数据库 - 驱动程序信息:
getDriverName: Microsoft SQL Server JDBC Driver 2.0 / getDriverVersion: 2.0.1803.100
/ getDriverMajorVersion: 2 / getDriverMinorVersion: 0
getJDBCMajorVersion: 4 / getJDBCMinorVersion: 0
有人能帮忙吗?
是低驱动版本的问题吗?能否以某种方式安装更新的驱动程序?
(我的 DBeaver 桌面应用程序显示 Microsoft JDBC Driver for SQL Server (MSSQL) version 7.4.1, 相同 [=93= 没有类型映射问题].)
或者是否有必要避免提到的数据类型而只使用 datetime
?
还是继续使用 NVARCHAR 并解析脚本中的数据是更好的做法?
编辑:
经过进一步的研究,我在 SQL Server T-SQL reference 中发现了这个: "Some down-level clients don't support the time, date, datetime2, and datetimeoffset data types..." 似乎它描述了我的问题。问题是,这可以在 Google Apps 脚本中以某种方式克服吗?
根据您的发现,Apps 脚本的内置服务似乎仅限于 JDBC 2.0。
如果是这样它只能支持DATE、TIME和TIMESTAMP数据类型来自 JDBC 1.0/2.0 (see documentation)。因此相对较新的 SQL 服务器数据类型将不受支持。
有几种方法可以解决这个问题。
您可以更改 MSSQL 表的 date/time 字段以使用更兼容的数据类型,但这可能意味着重构您的数据库和任何依赖它的现有代码。
一种侵入性较小的方法是在数据库服务器上创建存储过程,将这些数据类型转换为 App Script JDBC 服务可以处理和调用存储过程的格式,而不是直接查询表。
或者,您也可以尝试使用 the getter methods on the JdbcResultSet object 将传入数据强制转换为 date/time 类型(不确定这是否可行,但值得一试)。
我正在尝试从 Google Apps 脚本(现在用于测试的独立脚本)连接到我的 Azure SQL 数据库, 使用 Apps Script JDBC Service.
// connection string (dbUrl): jdbc:sqlserver://...
var conn = Jdbc.getConnection(dbUrl, user, userPwd);
var stmt = conn.createStatement();
var rst = stmt.executeQuery('SELECT [ID], [DatetimeColumn], [Datetime2Column], [DateColumn], [TimeColumn] FROM [gscript].[testTable]')
// etc.
我遇到 某些(更新的?)SQL 服务器 date/time 数据类型的类型映射 问题:datetime2
、date
、time
。这些在我的脚本 (rst.getObject
) 中被映射和获取为 NVARCHAR
,即 作为字符串 (也由结果集元数据确认,见下文)。
只有 datetime
有效 - 映射为 java.sql.Timestamp
。
检查数据库和结果集元数据时,得到:
结果集 - SQL 服务器数据类型 datetime2
、date
、time
的列:
getColumnClassName: java.lang.String, getColumnType: -9, getColumnTypeName: nvarchar
数据库 - 驱动程序信息:
getDriverName: Microsoft SQL Server JDBC Driver 2.0 / getDriverVersion: 2.0.1803.100 / getDriverMajorVersion: 2 / getDriverMinorVersion: 0 getJDBCMajorVersion: 4 / getJDBCMinorVersion: 0
有人能帮忙吗?
是低驱动版本的问题吗?能否以某种方式安装更新的驱动程序?
(我的 DBeaver 桌面应用程序显示 Microsoft JDBC Driver for SQL Server (MSSQL) version 7.4.1, 相同 [=93= 没有类型映射问题].)
或者是否有必要避免提到的数据类型而只使用 datetime
?
还是继续使用 NVARCHAR 并解析脚本中的数据是更好的做法?
编辑:
经过进一步的研究,我在 SQL Server T-SQL reference 中发现了这个: "Some down-level clients don't support the time, date, datetime2, and datetimeoffset data types..." 似乎它描述了我的问题。问题是,这可以在 Google Apps 脚本中以某种方式克服吗?
根据您的发现,Apps 脚本的内置服务似乎仅限于 JDBC 2.0。
如果是这样它只能支持DATE、TIME和TIMESTAMP数据类型来自 JDBC 1.0/2.0 (see documentation)。因此相对较新的 SQL 服务器数据类型将不受支持。
有几种方法可以解决这个问题。
您可以更改 MSSQL 表的 date/time 字段以使用更兼容的数据类型,但这可能意味着重构您的数据库和任何依赖它的现有代码。
一种侵入性较小的方法是在数据库服务器上创建存储过程,将这些数据类型转换为 App Script JDBC 服务可以处理和调用存储过程的格式,而不是直接查询表。
或者,您也可以尝试使用 the getter methods on the JdbcResultSet object 将传入数据强制转换为 date/time 类型(不确定这是否可行,但值得一试)。