2012-02-04 20 views
7

私は従来のASPからASP.NETに切り替える予定です。そして私は以前の方法で簡単にやっていたいくつかの基本的なことをするのにはいくつか問題があります。以下は、数行でスカラークエリを実行するために使用した便利なASP関数です。私はその後、パラメータの配列を設定し、関数にそれを渡すだろうSQLパラメータと疑問符

SELECT TOP 1 UserName FROM Members WHERE (Created>?) AND (AdminLevel=?); 

FUNCTION ExecuteScalarParams(SQLQuery, Parameter_Array) 
Set cmd1 = Server.CreateObject("ADODB.Command") 
cmd1.ActiveConnection = con 
cmd1.CommandText = SQLQuery 
cmd1.CommandType = 1 

FOR ParamCount = 0 TO UBOUND(Parameter_Array) 
    cmd1.Parameters(ParamCount) = Parameter_Array(ParamCount) 
NEXT 'ParamCount 

Set rstScalar = cmd1.Execute() 

IF NOT rstScalar.EOF THEN 
    arrScalar = rstScalar.GetRows() 
    IF UBOUND(arrScalar,2) = 0 THEN 
     ExecuteScalarParams = arrScalar(0,0) 
    ELSE 
     ExecuteScalarParams = NULL 
    END IF 
ELSE 
    ExecuteScalarParams = NULL 
END IF 

rstScalar.Close 
Set rstScalar = Nothing 
Set cmd1 = Nothing 
END FUNCTION 

は、私はこのようなパラメータのプレースホルダとして疑問符を持つSQLクエリを渡すために使用

MyArray = ARRAY("1-JAN-2012",1) 

配列内のパラメータは、クエリ文字列内の疑問符を表示されている順序で置き換えます。

私はこの機能をC#で模倣しようとしていますが、パラメータを渡す必要がある部分に固執しています。これまでのところ、私は、このような代わりに疑問符の@Createdと@AdminLevelなどという名前のプレースホルダを使用する必要があり、その後、私はこのようなパラメータオブジェクトを設定する必要がポイントになった:

SqlParameter param = new SqlParameter(); 
param.ParameterName = "@AdminLevel"; 
param.Value = 1; 

方法はありますパラメータ名を設定せずにパラメータを渡し、疑問符とそれらのパラメータがどこに行くのかを指定する順序を使用するだけです。

+2

私はADO.Netは名前付きパラメータのみをサポートしていると信じています。申し訳ありません:) – dana

+0

+1 '次のParamCount' - 私はそれをした唯一の狂人だと思った! ; o) – Paul

答えて

3

編集:Danaによって指摘された通りMSDN Docs for Parametersは、SqlClientの名前付きパラメータを使用する必要があることを示していますが、OleDb/ODBCの定位置パラメータを使用できます。

以下のコードを使用すると、パラメータを追加するのが簡単になります。それは私が使用しているスケルトンですが、私はそれを行うより良い方法があると確信しています。

名前付きパラメータを使用する必要がありますが、@a、@b、@cという名前をつけてエクステントに疑問符をシミュレートすることはできます。 - 位置パラメータは、疑問符の数を常にカウントして、どのパラメータ値がどこに適用されているのかを判断しなければなりません。多くの場合、間違いが発生します。

using (var con = new SqlConnection(System.Configuration.ConfigurationManager.ConnectionStrings["ConnectionString"].ConnectionString)) 
{ 
    con.Open(); 
    { 
     using (var command = con.CreateCommand()) 
     { 
      command.Connection = conn; 
      command.CommandText = "SELECT * FROM [dbo].[Table] WHERE [c1] = @a AND [c2] = @b"; 
      command.Parameters.AddWithValue("@a", aVal); 
      command.Parameters.AddWithValue("@b", bVal); 
      command.CommandType = CommandType.Text; 

      using (var reader = command.ExecuteReader()) 
      { 
       if (reader.HasRows) 
       { 
        while (reader.Read()) 
        { 
         /// 
        } 
       } 
       else 
       { 
        /// 
       } 
      } 
     } 
    } 
} 
+0

OK、ありがとう!私がしたことは、疑問符の代わりにランダムな(しかしユニークな)パラメータ名を追加して、パラメータ名( '@'で始まる)のSQLクエリを解析して配列に保存し、 AddWithValueコマンドの他の配列(Parameter_Array)の値と組み合わせてください。私は構文解析関数のコードを共有しますが、このコメントには合いません。 – Osprey

+0

オリジナルの質問を編集し、必要に応じてそこにコードを追加することができます。個人的には、名前付きのパラメータを適切に使用できるように、コードを調整することを検討します。あなたの関数は、例えば、KeyValuePair としてSQLパラメータを受け取り、それらをループしてcommand.Parametersコレクションにマッピングします。 – akiller