Classe Sybasehelper?
-
25-09-2019 - |
Pergunta
Estou tentando me conectar ao Sybase ASE 15 e ligar para um SP que faz algum DML. Eu queria saber se alguém tem algum ponteiro para uma classe auxiliar Sybase análoga ao sqlhelper.cs ou se alguém tem alguma dica para qualquer blog / código de amostra.
Eventualmente, estarei migrando a solução para o SQL Server 2008 R2 (alguns meses daqui), então quero criar uma implementação genérica que possa ser usada sem muita alteração, mesmo após a migração.
Solução
public class SybaseDBHelper : ISybaseDBHelper
{
private AseConnection conn;
private AseCommand cmd;
private AseDataAdapter adapter;
private DataSet outDS;
protected static readonly ILog _logger = LogManager.GetLogger(typeof (SybaseDBHelper));
#region InsertData
public int InsertDataUsingStoredProcedure(string storedProcedureName, DatabaseEnum dbName, List<AseParameter> parameters)
{
var connFactory = new ConnectionFactory();
int _errorCode = 0;
string connectionString = connFactory.GetConnectionString(dbName);
using (conn = connFactory.GetAseConnectionString(connectionString))
{
try
{
conn.Open();
if (conn.State == ConnectionState.Open)
{
using (cmd = conn.CreateCommand())
{
cmd.CommandType = CommandType.StoredProcedure;
cmd.CommandText = storedProcedureName;
if (parameters != null )
{
foreach (AseParameter param in parameters)
{
cmd.Parameters.Add(param);
}
}
_errorCode = cmd.ExecuteNonQuery();
}
}
}
catch (AseException ex)
{
_logger.ErrorFormat("Error Inserting Data into Database {0}", ex);
throw;
}
finally
{
conn.Close();
}
}
return _errorCode;
}
#endregion
#region IDisposable Members
public void Dispose()
{
Dispose(true);
}
protected virtual void Dispose(bool disposing)
{
if (disposing)
{
conn.Dispose();
conn = null;
GC.SuppressFinalize(this);
}
}
#endregion
} }
Interface
using System;
using System.Collections.Generic;
using System.Data;
using LiabilitiesMI.Common.DataObjects;
using Sybase.Data.AseClient;
namespace LiabilitiesMI.Common.Interfaces
{
public interface ISybaseDBHelper : IDisposable
{
DataSet GetDataUsingStoredProcedure(string storedProcedureName, DatabaseEnum dbName, List<AseParameter> parameters);
int InsertDataUsingStoredProcedure(string storedProcedureName, DatabaseEnum dbName, List<AseParameter> parameters);
}
}
-Calling Thal Way invocará a coleta explicita de lixo
using (ISybaseDBHelper _DBHelper = ObjectFactory.GetDBHelper())
{
_DBHelper.InsertDataUsingStoredProcedure("usp_load_fx_spot_rate_into_staging", DatabaseEnum.Staging, input);
}
Outras dicas
Se você estiver desenvolvendo SQL para Sybase (ou MS), é melhor usar uma ferramenta de desenvolvedor, como SQLProgrmermer ou Rapid SQL. Melhora a produtividade, eliminando o trabalho manual.
Se você não tem isso, os utilitários que acompanham o Sybase são bastante adequados, mas você precisa aprender a usar o catálogo. O ISQL para uma interface de caractere ou DBISQL que fornece Windows de comando e resultado em uma interface GUI.
Depois de abrir uma sessão no servidor, digite os seguintes comandos SQL. Esses executam procedimentos armazenados do sistema que interrogam o catálogo:
EXEC SP_HELP (Object_Name) - incluindo tabelas e sproces
EXEC SP_HELPTEXT
Existem 30 desses interrogatórios.
Suponho que você perceba que os sprocs podem fazer muito mais do que inserções simples; Lidar com vários tipos de dados como parâmetros e que seu código publicado é apenas um exemplo simples, não o quid completo. Geralmente, para ativar os Procs armazenados para execução de aplicativos Java, precisamos fornecer um invólucro (no lado SQL).