2014-10-28 81 views
2

我只是想知道是否有辦法執行存儲過程而無需命名參數。這意味着C#按照在存儲過程中聲明的順序解析參數。使用無名參數執行存儲過程

public static DataTable GetRelatedResources(string StoredProcedure, object[] Parameters) 
{ 
    var Results = new DataTable(); 

    try 
    { 
     using (SqlConnection conn = new SqlConnection()) 
     { 
      using (SqlCommand cmd = new SqlCommand(ConfigurationManager.ConnectionStrings["MK3Entities"].ConnectionString)) 
      { 
       conn.Open(); 
       cmd.Connection = conn; 
       cmd.CommandType = CommandType.StoredProcedure; 
       cmd.CommandText = StoredProcedure; 

       if (Parameters!= null) 
       { 
        foreach(var Param in Parameters) 
        { 
         // I Want To Do something like this 
         cmd.Parameters.AddWithValue(Param); 
        } 
       } 

       SqlDataAdapter adapter = new SqlDataAdapter(cmd); 
       adapter.Fill(Results); 
      } 
     } 
    } 
    catch (Exception ex) 
    { 
     MMSLogger.Instance.WriteToLog("Exception Executing Stored Procedure:" + ex.Message); 
    } 

    return Results; 
} 
+0

否;但你可以調用'DeriveParameters'來動態加載所需的參數(或者手動創建一個'EXEC'字符串) – 2014-10-28 14:48:51

+2

你的問題聽起來像是有什麼方法可以在我的腳上拍攝嗎?爲什麼?將參數傳遞給存儲過程時,您知道要傳遞哪個參數的數據,爲什麼不把名稱與它一起發送? – 2014-10-28 14:52:04

+0

序數參數傳遞通常不是可取的,並且可能導致很多[像這樣的問題](http://stackoverflow.com/a/26547211/314291)。如果你真的必須這樣做,那麼你可以使用[OleDb](http://stackoverflow.com/q/2407685/314291)而不是'SqlClient' – StuartLC 2014-10-28 14:53:14

回答

3

執行一個命令代替,並傳入參數 '@ P1', '@ P2' 等等:

cmd.CommandType = CommandType.Text; 
cmd.CommandText = 'exec ' + StoredProcedure; 

int i=0; 
string comma = ' '; 
foreach(var Param in Parameters) 
    { 
    var paramName = String.Format("@P{0}", i); 
    cmd.CommandText += comma + paramName; 
    cmd.Parameters.AddWithValue(paramName, Param); 
    ++i; 
    comma = ', '; 
    } 

注意AddwithValue是巨大的性能反模式。見How Data Access Code Affects Database Performance

+0

在這種情況下SQL注入是什麼? – BendEg 2014-10-28 15:03:54

+2

@BendEg:什麼是?仍然是參數化執行,並且沒有SQL是從用戶輸入構建的。 – 2014-10-28 15:08:26

+1

這一切都完美謝謝 – 2014-10-28 17:51:21

3

作爲每MSDN

的參數名稱在形式@paramname指定。您需要必須設置 ParameterName在執行依賴於參數的SqlCommand之前。

Another MSDN文章SqlCommand

無名,也稱爲序,參數不被 .NET Framework數據提供了SQL Server支持

因此答案是否定的,沒有命名參數就無法執行存儲過程。

3

你的意思是有點像導出的參數。這MSDN article給了概覽:

參數也可以從使用 DbCommandBuilder將類存儲過程的。 SqlCommandBuilder和OleDbCommandBuilder類都提供了一種靜態方法DeriveParameters,它可以自動填充使用存儲過程中的參數信息的命令 對象的參數集合。注意 DeriveParameters覆蓋該命令的任何現有參數信息 。

另一個解決辦法是從sql數據庫中獲取存儲過程的參數並將它們設置在您的代碼中。但是這需要一個額外的查詢。要獲取參數使用:

select * from dbo.parameters where specific_name='procedure-name' 

但無論如何,您必須使用參數名稱。