Observação
O acesso a essa página exige autorização. Você pode tentar entrar ou alterar diretórios.
O acesso a essa página exige autorização. Você pode tentar alterar os diretórios.
A função Odbc.DataSource usa dois parâmetros: um connectionString para o driver e um options registro que permite sobrescrever vários comportamentos do driver. Por meio do registro de opções, você pode substituir recursos e outras informações relatadas pelo driver, controlar o comportamento do navegador e afetar as consultas SQL geradas pelo engine M.
Os campos de registros de opções com suporte se enquadram em duas categorias: aquelas que são públicas e sempre disponíveis, e aquelas que só estão disponíveis em um contexto de extensibilidade.
A tabela a seguir descreve os campos públicos no registro de opções.
| Campo | Description |
|---|---|
CommandTimeout |
Um valor de duração que controla por quanto tempo a consulta do lado do servidor tem permissão para ser executada antes de ser cancelada. Padrão: 10 minutos |
ConnectionTimeout |
Um valor de duração que controla quanto tempo esperar antes de abandonar uma tentativa de fazer uma conexão com o servidor. Padrão: 15 segundos |
CreateNavigationProperties |
Um valor lógico que define se as propriedades de navegação devem ser geradas nas tabelas retornadas. As propriedades de navegação são baseadas em relações de chave estrangeira definidas pelo driver. Essas propriedades aparecem como colunas "virtuais" que podem ser expandidas no editor de consultas, criando a junção apropriada. Se o cálculo de dependências de chave estrangeira for uma operação custosa para o driver, você pode desejar definir esse valor como false. Padrão: verdadeiro. |
HierarchicalNavigation |
Um valor lógico que define se as tabelas agrupadas por seus nomes de esquema devem ser exibidas. Quando definidas como false, as tabelas são exibidas em uma lista simples em cada banco de dados. Padrão: false |
SqlCompatibleWindowsAuth |
Um valor lógico que determina se uma cadeia de conexão compatível com o SQL Server deve ser gerada ao usar a autenticação do WindowsTrusted_Connection=Yes.Se o driver der suporte à Autenticação do Windows, mas exigir configurações extras ou alternativas na cadeia de conexão, defina esse valor como false e use o campo de registro de CredentialConnectionString opções descrito na próxima tabela.Padrão: verdadeiro. |
A tabela a seguir descreve os campos de registro de opções que só estão disponíveis por meio da extensibilidade. Campos que não são valores literais simples são descritos em seções posteriores.
| Campo | Description |
|---|---|
AstVisitor |
Um registro que contém uma ou mais substituições para controlar a geração de consulta SQL. O uso mais comum desse campo é fornecer lógica para gerar uma cláusula LIMIT/OFFSET para drivers que não dão suporte a TOP. Os campos incluem Constant e LimitClause.Mais informações: Sobrescrevendo o AstVisitor |
CancelQueryExplicitly |
Um valor lógico que instrui o mecanismo M a cancelar explicitamente todas as chamadas em execução por meio do driver ODBC antes de encerrar a conexão com o servidor ODBC. Esse campo é útil em situações em que a execução da consulta é gerenciada independentemente das conexões de rede com o servidor, por exemplo, em algumas implantações do Spark. Na maioria dos casos, esse valor não precisa ser definido porque a consulta no servidor é cancelada quando a conexão de rede com o servidor é encerrada. Padrão: false |
ClientConnectionPooling |
Um valor lógico que permite o agrupamento de conexões no lado do cliente para o driver ODBC. A maioria dos drivers deseja definir esse valor como true. Padrão: false |
CredentialConnectionString |
Um valor de texto ou registro usado para especificar propriedades de cadeia de conexão relacionadas à credencial. |
HideNativeQuery |
Um valor lógico que controla se o conector mostra ou não instruções SQL geradas na experiência do usuário do Power Query. Isso só deve ser definido como verdadeiro se a fonte de dados de back-end der suporte nativo ao SQL-92. Padrão: false |
ImplicitTypeConversions |
Um valor de tabela que contém conversões de tipo implícitas compatíveis com o driver ou o servidor de back-end. Os valores nesta tabela são aditivos às conversões relatadas pelo próprio driver. Esse campo é normalmente usado com o campo SQLGetTypeInfo para substituir informações de tipo de dados reportadas pelo driver. |
OnError |
Uma função de tratamento de erros que recebe um errorRecord parâmetro do tipo record.Os usos comuns dessa função incluem lidar com falhas de conexão SSL, fornecer um link de download se o driver não for encontrado no sistema e relatar erros de autenticação. |
SoftNumbers |
Permite que o mecanismo M selecione um tipo de dados compatível quando a conversão entre dois tipos numéricos específicos não for declarada como compatível com os recursos SQL_CONVERT_*. Padrão: false |
SqlCapabilities |
Um registro que fornece várias substituições de recursos de driver e uma maneira de especificar recursos que não são expressos por meio do ODBC 3.8. Mais informações: Sobrescrevendo SqlCapabilities |
SQLColumns |
Uma função que permite modificar metadados de coluna retornados pela SQLColumns função.Mais informações: Substituindo SQLColumns |
SQLGetFunctions |
Um registro que permite sobrescrever os valores retornados por chamadas a SQLGetFunctions.Um uso comum desse campo é desabilitar o uso da associação de parâmetros ou especificar que as consultas geradas devem usar CAST em vez de CONVERT. Mais informações: Sobrescrevendo SQLGetFunctions |
SQLGetInfo |
Um registro que permite substituir valores retornados em chamadas para SQLGetInfo.Mais informações: Sobrescrevendo SQLGetInfo |
SQLGetTypeInfo |
Uma tabela ou função que retorna uma tabela que substitui as informações de tipo retornadas por SQLGetTypeInfo.Quando o valor é configurado como uma tabela, ele substitui completamente as informações de tipo relatadas pelo driver. SQLGetTypeInfo não será chamado.Quando o valor é definido como uma função, a sua função receberá o resultado da chamada original a SQLGetTypeInfo, permitindo que você modifique a tabela.Esse campo normalmente é usado quando há uma incompatibilidade entre os tipos de dados relatados por SQLGetTypeInfo .SQLColumnsMais informações: Substituindo SQLGetTypeInfo |
SQLTables |
Uma função que permite modificar os metadados da tabela retornados por uma chamada para SQLTables. |
TolerateConcatOverflow |
Permite que a concatenação de valores de texto ocorra mesmo que o resultado possa ser truncado para se ajustar aos limites de um tipo disponível. Por exemplo, ao concatenar um campo VARCHAR(4000) com um campo VARCHAR(4000) em um sistema que dá suporte a um tamanho varchar maximizado de 4000 e nenhum tipo CLOB, a concatenação é dobrada mesmo que o resultado possa ser truncado. Padrão: false |
UseEmbeddedDriver |
(uso interno): Um valor lógico que controla se o driver ODBC deve ser carregado de um diretório local (usando uma nova funcionalidade definida na especificação ODBC 4.0). Esse valor geralmente é definido apenas por conectores criados pela Microsoft que são enviados com o Power Query. Quando definido como false, o gerenciador de driver ODBC do sistema é usado para localizar e carregar o driver. A maioria dos conectores não deve precisar definir esse campo. Padrão: false |
Substituindo o AstVisitor
O AstVisitor campo é definido por meio do registro de opções Odbc.DataSource . Ele é usado para modificar instruções SQL geradas para cenários de consulta específicos.
Observação
Os drivers que dão suporte a cláusulas LIMIT e OFFSET (em vez de TOP) desejarão fornecer uma LimitClause substituição para AstVisitor.
Constante
Fornecer uma opção para substituir esse valor foi descontinuado e pode ser removido de implementações futuras.
LimitClause
Esse campo é uma função que recebe dois Int64.Type argumentos (skip, take) e retorna um registro com dois campos de texto (Text, Location).
LimitClause = (skip as nullable number, take as number) as record => ...
O skip parâmetro é o número de linhas a serem ignoradas (ou seja, o argumento para OFFSET). Se um deslocamento não for especificado, o valor de pular será nulo. Se o driver der suporte a LIMIT, mas não oferecer suporte a OFFSET, a função LimitClause deverá retornar um erro não implementado (...) quando skip for maior que 0.
O take parâmetro é o número de linhas a serem tomadas (ou seja, o argumento para LIMIT).
O Text campo do resultado contém o texto SQL a ser adicionado à consulta gerada.
O Location campo especifica onde inserir a cláusula. A tabela a seguir descreve os valores com suporte.
| Value | Description | Example |
|---|---|---|
AfterQuerySpecification |
A cláusula LIMIT é colocada no final do SQL gerado. Essa é a sintaxe LIMIT com suporte mais comum. |
SELECT a, b, c Tabela FROM ONDE a > 10 LIMITE 5 |
BeforeQuerySpecification |
A cláusula LIMIT é colocada antes da instrução SQL gerada. |
LIMITE DE 5 LINHAS SELECT a, b, c Tabela FROM ONDE a > 10 |
AfterSelect |
LIMIT vem depois da instrução SELECT e depois de qualquer modificador (como DISTINCT). | SELECT DISTINCT LIMIT 5 a, b, c Tabela FROM ONDE um > 10 |
AfterSelectBeforeModifiers |
LIMIT vem após a instrução SELECT, mas antes de qualquer modificador (como DISTINCT). |
SELECT LIMIT 5 DISTINCT a, b, c Tabela FROM ONDE a > 10 |
O trecho de código a seguir fornece uma implementação da LimitClause para um driver que espera uma cláusula LIMIT, com um OFFSET opcional, no formato a seguir: [OFFSET <offset> ROWS] LIMIT <row_count>
LimitClause = (skip, take) =>
let
offset = if (skip > 0) then Text.Format("OFFSET #{0} ROWS", {skip}) else "",
limit = if (take <> null) then Text.Format("LIMIT #{0}", {take}) else ""
in
[
Text = Text.Format("#{0} #{1}", {offset, limit}),
Location = "AfterQuerySpecification"
]
O snippet de código a seguir fornece uma LimitClause implementação para um driver que dá suporte a LIMIT, mas não a OFFSET. Formato: LIMIT <row_count>.
LimitClause = (skip, take) =>
if (skip > 0) then error "Skip/Offset not supported"
else
[
Text = Text.Format("LIMIT #{0}", {take}),
Location = "AfterQuerySpecification"
]
Sobrescrevendo SqlCapabilities
| Campo | Detalhes |
|---|---|
FractionalSecondsScale |
Um valor numérico que varia de 1 a 7 que indica o número de casas decimais com suporte para valores de milissegundos. Esse valor deve ser definido por conectores que desejam habilitar a otimização de consulta para valores do tipo datetime. Padrão: nulo |
PrepareStatements |
Um valor lógico que indica que as instruções devem ser preparadas usando SQLPrepare. Padrão: false |
SupportsTop |
Um valor lógico que indica que o driver dá suporte à cláusula TOP para limitar o número de linhas retornadas. Padrão: false |
StringLiteralEscapeCharacters |
Uma lista de valores de texto que especificam os caracteres a serem usados ao escapar de literais de cadeia de caracteres e expressões LIKE. Exemplo: {""}Padrão: nulo |
SupportsDerivedTable |
Um valor lógico que indica que o driver dá suporte a tabelas derivadas (subconsultas). Esse valor é considerado verdadeiro para drivers que definem seu nível de conformidade como SQL_SC_SQL92_FULL (relatado pelo driver ou substituído pela configuração Sql92Conformance. Para todos os outros níveis de conformidade, esse valor é definido como padrão para false. Se o driver não relatar o nível de conformidade do SQL_SC_SQL92_FULL, mas suportar tabelas derivadas, defina esse valor como true. O suporte a tabelas derivadas é necessário para muitos cenários do DirectQuery. |
SupportsNumericLiterals |
Um valor lógico que indica se o SQL gerado deve incluir valores de literais numéricos. Quando definidos como false, valores numéricos são sempre especificados usando associação de parâmetro. Padrão: false |
SupportsStringLiterals |
Um valor lógico que indica se o SQL gerado deve incluir valores literais de strings. Quando definido como false, os valores de cadeia de caracteres são sempre especificados usando associação de parâmetro. Padrão: false |
SupportsOdbcDateLiterals |
Um valor lógico que indica se o SQL gerado deve incluir valores literais de data. Quando definidos como false, os valores de data são sempre especificados usando associação de parâmetro. Padrão: false |
SupportsOdbcTimeLiterals |
Um valor lógico que indica se o SQL gerado deve incluir valores literais de tempo. Quando definidos como false, os valores de tempo são sempre especificados usando associação de parâmetro. Padrão: false |
SupportsOdbcTimestampLiterals |
Um valor lógico que indica se o SQL gerado deve incluir valores literais de carimbo de data/hora. Quando definido como false, os valores de carimbo de data/hora são sempre especificados usando vinculação de parâmetro. Padrão: false |
Substituindo SQLColumns
SQLColumns é um manipulador de funções que recebe os resultados de uma chamada ODBC para SQLColumns. O parâmetro de origem contém uma tabela com as informações de tipo de dados. Essa substituição normalmente é usada para resolver incompatibilidades de tipo de dados entre chamadas a SQLGetTypeInfo e SQLColumns.
Para obter detalhes do formato do parâmetro de tabela de origem, acesse a Função SQLColumns.
Substituindo SQLGetFunctions
Esse campo é usado para substituir SQLFunctions valores retornados por um driver ODBC. Ele contém um registro cujos nomes de campo são iguais às FunctionId constantes definidas para a função ODBC SQLGetFunctions . Constantes numéricas para cada um desses campos podem ser encontradas na especificação ODBC.
| Campo | Detalhes |
|---|---|
SQL_CONVERT_FUNCTIONS |
Indica quais funções têm suporte ao fazer conversões de tipo. Por padrão, o Mecanismo M tenta usar a função CONVERT. Os drivers que preferem o uso do CAST podem substituir esse valor para relatar que há suporte apenas para SQL_FN_CVT_CAST (valor numérico de 0x2). |
SQL_API_SQLBINDCOL |
Um valor lógico (true/false) que indica se o mecanismo de mashup deve usar a API SQLBindCol ao recuperar dados. Quando definido como false, SQLGetData é usado em vez disso. Padrão: false |
O trecho de código a seguir fornece um exemplo indicando explicitamente ao motor M que use CAST em vez de CONVERT.
SQLGetFunctions = [
SQL_CONVERT_FUNCTIONS = 0x2 /* SQL_FN_CVT_CAST */
]
Sobrepondo SQLGetInfo
Esse campo é usado para substituir os valores do SQLGetInfo retornados por um driver ODBC. Ele contém um registro cujos campos são nomes iguais às InfoType constantes definidas para a função ODBC SQLGetInfo . Constantes numéricas para cada um desses campos podem ser encontradas na especificação ODBC. A lista completa das InfoTypes verificações pode ser encontrada nos arquivos de rastreamento do mecanismo de mashup.
A tabela a seguir contém propriedades SQLGetInfo comumente sobrescritas:
| Campo | Detalhes |
|---|---|
SQL_SQL_CONFORMANCE |
Um valor inteiro que indica o nível do SQL-92 compatível com o driver: (1) SQL_SC_SQL92_ENTRY: compatível com o nível de entrada do SQL-92. (2) SQL_SC_FIPS127_2_TRANSITIONAL: em conformidade com o nível de transição FIPS 127-2. (4) SQL_SC_ SQL92_INTERMEDIATE" Compatível com SQL-92 de nível intermediário. (8) SQL_SC_SQL92_FULL: compatível com SQL-92 de nível completo. Em cenários do Power Query, o conector é usado em um modo somente leitura. A maioria dos drivers vai querer declarar o nível de conformidade SQL_SC_SQL92_FULL e substituir o comportamento específico de geração de SQL usando as propriedades SQLGetInfo e SQLGetFunctions. |
SQL_SQL92_PREDICATES |
Um bitmask enumerando os predicados com suporte em uma instrução SELECT, conforme definido no SQL-92. Vá para SQL_SP_* constantes na especificação ODBC. |
SQL_AGGREGATE_FUNCTIONS |
Uma bitmask enumerando suporte para funções de agregação. SQL_AF_ALL SQL_AF_AVG SQL_AF_COUNT SQL_AF_DISTINCT SQL_AF_MAX SQL_AF_MIN SQL_AF_SUM Vá para SQL_AF_* constantes na especificação ODBC. |
SQL_GROUP_BY |
Um valor inteiro que especifica a relação entre as colunas na cláusula GROUP BY e as colunas não agregadas na lista de seleção: SQL_GB_COLLATE: uma cláusula COLLATE pode ser especificada no final de cada coluna de agrupamento. SQL_GB_NOT_SUPPORTED: não há suporte para cláusulas GROUP BY. SQL_GB_GROUP_BY_EQUALS_SELECT: a cláusula GROUP BY deve conter todas as colunas não agregadas na lista de seleção. Ele não pode conter nenhuma outra coluna. Por exemplo, execute o comando SQL: SELECT DEPT, MAX(SALARY) FROM EMPLOYEE GROUP BY DEPT. SQL_GB_GROUP_BY_CONTAINS_SELECT: a cláusula GROUP BY deve conter todas as colunas não agregadas na lista de seleção. Ele pode conter colunas que não estão na lista de seleção. Por exemplo, SELECT DEPT, MAX(SALARY) FROM EMPLOYEE GROUP BY DEPT, AGE. SQL_GB_NO_RELATION: as colunas na cláusula GROUP BY e na lista de seleção não estão relacionadas. O significado de colunas não agrupadas e não agregadas na lista de seleção depende da fonte de dados. Por exemplo, no contexto de bancos de dados, SELECT DEPT, SALARY FROM EMPLOYEE GROUP BY DEPT, AGE. Vá para as constantes SQL_GB_* na especificação ODBC. |
A função auxiliar a seguir pode ser usada para criar valores de máscara de bits a partir de uma lista de valores inteiros.
Flags = (flags as list) =>
let
Loop = List.Generate(
()=> [i = 0, Combined = 0],
each [i] < List.Count(flags),
each [i = [i]+1, Combined =*Number.BitwiseOr([Combined], flags{i})],
each [Combined]),
Result = List.Last(Loop, 0)
in
Result;
Substituindo SQLGetTypeInfo
SQLGetTypeInfo pode ser especificado de duas maneiras:
- Um valor fixo
tableque contém informações de tipagem semelhantes a uma chamada ODBC paraSQLGetTypeInfo. - Uma função que aceita um argumento de tabela e retorna uma tabela. O argumento contém os resultados originais da chamada ODBC para
SQLGetTypeInfo. Sua implementação de função pode modificar ou adicionar a esta tabela.
A primeira abordagem é usada para substituir completamente os valores retornados pelo driver ODBC. A segunda abordagem será usada se você quiser adicionar ou modificar esses valores.
Para obter detalhes sobre o formato do parâmetro de tabela de tipos e o valor de retorno esperado, vá para a referência de função SQLGetTypeInfo.
SQLGetTypeInfo usando uma tabela estática
O snippet de código a seguir fornece uma implementação estática para SQLGetTypeInfo.
SQLGetTypeInfo = #table(
{ "TYPE_NAME", "DATA_TYPE", "COLUMN_SIZE", "LITERAL_PREF", "LITERAL_SUFFIX", "CREATE_PARAS", "NULLABLE", "CASE_SENSITIVE", "SEARCHABLE", "UNSIGNED_ATTRIBUTE", "FIXED_PREC_SCALE", "AUTO_UNIQUE_VALUE", "LOCAL_TYPE_NAME", "MINIMUM_SCALE", "MAXIMUM_SCALE", "SQL_DATA_TYPE", "SQL_DATETIME_SUB", "NUM_PREC_RADIX", "INTERNAL_PRECISION", "USER_DATA_TYPE" }, {
{ "char", 1, 65535, "'", "'", "max. length", 1, 1, 3, null, 0, null, "char", null, null, -8, null, null, 0, 0 },
{ "int8", -5, 19, "'", "'", null, 1, 0, 2, 0, 10, 0, "int8", 0, 0, -5, null, 2, 0, 0 },
{ "bit", -7, 1, "'", "'", null, 1, 1, 3, null, 0, null, "bit", null, null, -7, null, null, 0, 0 },
{ "bool", -7, 1, "'", "'", null, 1, 1, 3, null, 0, null, "bit", null, null, -7, null, null, 0, 0 },
{ "date", 9, 10, "'", "'", null, 1, 0, 2, null, 0, null, "date", null, null, 9, 1, null, 0, 0 },
{ "numeric", 3, 28, null, null, null, 1, 0, 2, 0, 0, 0, "numeric", 0, 0, 2, null, 10, 0, 0 },
{ "float8", 8, 15, null, null, null, 1, 0, 2, 0, 0, 0, "float8", null, null, 6, null, 2, 0, 0 },
{ "float8", 6, 17, null, null, null, 1, 0, 2, 0, 0, 0, "float8", null, null, 6, null, 2, 0, 0 },
{ "uuid", -11, 37, null, null, null, 1, 0, 2, null, 0, null, "uuid", null, null, -11, null, null, 0, 0 },
{ "int4", 4, 10, null, null, null, 1, 0, 2, 0, 0, 0, "int4", 0, 0, 4, null, 2, 0, 0 },
{ "text", -1, 65535, "'", "'", null, 1, 1, 3, null, 0, null, "text", null, null, -10, null, null, 0, 0 },
{ "lo", -4, 255, "'", "'", null, 1, 0, 2, null, 0, null, "lo", null, null, -4, null, null, 0, 0 },
{ "numeric", 2, 28, null, null, "precision, scale", 1, 0, 2, 0, 10, 0, "numeric", 0, 6, 2, null, 10, 0, 0 },
{ "float4", 7, 9, null, null, null, 1, 0, 2, 0, 10, 0, "float4", null, null, 7, null, 2, 0, 0 },
{ "int2", 5, 19, null, null, null, 1, 0, 2, 0, 10, 0, "int2", 0, 0, 5, null, 2, 0, 0 },
{ "int2", -6, 5, null, null, null, 1, 0, 2, 0, 10, 0, "int2", 0, 0, 5, null, 2, 0, 0 },
{ "timestamp", 11, 26, "'", "'", null, 1, 0, 2, null, 0, null, "timestamp", 0, 38, 9, 3, null, 0, 0 },
{ "date", 91, 10, "'", "'", null, 1, 0, 2, null, 0, null, "date", null, null, 9, 1, null, 0, 0 },
{ "timestamp", 93, 26, "'", "'", null, 1, 0, 2, null, 0, null, "timestamp", 0, 38, 9, 3, null, 0, 0 },
{ "bytea", -3, 255, "'", "'", null, 1, 0, 2, null, 0, null, "bytea", null, null, -3, null, null, 0, 0 },
{ "varchar", 12, 65535, "'", "'", "max. length", 1, 0, 2, null, 0, null, "varchar", null, null, -9, null, null, 0, 0 },
{ "char", -8, 65535, "'", "'", "max. length", 1, 1, 3, null, 0, null, "char", null, null, -8, null, null, 0, 0 },
{ "text", -10, 65535, "'", "'", "max. length", 1, 1, 3, null, 0, null, "text", null, null, -10, null, null, 0, 0 },
{ "varchar", -9, 65535, "'", "'", "max. length", 1, 1, 3, null, 0, null, "varchar", null, null, -9, null, null, 0, 0 },
{ "bpchar", -8, 65535, "'", "'", "max. length", 1, 1, 3, null, 0, null, "bpchar", null, null, -9, null, null, 0, 0 } }
);
SQLGetTypeInfo usando uma função
Os snippets de código a seguir acrescentam o bpchar tipo aos tipos existentes retornados pelo driver.
SQLGetTypeInfo = (types as table) as table =>
let
newTypes = #table(
{
"TYPE_NAME",
"DATA_TYPE",
"COLUMN_SIZE",
"LITERAL_PREF",
"LITERAL_SUFFIX",
"CREATE_PARAS",
"NULLABLE",
"CASE_SENSITIVE",
"SEARCHABLE",
"UNSIGNED_ATTRIBUTE",
"FIXED_PREC_SCALE",
"AUTO_UNIQUE_VALUE",
"LOCAL_TYPE_NAME",
"MINIMUM_SCALE",
"MAXIMUM_SCALE",
"SQL_DATA_TYPE",
"SQL_DATETIME_SUB",
"NUM_PREC_RADIX",
"INTERNAL_PRECISION",
"USER_DATA_TYPE"
},
// we add a new entry for each type we want to add
{
{
"bpchar",
-8,
65535,
"'",
"'",
"max. length",
1,
1,
3,
null,
0,
null,
"bpchar",
null,
null,
-9,
null,
null,
0,
0
}
}),
append = Table.Combine({types, newTypes})
in
append;
Definindo a cadeia de conexão
A cadeia de conexão do driver ODBC é definida usando o primeiro argumento para as funções Odbc.DataSource e Odbc.Query . O valor pode ser texto ou um registro M. Ao usar o registro, cada campo no registro se tornará uma propriedade na cadeia de conexão. Todas as cadeias de conexão exigem um Driver campo (ou DSN campo se você exigir que os usuários pré-configurem um DSN no nível do sistema). As propriedades relacionadas à credencial são definidas separadamente. Outras propriedades são específicas do driver.
O snippet de código abaixo mostra a definição de uma nova função de fonte de dados, a criação do ConnectionString registro e a invocação da função Odbc.DataSource .
[DataSource.Kind="SqlODBC", Publish="SqlODBC.Publish"]
shared SqlODBC.Contents = (server as text) =>
let
ConnectionString = [
Driver = "SQL Server Native Client 11.0",
Server = server,
MultiSubnetFailover = "Yes",
ApplicationIntent = "ReadOnly",
APP = "PowerBICustomConnector"
],
OdbcDatasource = Odbc.DataSource(ConnectionString)
in
OdbcDatasource;