2012-05-19 46 views
0

我正在寫一個應用程序,它首先連接到數據庫並檢索包含所有存儲過程,輸入及其關聯數據類型列表的dt。然後用戶從組合框中選擇一個SProc,並輸入必要的輸入。然後,應用程序將連接到數據庫,並使用用戶指定的輸入運行選定的SProc,並將結果返回到數據表中。c#和存儲過程,每個SProc的唯一代碼?

我不確定的是如果我需要爲每個SProc寫一個特定的方法。我假設,因爲我沒有看到我怎麼能說出什麼參數是否則。

道歉,第一次沒有明確說明。讓我知道如果這還不夠清楚。

示例如下所示(這是別人的代碼)

public static GetDaysDTO GetDays(int offset) 
    { 
     GetDaysDTO ret = new GetDaysDTO { TODAY = DateTime.Now, TOMORROW = new DateTime(2012, 01, 01) }; 
     SqlConnection con = new System.Data.SqlClient.SqlConnection(@"Server = FrazMan-pc\Programming; Database = master; Trusted_Connection = True"); 
     SqlCommand cmd = new System.Data.SqlClient.SqlCommand 
     { 
      CommandText = "GetDays", 
      CommandType = System.Data.CommandType.StoredProcedure, 
      CommandTimeout = 1, 
      Connection = con, 
      Parameters = { new System.Data.SqlClient.SqlParameter("@offset", System.Data.SqlDbType.Int) { Value = offset } } 
     }; 
     using (con) 
     { 
      con.Open(); 
      using (System.Data.SqlClient.SqlDataReader reader = cmd.ExecuteReader()) 
      { 
       while (reader.Read()) 
       { 
        ret.TODAY = DateTime.Parse(reader[0].ToString()); 
        ret.TOMORROW = DateTime.Parse(reader["TOMORROW"].ToString()); 
       } 
      } 
     } 

     return ret; 
    } 
+0

如果您在返回表,你應該使用的函數不是存儲過程。你的問題有點不清楚。你能否詳細說明一下,以便我能理解你想達到的目標。 –

回答

2

什麼你要找的是所謂的工廠設計模式和方法來判斷哪些類型的數據表中創建每個SP通話
如果每個過程的參數列表中,ü可以通過環實例參數對象:
這個類將被用來填補SP的PARAMS從DB收到

class ParamData 
{ 
    public object Data; 
    public SqlDbType type; 
    public string ParamName; 
} 


,然後後來,調用SP時,U應該也通過thie ParamData對象的方法,並用它來填充烏爾SP動態地的PARAMS在一個循環:

List<ParamData> list = new List<ParamData>(); 
//initialize command here as u did 
SqlCommand cmd; 
foreach (ParamData param in list) 
{ 
    SqlParameter sqlParam = new SqlParameter(param.ParamName, param.type); 
    sqlParam.Value = param.Data; 
    cmd.Parameters.Add(sqlParam); 
} 
//execute the command 
//fill the datatable with result 
DataTable dt = GetTableBySPName("GetDays"); 
SqlDataReader reader = cmd.ExecuteReader(); 
dt.Load(reader); 


您需要添加的唯一東西是在程序中通過ur類型化數據表與返回的表之間的映射。
您可以添加到做到這一點的方法:

private DataTable GetTableBySPName(string name) 
{ 
    DataTable dt = null; 
    switch (name) 
    { 
    case "GetDays": 
    { 
    dt = new GetDatsDTO(); 
    break; 
    } 
    } 
return dt; 
} 


+0

感謝您花時間回覆。我不熟悉工廠設計模式,所以它可能是即時通訊尋找但我不知道。第二個代碼塊Foreach(列表中的ParamData參數)我不明白我可以傳遞多個變量,每個變量都有可能不同的數據類型?或者我錯過了什麼? –

+0

另請注意,在我的Parameter類中,每個參數的數據類型都是OBJECT,它是基類.net中所有其他類繼承的基類,也是(出於同樣的原因)類SqlCommand的參數accept作爲參數。 – YavgenyP

+0

也許我還沒有做出這個特別清楚(對不起)或即時通訊愚蠢:(我已經有一個DT的存儲過程等列表,並填寫了組合框。顯式聲明參數「Parameters = {new System.Data.SqlClient.SqlParameter(」@ offset「,System.Data.SqlDbType.Int)」我想知道是否有可能傳入所有輸入數組我不會爲每個存儲過程編寫這種方法,這是否有意義? –

相關問題