2012-02-04 70 views
7

我正在從傳統的ASP切換到ASP.NET。我在做一些基本的東西時遇到了一些麻煩,我曾經很容易用舊的方法做。下面是我用來用幾行執行標量查詢的方便的ASP函數。SQL參數和問號

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查詢作爲佔位的參數是這樣的:

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

我將然後設置參數陣列並將其傳遞給該函數:

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

數組中的參數將按它們出現的順序替換查詢字符串中的問號。

我想在C#中模仿這個函數,但我卡在必須傳遞參數的部分。到目前爲止,我的地方,我必須使用指定的地點持有者如@Created和@AdminLevel而不是問號,然後我要成立這樣的參數對象的點:

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

是否有辦法傳遞參數而不必設置參數名稱,並簡單地使用問號和它們出現的順序來指定哪個參數在哪裏?

+2

我相信ADO.Net只支持命名參數。對不起:) – dana 2012-02-04 14:49:06

+0

+1爲'下一個'ParamCount' - 我以爲我是唯一一個這樣做的瘋子! ; o) – Paul 2014-10-15 08:39:17

回答

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

好的,謝謝!我所做的是添加隨機(但唯一)參數名稱而不是問號,然後創建一個函數來解析SQL查詢中的參數名稱(以'@'開頭),並將它們保存在一個數組中,然後將其用於與AddWithValue命令的另一個數組(Parameter_Array)中的值結合使用。我會分享解析函數的代碼,但它不適合這個評論。 – Osprey 2012-02-04 15:54:58

+0

如果您願意,您可以編輯原始問題並在其中添加代碼。就我個人而言,我會考慮調整您的代碼,以便您仍然可以正確使用命名參數;讓函數接受SQL參數作爲KeyValuePair 作爲實例,然後遍歷它們,將其映射到您的command.Parameters集合。 – akiller 2012-02-04 16:16:46