Вопрос
Я пытаюсь подключиться к Sybase ASE 15 и позвоните по SP, который делает некоторый DML. Мне было интересно, есть ли у кого-то есть указатели на класс помощника Sybase Helper, аналогично SQLHelper.cs или, если у кого-то есть какие-либо указатели на любой код блога / пример.
В конце концов я буду мигрировать решение для SQL Server 2008 R2 (пару месяцев с данный момент), поэтому я хочу создать общую реализацию, которая может использоваться без особых изменений даже после миграции.
Решение
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
} }
Интерфейс
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);
}
}
- это так, таким образом будет вызывать явный сбор мусора
using (ISybaseDBHelper _DBHelper = ObjectFactory.GetDBHelper())
{
_DBHelper.InsertDataUsingStoredProcedure("usp_load_fx_spot_rate_into_staging", DatabaseEnum.Staging, input);
}
Другие советы
Если вы разрабатываете SQL для Sybase (или MS), вы лучше отказываются с использованием инструмента разработчика, такого как SQLPROGRAMMER или RAPE SQL. Улучшает производительность, устраняя ручной труд.
Если у вас нет этого, то утилиты, которые поставляются с Sybase, довольно адекватно, но вам нужно научиться использовать каталог. Либо ISQL для интерфейса символов или DBISQL, который предоставляет команды и окна ASTESTET в интерфейсе GUI.
После того, как у вас есть сеанс, открытый на сервере, введите следующие команды SQL. Эти операционные системы сохраняются процедуры, которые допрашивают каталог:
EXEC SP_HELP (Object_Name) - включая таблицы и отображения
exec sp_helptext.
Есть 30 таких опросов.
Я понимаю, что понимаете, что SPROCS может делать гораздо больше, чем простые вставки; Обработка различных типов данных в качестве параметров, и что ваш продушенный код - это просто простой пример, а не полный вариант. Как правило, чтобы включить сохраненные Procs для выполнения из приложений Java, нам нужно предоставить обертку (на стороне SQL).