2012-02-02 94 views
0

我正在寫查詢字符串直接放入存儲區的通用函數。該算法非常基本 - 通過查詢鍵循環,將它們用作參數名稱,同時將該值用作參數值。因此,它看起來就像是這樣的:有沒有辦法檢查參數是否在存儲過程中?

ArrayList pars = new ArrayList(); 
SqlParameter p; 
int tryInt; 
for (int i = 0; i < req.QueryString.Count; i++) 
{ 
    key = req.QueryString.AllKeys[i]; 

    if (int.TryParse(req[key], out tryInt)) 
    { 
     p = new SqlParameter("@" + key, SqlDbType.Int); 
     p.Value = tryInt; 
     pars.Add(p); 
    } 
} 

這工作得很好,到目前爲止,除了當然的所有查詢鍵必須爲存儲過程的參數相匹配,如果他們不,我得到一個SQL例外又說什麼

@someParameter is not a parameter for procedure some_sproc 

但我需要能夠傳遞查詢字符串中的變量不會傳遞到存儲過程,所以我需要一種方法來「忽略」它們。

有沒有辦法來測試一個給定的存儲過程是否需要某個參數?所以,我可以沿着這些路線

if (paramExists("@" + key, "some_sproc") && int.TryParse(req[key], out tryInt)) 
{ 
    p = new SqlParameter("@" + key, SqlDbType.Int); 
    p.Value = tryInt; 
    pars.Add(p); 
} 
+0

雖然我得到了我所需要的答案,我意識到我不想再拍DB調用。相反,我現在做的是,任何查詢變量,我想作爲一個參數傳遞給我在開始時使用@符號的名稱。因此,例如像這樣的查詢file.aspx?sproc=somesproc&@par1=param1&par2=param2將通過@ par1 sproc但不是par2 – ilia 2012-02-02 19:35:15

回答

3

您可以詢問ANSI information_schema.parameters觀點做一些事情,這將返回所有參數與他們的位置

SELECT parameter_name, ordinal_position FROM INFORMATION_SCHEMA.parameters 
WHERE SPECIFIC_NAME = 'some_sproc' 
+0

謝謝。這很有效,但我並沒有爲創建另一個數據庫調用這個想法而瘋狂,所以在想了一下之後,我想出了一個替代解決方案。我已經向我的帖子添加了評論的詳細信息。 – ilia 2012-02-02 19:35:44

0

大多數數據塊存儲「元數據」,如結構可訪問的系統表/視圖中的存儲過程。如果你使用MSS,我會查看sys.procedures和sys.parameters;加入這兩個視圖並按過程名稱篩選。

4

您可以使用SqlCommandBuilder獲得SP參數:

using (SqlConnection sqlConn = new SqlConnection(yourConnStr)) 
using (SqlCommand sqlCmd = new SqlCommand(yourProcedureName, sqlConn)) 
{ 
    sqlConn.Open(); 
    sqlCmd.CommandType = CommandType.StoredProcedure; 
    SqlCommandBuilder.DeriveParameters(sqlCmd); 
    // now you can check parameters in sqlCmd.Parameters 
} 

更多細節here

+0

當你說*現在你可以檢查參數*你是什麼意思?我該如何去做呢? – 2016-04-15 16:30:41

+1

@TotZam for(int i = 0; i Tomek 2016-04-19 12:48:04

相關問題