0

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 には、ストアド プロシージャを呼び出すための特定の手順があることを認識しています。特に、このリンクで詳しく説明されている出力パラメーターを使用します。

http://infocenter.sybase.com/help/index.jsp?topic=/com.sybase.infocenter.dc20066.0215/html/adonet2155/Procedures_adodotnet_development.htm

しかし、私のユーザーは、1 つのスクリプトで複数のストアド プロシージャを呼び出せるようにしたいと考えています。誰でもアイデアはありますか?

ありがとう、

4

1 に答える 1

1

同僚と私は答えを見つけました。Sybase 接続文字列のフラグを変更する必要があります。これを接続文字列に追加します

;Named Parameters=false

これにより、ストアド プロシージャに渡された各パラメータをチェックしないように Ase クライアントに指示します。それが爆発した場合、それは完全に発信者にあります。OUTPUT パラメータを使用するときはいつでも NamedParameters = false を設定する必要があります。

于 2013-09-19T12:07:19.723 に答える