Sybase API の AseCommand オブジェクトから Sybase SQL スクリプトを実行する際に問題が発生しています。これは私のスクリプトのコピーで、SQL 文字列パラメーターとして C# に渡されます。
SQL スクリプト:
DECLARE @dt DATETIME
DECLARE @mx INT
SELECT @dt = getDate()
EXEC DATABASE_NAME..StoredProcedure1
@id_own_grd = 200,
@id_dom_grd = 'TEST VALUE',
@value = @mx OUTPUT
EXEC DATABASE_NAME..StoredProcedure2
@id_level = @mx, @id_level_pt=NULL, @id_obj1 = 58464819,
@id_typ_lvl='TEST', @am_test=20130916, @id_obj1_sub = 12949,
@dt_start_lvl = '9/16/2013', @dt_end_lvl = '9/16/2013',@ct_blah=0,
@id_abs=" ", @id_obj1_trans=0,@am_obj1_vol=NULL, @am_obj3=-0.311095,
@id_obj_test = NULL, @id_obj5_test = NULL, @id_is_valid = '0',
@nm_db_origin='ORIGIN_DB', @id_owner=200
上記の SQL スクリプトを呼び出す C# コード:
public Dictionary<int, Dictionary<string, object>> ExecuteSqlQuery(string sql)
{
lock (this)
{
try
{
using (AseCommand command = new AseCommand(sql, Connection))
using (AseDataReader reader = command.ExecuteReader())
{
Log.Info("Executing Query: [" + sql + "] on " + DbSettings);
command.CommandTimeout = 120;
var results = new Dictionary<int, Dictionary<string, object>>();
var columns = new List<string>();
for (int i = 0; i < reader.FieldCount; i++)
{
columns.Add(reader.GetName(i));
}
int row = 0;
while (reader.Read())
{
Dictionary<string, object> rowResults = new Dictionary<string, object>();
results.Add(row, rowResults);
foreach (string item in columns)
{
rowResults.Add(item, reader[item]);
}
row++;
}
Log.Info("Finished Executing Query: [" + sql + "] on " + DbSettings + " in " + timer.TimeTaken());
return results;
}
}
catch (Exception e)
{
Log.Error("An error occured executing query SQL: " + e.Message, e);
throw;
}
}
}
上記のスクリプトを実行しようとすると、Sybase.Data.AseClient.AseException がスローされてキャッチされ、「パラメータの量が無効です」と表示されます。この C# コードは、ストアド プロシージャを呼び出さない他のすべてのコードで機能します。Sybase には、ストアド プロシージャを呼び出すための特定の手順があることを認識しています。特に、このリンクで詳しく説明されている出力パラメーターを使用します。
しかし、私のユーザーは、1 つのスクリプトで複数のストアド プロシージャを呼び出せるようにしたいと考えています。誰でもアイデアはありますか?
ありがとう、