mercoledì 1 dicembre 2010

Ase 12 vs Ase 15 ( 12.5.x )

Posto di avere una semplice applicazione che utilizza i ODBC per connettersi a SyBase e posto quindi di avere come versione Ase la 12 (senza accedere tramite i connettori per .Net forniti da SyBase), ci si accorge subito o quasi che rispetto alle chiamate ODBC c'e' qualche differenza.
Se poi l'oggetto è attuare una migrazione fra 12 > 15 ci si imbatte in molte differenze...

L'esmpio è una chimata ad una Stored Procedure che accetta n parametri..

OdbcConnection odbcCnn = new OdbcConnection();

odbcCnn.ConnectionString = _connectionstring;

odbcCnn.Open();

OdbcCommand odbcCommand = new OdbcCommand();

odbcCommand.Connection = odbcCnn;

odbcCommand.CommandType = CommandType.StoredProcedure;

// Questa funziona Ma non è la sintassi ODBC
// funziona con il 12 ..
// non funziona con il 15 (12.5.x)
odbcCommand.CommandText = "{call sp_TestParams(?,?)}";

// Questa non funziona Ma è la sintassi ODBC
// funziona con il 15 ..
// non funziona con il 12
odbcCommand.CommandText = "exec sp_TestParams(@,@)";

odbcCommand.Parameters.Add(p1);
odbcCommand.Parameters.Add(p2);

odbcCommand.ExecuteNonQuery();

odbcCnn.Close();

In questo secondo esempio si applica alla possibile attività anche una transazione...

OdbcTransaction odbcTransact = null;

odbcCnn.ConnectionString = _connectionstring;

odbcCnn.Open();

odbcTransact = odbcCnn.BeginTransaction(IsolationLevel.Serializable);

//
// questo command è necessario per
// Ase 15 (12.5.x)
// MA non necessario per la 12
// potrebbe dare errori a run Time
//
OdbcCommand odbcCommandChained = new OdbcCommand();
odbcCommandChained.Connection = odbcCnn;
odbcCommandChained.Transaction = odbcTransact;
odbcCommandChained.CommandType = CommandType.StoredProcedure;
odbcCommandChained.CommandText = "SET CHAINED OFF";
odbcCommandChained.ExecuteNonQuery();


OdbcCommand odbcCommand = new OdbcCommand();
odbcCommand.Connection = odbcCnn;
odbcCommand.Transaction = odbcTransact;
odbcCommand.CommandType = CommandType.StoredProcedure;

// Questa funziona Ma non è la sintassi ODBC
// funziona con il 12 ..
// non funziona con il 15 (12.5.x)
odbcCommand.CommandText = "{call sp_TestParams(?,?)}";

// Questa non funziona Ma è la sintassi ODBC
// funziona con il 15 ..
// non funziona con il 12
odbcCommand.CommandText = "exec sp_TestParams(@,@)";

odbcCommand.Parameters.Add(p1);
odbcCommand.Parameters.Add(p2);

odbcCommand.ExecuteNonQuery();

odbcTransact.Commit();

odbcCnn.Close();

Le differenze che notato non sono proprio un "piccolo impatto" anzi il costo per modificare un applicazione valutando eventualmente il passaggio dalla 12 > 15.

C'è da dire che non è detto che sia necessario invocare la SET CHAINED OFF, ma nel caso lo si dovesse affrontare questa situazione risulta o può risultare necessario impostarla a ON alla fine delle nostre attività.

E' possibile che vi siano molte altre differenze che ancora non ho trovato, ma penso (mi auguro) che visto il possibile allineamento alla sintassi ODBC, renda più semplice la conversione.