Driver ODBC do SQL Server não gera erros

Esta pergunta faz parte de uma série de erros no driver ODBC da Microsoft:

O driver ODBC falha ao gerar erros; mas suprime-osLer colunas fora de ordem retorna resultados incorretosNão é possível executar um procedimento armazenado que é um SYNONYM

A Microsoft disse que não corrigirá esses erros no driver ODBC.

fundo

Se eu tiver uma tabela de amostra:

CREATE TABLE Wallet (
    WalletID int NOT NULL,
    Name varchar(50) NOT NULL
)

Eu tento emitir sql que insere na tabela sem especificar um valor para oNÃO NULO Coluna WalletID:

INSERT INTO Wallet (WalletID, Name) VALUES (1, 'Fan')
INSERT INTO Wallet (Name) VALUES ('Ardent Defender') --Constraint violation

O SQL Server apresenta um erro:

(1 linha (s) afetada)
Mensagem 515, nível 16, estado 2, linha 2
Não é possível inserir o valor NULL na coluna 'WalletID', tabela 'Scratch.dbo.Wallet'; A coluna não permite nulo, s. INSERT falha.
A instrução foi encerrada.

E isso faz sentido.

Ao conectar usando o ADO / OLEDB e o SQL Server OLE DB Provider (SQLOLEDB):

Fornecedor = SQLOLEDB; Fonte de dados = hyperion; ID do usuário = Contoso; Senha = Trub4dor;

E eu executo oINSERIR, a infraestrutura ADO / OLEDB / COM retorna uma falha, que volta ao idioma de alto nível como uma exceção:

Não é possível inserir o valor NULL na coluna 'WalletID', tabela 'Wallet'; A coluna não permite nulos. INSERT falha

E isso tudo faz sentido.

Mas tente com o driver ODBC

Com a depreciação dissoCliente Nativo Provedores OLE DB (ea recomendação da MS de que você não usa oCliente Nativo Drivers ODBC), pensei em tentar a minha mão usando oservidor SQL Driver ODBC:

Provedor = MSDASQL; Driver = {SQL Server}; Servidor = {hyperion}; UID = {Contoso}; PWD = {Trub4dor};

Atualização - Não Reprovado: Seis anos depois, a Microsoftanunciou a desaprovação do suporte do OLE DB ao SQL Servere as criações de um terceiro driver OLE DB para SQL Server: msoledbsql.(arquivo)

Anteriormente, a Microsoftdescontinuação anunciada do Microsoft OLE DB Provider para SQL Server, parte do SQL Server Native Client (SNAC). Na época, essa decisão foi tomada para tentar fornecer mais simplicidade à história do desenvolvedor em torno do desenvolvimento de software nativo do Windows à medida que avançamos para a era da nuvem com o Banco de Dados SQL do Azure e para tentar aproveitar as semelhanças de JDBC e ODBC para desenvolvedores. No entanto, durante as análises subseqüentes, foi determinado que a depreciação era um erro, porque os cenários substanciais no SQL Server ainda dependem do OLE DB e a alteração deles quebraria alguns cenários existentes do cliente.

Com isso em mente, decidimosundeprecate OLE DB e libere uma nova versãoo primeiro trimestre do ano civil de 2018 Março de 2018.

Emito meu lote:

INSERT INTO Wallet (WalletID, Name) VALUES (1, 'Fan')
INSERT INTO Wallet (Name) VALUES ('Ardent Defender')

Fiquei surpreso ao saber a mesma instrução SQL:

que desencadeia umaINSERT FAILS erro no próprio SQL Server:

que resulta em um erro do lado do cliente ao usar o provedor OLE DB do SQL Server

vaisilenciosamente falha ao usar o driver ODBC. A instrução é executada sem que nenhum erro seja gerado.

Fiquei confuso por cerca de uma hora quando minhas instruções SQL foram executadas sem erros, mas as linhas não apareceriam no banco de dados.

Falha silenciosa

Obviamente, uma falha silenciosa não é boa.

E, obviamente, eu simplesmente não posso usaraservidor SQL Driver ODBC,e continue usandoaProvedor Microsoft OLE DB para SQL Server fornecedor.

Mas o que está acontecendo?

Como posso informar o driver ADO-OLEDB-ODBC para relatar erros. É uma configuração de cadeia de conexão ODBC? É uma configuração de cadeia de conexão MSDASQL?

Psuedocode de amostra

Na verdade, estou usando o Delphi com o ADO. Mas vou transcodificá-lo para o pseudo código do estilo C # para facilitar o entendimento conceitual.

String commandText = 
      "INSERT INTO Wallet (WalletID, Name) VALUES (1, 'Fan')"+CRLF+
      "INSERT INTO Wallet (Name) VALUES ('Ardent Defender')";

ADOConnection conn = new ADOConnection();
conn.ConnectionString = szConnectionString;
conn.Open();

HRESULT hr = conn.Execute(commandText, ref recordsAffected, [eoExecuteNoRecords]);

Na realidade, a verificação doHRESULT é tratado pela infraestrutura de idiomas e pela mágica do compilador - lançando uma exceção de idioma nativo seFAILED.

questionAnswers(2)

yourAnswerToTheQuestion