Google Apps Script JDB C подключение к Azure SQL db - проблема с отображением типа - PullRequest
0 голосов
/ 01 апреля 2020

Я пытаюсь подключиться из Google Apps Script (автономный скрипт для тестирования) к моей Azure SQL базе данных , используя Apps Script JDB C Сервис .

// 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 типов данных даты / времени на сервере: datetime2, date, time. Они сопоставлены и получены в моем сценарии (rst.getObject) как NVARCHAR, то есть как строка (подтверждается также метаданными набора результатов, см. Ниже).

Только datetime работает - отображается как java.sql.Timestamp.

При проверке базы данных и метаданных набора результатов , получая это:

Resultset - столбцы с SQL типом данных сервера datetime2, date, time:

getColumnClassName: java .lang.String, getColumnType: -9, getColumnTypeName: nvarchar

База данных - информация о драйвере:

getDriverName: Microsoft SQL Сервер JDB C Драйвер 2.0 / getDriver Версия: 2.0.1803.100 / getDriverMajorVersion: 2 / getDriverMinorVersion: 0 getJDBCMajorVersion: 4 / getJDBCMinorVersion: 0

Кто-нибудь может помочь?

Проблема в младшей версии драйвера ? Можно ли каким-то образом установить более новый драйвер?

(В приложении My DBeaver для настольных ПК отображается драйвер Microsoft JDB C для SQL Сервер (MS SQL) версии 7.4.1, проблем с отображением типов при этом нет. таблица.)

Или необходимо избегать упомянутых типов данных и использовать вместо них только datetime?

Или лучше придерживаться NVARCHAR и анализировать данные в сценарии?

Редактировать:

После некоторых дальнейших исследований я нашел это в SQL Сервер T- SQL ссылка : "Некоторые клиенты нижнего уровня не поддерживают типы данных time, date, datetime2 и datetimeoffset ... " Кажется, это описывает мою проблему. Вопрос в том, можно ли это как-то преодолеть в Google Apps Script?

1 Ответ

1 голос
/ 01 апреля 2020

Судя по вашим выводам, встроенная служба Apps Script ограничена JDB C 2.0.

В этом случае он может поддерживать только ДАТА , ВРЕМЯ и TIMESTAMP типы данных из JDB C 1.0 / 2.0 ( см. документацию ). Поэтому относительно новые SQL типы данных сервера не поддерживаются.

Существует несколько способов справиться с этим.

Вы можете изменить поля даты / времени в таблицах MS SQL, чтобы использовать более совместимые типы данных, но это может означать рефакторинг вашей базы данных и любого существующего кода, который зависит от нее.

Менее навязчивый подход заключается в создании хранимых процедур на сервере базы данных, которые преобразуют эти типы данных в форматы, которые служба JDB C App Script может обрабатывать и вызывать хранимые процедуры вместо непосредственного запроса таблиц.

В качестве альтернативы, вы также можете попробовать использовать методы получения для объекта JdbcResultSet , чтобы принудительно привести входные данные к типу даты / времени (не уверен, что это будет работать, но его стоит попробовать) ).

...