odbcConnect в R — как извлечь информацию о файле dsn?

#r #mysql-odbc-connector

#r #mysql-odbc-connector

Вопрос:

ПРИВЕТ, я использую R и хочу сохранить табличные представления в ch, но это не работает

У меня есть файл dsn, сохраненный в каталоге с именем dsnfiles:

 ch <- odbcConnect("S:/dsnfiles/databasex.dsn")
sqlTables(ch)
  

Пожалуйста, вы можете мне помочь? Этот код не работает.

Спасибо

A

Комментарии:

1. Файл DSN обычно представляет собой просто текстовый файл с определенными свойствами. Если вы можете вставить содержимое этого файла (отредактированное для PII / auth), это может быть полезно. Однако я никогда не использовал файл DSN, предпочитая либо прямые параметры, либо строку DSN. (Я также использую DBI / odbc а не RODBC так, как кажется, что вы используете здесь. Я не верю, что это меняет проблемы, с которыми вы сталкиваетесь.)

2. Как мне использовать строку dsn? В sas это «подключиться к odbc (noprompt=’filedsn= S:dsnfiles databasex.dsn;’);» а в stata это «загрузка odbc, таблица (x) нижняя очистить строку подключения («FILEDSN = S: dsnfiles databasex.dsn»)»

Ответ №1:

Файлы DSN обычно хранятся на системном уровне, поэтому обычно это не произвольные файлы, подобные этому. Я считаю, что odbc пакет поддерживает произвольные файлы в macos и Linux (не Windows), но я не тестировал это RODBC . Сказав это, нетрудно проанализировать этот файл и получить то, что вам нужно.

Для моей конфигурации у меня есть экземпляр SQL Server, запущенный на моем локальном хосте, порт 21433.

Я создал файл DSN с именем "~/StackOverflow/14549856/somedatabase.dsn" со следующим содержимым:

 [ODBC]  
DRIVER=ODBC Driver 17 for SQL Server
TrustServerCertificate=Yes
DATABASE=mydbname
WSID=d2sb2
SERVER=127.0.0.1,21433
UID=myusername
PWD=mypassword
  

(при необходимости замените uid / pwd).

Я предполагаю, что, поскольку вы просто ссылаетесь на один файл без каких-либо других условий, нужная вам запись ( [ODBC] в моем примере) является единственной записью в файле, поэтому я начну с этого. Если у вас есть какие-либо искаженные записи, пустые строки или комментарии в этом файле, вам может потребоваться немного больше поработать с форматированием строки подключения здесь.

Итак, давайте преобразуем этот файл в «строку подключения» (вот хорошая ссылка для этих строк: https://www.connectionstrings.com /).

 connstr <- paste(trimws(readLines("~/StackOverflow/14549856/somedatabase.dsn")[-1]), collapse = ";")
connstr
# [1] "DRIVER=ODBC Driver 17 for SQL Server;TrustServerCertificate=Yes;DATABASE=mydbname;WSID=d2sb2;SERVER=127.0.0.1,21433;UID=myusername;PWD=mypassword"
  

( [-1] Избавляется от [ODBC] заголовка. Мы используем все остальные строки.)

Мы можем использовать это непосредственно в открывающем вызове:

 rcon <- RODBC::odbcDriverConnect(connection = connstr)
RODBC::sqlQuery(rcon, "select 2 as two")
#   two
# 1   2
RODBC::odbcClose(rcon)
  

Возможно (даже вероятно), что ваш файл DSN содержит больше, чем этот пример. Если есть несколько записей (например, [ODBC] и [SomeOtherODBC] ), то вам потребуется немного больше работы. Ниже приведен пример, который может сработать (может и нет, в зависимости от комментариев и т. Д.).

Новое содержимое файла DSN:

 [ODBC]  
DRIVER=ODBC Driver 17 for SQL Server
TrustServerCertificate=Yes
DATABASE=mydbname
WSID=d2sb2
SERVER=127.0.0.1,21433
UID=myusername
PWD=mypassword

[ODBC2]  
DRIVER=ODBC Driver 17 for SQL Server
TrustServerCertificate=Yes
DATABASE=mydbname
WSID=d2sb2
SERVER=127.0.0.1,31433
UID=myusername2
PWD=mypassword2
  
 dsnfile <- readLines("~/StackOverflow/14549856/somedatabase.dsn")
dsnfile <- split(dsnfile, cumsum(grepl("^[[:space:]]*\[", dsnfile)))
dsnnames <- sapply(dsnfile, function(dsn) trimws(gsub("[][[:space:]]", "", dsn[1])))
dsnfile <- lapply(setNames(dsnfile, dsnnames), function(dsn) paste(trimws(dsn[-1]), collapse = ";"))
str(dsnfile)
# List of 2
#  $ ODBC : chr "DRIVER=ODBC Driver 17 for SQL Server;TrustServerCertificate=Yes;DATABASE=mydbname;WSID=d2sb2;SERVER=127.0.0.1,2"| __truncated__
#  $ ODBC2: chr "DRIVER=ODBC Driver 17 for SQL Server;TrustServerCertificate=Yes;DATABASE=mydbname;WSID=d2sb2;SERVER=127.0.0.1,3"| __truncated__
rcon <- RODBC::odbcDriverConnect(connection = dsnfile[["ODBC"]])
RODBC::sqlQuery(rcon, "select 3 as three")
#   three
# 1     3
RODBC::odbcClose(rcon)
  

Комментарии:

1. Вы удивительный мастер!!! Ваш код решил мою проблему!!!!