1

Microsoft SQL Server や PostgreSQL など、ストアド プロシージャを持つ SQL サーバーがいくつかあります。ストアド プロシージャ コールを実装するクライアント側オブジェクトもいくつかあります(TADOStoredProcDelphi、SqlCommand.NET Framework など)。

私がいつも聞きたかった質問は次のとおりです。

パラメータのバイナリ表現を使用して常に特別な効率的な方法で実行されるストアド プロシージャであるか、ストアド プロシージャのパラメータを表す超高度なオブジェクトであり、常にプレーン テキスト文字列に変換され、ストアド プロシージャは常にこのプレーン テキスト文字列を SQL サーバーに送信することによって実行されます。 ? (たとえば、1 つのテクノロジを取り上げましょう。それを SQL Server と ADO.NET とします)。

ADO.NET プロシージャのパラメータ名には意味がないことに気付きました。作成順序のみが重要であり、プレーン テキスト文字列のアイデアについて考えさせられます。

@Alex K. の更新

.NET で次のコードをテストしました。

CREATE PROCEDURE paramtest
@par1 nvarchar(50),
@par2 nvarchar(50),
@par3 nvarchar(50)
AS
  SELECT Res = '@par1 = ' + @par1 + '; @par2 = ' + @par2 + '; @par3 = ' + @par3
  RETURN 555

using System;
using System.Data.SqlClient;
using System.Data;

namespace SqlParamTest
{
    class Program
    {
        private static void addParam(SqlCommand cmd, string parameterName, ParameterDirection direction, SqlDbType dbType, int size, object value)
        {
            SqlParameter par = new SqlParameter(parameterName, dbType, size);
            par.Direction = direction;
            par.Value = value;
            cmd.Parameters.Add(par);
        }

        static void Main(string[] args)
        {
            using (SqlConnection conn = new SqlConnection(@"Data Source=localhost\sqlexpress;Initial Catalog=test;Integrated Security=True"))
            {
                SqlCommand cmd = conn.CreateCommand();
                cmd.CommandType = CommandType.StoredProcedure;
                cmd.CommandText = "paramtest";
                addParam(cmd, "@par3", ParameterDirection.Input, SqlDbType.NVarChar, 50, "third");
                addParam(cmd, "@par2", ParameterDirection.Input, SqlDbType.NVarChar, 50, "second");
                addParam(cmd, "@par1", ParameterDirection.Input, SqlDbType.NVarChar, 50, "first");
                addParam(cmd, "@Return", ParameterDirection.ReturnValue, SqlDbType.Int, 0, null);
                conn.Open();
                SqlDataReader rdr = cmd.ExecuteReader(CommandBehavior.CloseConnection);
                if (rdr.Read()) Console.WriteLine((string)rdr["Res"]);
                rdr.Close();
                Console.WriteLine("Return value: {0}", cmd.Parameters["@Return"].Value);
            }
            Console.ReadKey();
        }
    }
}

はい、それは正しい方法でパラメーターを維持しますが、Delphi のコードに従っているため、パラメーターに追加のチェックを追加するのは .NET だと思います。

procedure TMyClass.Test(Conn: TADOConnection);
var SP:TADOStoredProc;
begin
  SP := TADOStoredProc.Create(nil);
  try
    SP.Connection := Conn;
    SP.ProcedureName := 'paramtest';
    SP.Parameters.CreateParameter('@whatthehell', ftString, pdInput, 50, 'one');
    SP.Parameters.CreateParameter('@AnotherCrap', ftString, pdInput, 50, 'two');
    SP.Parameters.CreateParameter('?', ftString, pdInput, 50, 'three');
    SP.ExecProc;
  finally
    SP.Free;
  end;
end;

戻り値:

@par1 = one; @par2 = two; @par3 = three

パラメータの欠落について不平を言うことはありません。

pdReturnValue は、このパラメーターが他のパラメーターの前に作成された場合にのみ機能します。

4

1 に答える 1