sql >> Database >  >> RDS >> Database

ODBC-verbindingskenmerken instellen zonder code te hoeven schrijven

Onlangs vroeg een klant die ons SQL Server ODBC-stuurprogramma gebruikte om Oracle® op Linux te verbinden met SQL Server, of het mogelijk was om het snapshot-isolatieniveau van een ODBC-gegevensbron in te schakelen.

U kunt dit isolatieniveau inschakelen door een verbindingskenmerk in te stellen in een SQLSetConnectAttr-aanroep. Deze methode is echter niet van toepassing als u geen toegang heeft tot de broncode van de applicatie, zoals bij onze Oracle®-klant het geval was.

Als alternatief kunt u een mechanisme gebruiken dat wordt geleverd door de unixODBC Driver Manager om verbindingskenmerken in te stellen:

DMConnAttr=[attribute]=value

Opmerking U hebt 1.9.10+ van het SQL Server ODBC-stuurprogramma nodig om verbindingskenmerken in te stellen via DMConnAttr .

Het relevante attribuut en de waarde voor het momentopname-isolatieniveau zijn opgenomen in het SQL Server-headerbestand sqlncli.h, dat is opgenomen in de SQL Server ODBC-stuurprogrammadistributie:

#define SQL_COPT_SS_BASE            1200
#define SQL_TXN_SS_SNAPSHOT              0x00000020L
#define SQL_COPT_SS_TXN_ISOLATION        (SQL_COPT_SS_BASE+27)

wat ons de volgende regel geeft om toe te voegen aan onze ODBC-gegevensbron:

DMConnAttr=[1227]=\32

1227 is het attribuut (1200+27) en 32 is de waarde (de decimale waarde van 0x00000020L is 32).

Om te testen of onze instellingen correct waren, hebben we:

$ more /etc/odbc.ini

[SQLSERVER_SAMPLE]
Driver=Easysoft ODBC-SQL Server
Server=myserver
Port=50217
Database=adventureworks
User=sa
Password=p455w0rd

$ /usr/local/easysoft/unixODBC/bin/isql.sh -v SQLSERVER_SAMPLE

SQL> SELECT CASE transaction_isolation_level WHEN 1 THEN 'ReadUncommitted'
WHEN 2 THEN 'ReadCommitted' WHEN 3 THEN 'Repeatable'
WHEN 4 THEN 'Serializable' WHEN 5 THEN 'Snapshot' END
FROM sys.dm_exec_sessions where session_id = @@SPID

ReadCommitted

 more /etc/odbc.ini

[SQLSERVER_SAMPLE]
Driver=Easysoft ODBC-SQL Server
Server=myserver
Port=50217
Database=adventureworks
User=sa
Password=p455w0rd
DMConnAttr=[1227]=\32

$ /usr/local/easysoft/unixODBC/bin/isql.sh -v SQLSERVER_SAMPLE

SQL> SELECT CASE transaction_isolation_level WHEN 1 THEN 'ReadUncommitted'
WHEN 2 THEN 'ReadCommitted' WHEN 3 THEN 'Repeatable'
WHEN 4 THEN 'Serializable' WHEN 5 THEN 'Snapshot' END
FROM sys.dm_exec_sessions where session_id = @@SPID

Snapshot

  1. Hoe een lijst met datums tussen twee datums in mysql select query te krijgen

  2. Emuleren MySQL LIMIT-clausule in Microsoft SQL Server 2000

  3. ODBC-toegang vanaf Windows Server Core

  4. MariaDB VERSIE() Uitgelegd