2011-02-03 57 views
3

目前,我正在爲每個mysql查詢創建一個新方法,參數我想要執行。 一個例子:自動奇蹟般地在C#中添加MySQL參數

public DataTable RetreiveAllLinks(int id, int categoryid) 
{ 
    const string request = 
    @" 
     SELECT * 
     FROM links 
     WHERE id=?id,categoryid=?categoryid 
     ORDER by id DESC 
    "; 
    using (var query = new MySqlCommand(request)) 
    { 
     query.Parameters.AddWithValue("?id", id); 
     query.Parameters.AddWithValue("?categoryid", categoryid); 
     return _connection.RetreiveData(query); 
    } 
} 

這真是讓我心煩,因爲我總是以10-30查詢結束,當兩個查詢可以做到這一點對我來說,檢索非參數查詢的簡單方法,和一個參數的方法。例如

public DataTable NonParameterCommand(string r) 
{ 
    var request = r; 
    using (var query = new MySqlCommand(request)) 
    { 
     return _connection.RetreiveData(query); 
    } 
} 

我想要做的,是一些正則表達式,在那裏我會說,例如,

var pPattern = "^[\\?][\\w]"; 

然後一個請求和一個列表作爲參數的方法,並且該列表應該與請求參數的順序相同。因此,如果該請求是

`"SELECT * FROM test WHERE id=?id,categoryid=?categoryid"` 

那麼我的名單看起來像

var _dictionary = new Dictionary<string, string>(); 
_dictionary.Add(_parameter, _value); 

和我的方法

ParameterCommand(string r, Dictionary dic) 

但究竟如何?

+1

+1對於問題和自動使用術語...愛它! – 2011-06-14 01:25:32

回答

2

如果您使用的是字典,那麼該鍵將已經是參數名稱。爲什麼解析查詢來提取它們?

你可以這樣做:

public DataTable CommandWithParams(string sql, Dictionary<string, object> parameters) 
{ 
    using (var query = new MySqlCommand(sql)) 
    { 
     foreach (var param in parameters) 
     { 
      query.Parameters.AddWithValue(param.Key, param.Value); 
     } 
     return _connection.RetreiveData(query); 
    } 
} 

調用它:

var parameters = new Dictionary<string, object>() 
{ 
    { "?param1", value1 }, 
    { "?param2", value2 } 
}; 

var result = CommandWithParams(query, parameters); 

但是,也許你想使用一個列表,而不是一個解釋嗎?
(我不會推薦它,根據它們的位置傳遞參數值會很容易出錯)

+1

是的,這正是我一直在尋找的。這對我來說似乎非常明顯。我真的認爲我必須做一些瘋狂的正則表達式,並添加foreach的foreach參數。這幫了我很多,謝謝! – srn 2011-02-03 15:35:06

相關問題