質問
sybase ASE 15 に接続し、DML を実行する SP を呼び出そうとしています。SQLhelper.cs に類似した sybase ヘルパー クラスへのポインタを持っている人がいるかどうか、またはブログやサンプル コードへのポインタを持っている人がいるかどうか疑問に思っていました。
最終的には (今から数か月後) ソリューションを 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);
}
}
- explicitiゴミを呼び出します。この方法でそれを呼び出すコレクション
using (ISybaseDBHelper _DBHelper = ObjectFactory.GetDBHelper())
{
_DBHelper.InsertDataUsingStoredProcedure("usp_load_fx_spot_rate_into_staging", DatabaseEnum.Staging, input);
}
他のヒント
Sybase (または MS) 用の SQL を開発している場合は、SQLProgrammer や Rapid SQL などの開発者ツールを使用するのが最善です。肉体労働を排除することで生産性が向上します。
それがない場合は、Sybase に付属のユーティリティで十分ですが、カタログの使い方を学ぶ必要があります。文字インターフェイス用の isql か、GUI インターフェイスでコマンド ウィンドウと結果セット ウィンドウを提供する DBISQL のいずれかです。
サーバー上でセッションを開いたら、次の SQL コマンドを入力します。これらは、カタログを問い合わせるシステム ストアド プロシージャを実行します。
exec sp_help (object_name) -- テーブルと sproc を含む
exec sp_helptext
このような尋問は 30 件あります。
sproc は単純な INSERTS よりもはるかに多くのことができることを理解していると思います。さまざまなデータ型をパラメータとして処理できること、投稿されたコードは単なるサンプルであり、完全なコードではないことを理解してください。一般に、ストアド プロシージャを Java アプリから実行できるようにするには、(SQL 側で) ラッパーを提供する必要があります。