El controlador ODBC de SQL Server no genera errores

Esta pregunta forma parte de una serie de errores en el controlador ODBC de Microsoft:

El controlador ODBC no puede generar errores; sino que los suprimeLeer columnas fuera de servicio devuelve resultados incorrectosNo se puede ejecutar un procedimiento almacenado que sea un SINONIMO

Microsoft ha dicho que no corregirán estos errores en su controlador ODBC.

Antecedentes

Si tengo una tabla de muestra:

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

Intento emitir sql que se inserta en la tabla sin especificar un valor para elNO NULO Columna WalletID:

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

SQL Server da un error:

(1 fila (s) afectada)
Mensaje 515, Nivel 16, Estado 2, Línea 2
No se puede insertar el valor NULL en la columna 'WalletID', tabla 'Scratch.dbo.Wallet'; columna no permite nulo, s. INSERTAR falla.
La instrucción se ha terminado.

Y eso tiene sentido.

Al conectarse con ADO / OLEDB y el proveedor OLE DB de SQL Server (SQLOLEDB):

Proveedor = SQLOLEDB; Fuente de datos = hyperion; ID de usuario = Contoso; Contraseña = Trub4dor;

Y ejecuto elINSERTAR, la infraestructura ADO / OLEDB / COM devuelve un error, que vuelve al lenguaje de alto nivel como una excepción:

No se puede insertar el valor NULL en la columna 'WalletID', tabla 'Wallet'; La columna no permite nulos. INSERTAR falla

Y todo eso tiene sentido.

Pero pruébelo con el controlador ODBC

Con la derpricación de esoCliente nativo Proveedores de OLE DB (yla recomendación de MS de que no use elCliente nativo Controladores ODBC), pensé que intentaría usar elservidor SQL Controlador ODBC:

Proveedor = MSDASQL; Controlador = {SQL Server}; Servidor = {hyperion}; UID = {Contoso}; PWD = {Trub4dor};

Actualización: no en desuso: Seis años después, Microsoft tieneanunció el desuso de la compatibilidad con OLE DB para SQL Servery las creaciones de un tercer controlador OLE DB para SQL Server: msoledbsql.(archivo)

Anteriormente, Microsoftanunció el desuso del proveedor Microsoft OLE DB para SQL Server, parte del SQL Server Native Client (SNAC). En ese momento, se tomó esta decisión para tratar de proporcionar más simplicidad para la historia del desarrollador sobre el desarrollo de software nativo de Windows a medida que avanzamos en la era de la nube con Azure SQL Database, y para tratar de aprovechar las similitudes de JDBC y ODBC para los desarrolladores. Sin embargo, durante las revisiones posteriores se determinó que la desaprobación era un error porque los escenarios sustanciales dentro de SQL Server todavía dependen de OLE DB y cambiarlos rompería algunos escenarios de clientes existentes.

Con esto en mente, hemos decididodesaprobar OLE DB y lanzar una nueva versión porel primer trimestre del año calendario 2018 Marzo 2018.

Emite mi lote:

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

Me sorprendió saber esa misma declaración SQL:

eso desencadena unINSERT FAILS error en el propio SQL Server:

que da como resultado un error del lado del cliente al usar el proveedor OLE DB de SQL Server

serásilenciosamente falla al usar el controlador ODBC. La declaración se ejecuta sin que se genere ningún error.

Estuve confundido durante aproximadamente una hora cuando mis declaraciones SQL se ejecutaron sin error, pero las filas no aparecerían en la base de datos.

Falla silenciosa

Obviamente un fracaso silencioso no es bueno.

Y obviamente no puedo usarelservidor SQL Controlador ODBC,y seguir usandoelProveedor Microsoft OLE DB para SQL Server proveedor.

Pero que esta pasando?

¿Cómo le digo al controlador ADO-OLEDB-ODBC que informe errores? ¿Es una configuración de cadena de conexión ODBC? ¿Es una configuración de cadena de conexión MSDASQL?

Psuedocódigo de muestra

De hecho, estoy usando Delphi con ADO. Pero lo transcodificaré en pseudo código de estilo C # para facilitar la comprensión conceptual.

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]);

En realidad, la comprobación de laHRESULT es manejado por la infraestructura de lenguaje y la magia del compilador, lanzando una excepción de idioma nativo siFAILED.

Respuestas a la pregunta(2)

Su respuesta a la pregunta