Помогите с использованием .NET Generics / Dictionary в замене моих массивов - PullRequest
4 голосов
/ 08 марта 2011

Mypage.cs

string[] strParameterName = new string[2] {"?FirstName", "?LastName"};
    string[] strParameterValue = new string[2] {"Josef", "Stalin"};        
    MyConnection.MySqlLink(strConnection, strCommand, strParameterName, strParameterValue, dtTable);

Myclass.cs

public static void MySqlLink(string strConnection, string strCommand, string[] strParameterName, string[] strParameterValue, DataTable dtTable)
{
    dtTable.Clear();
    MySqlConnection MyConnection = new MySqlConnection(strConnection);
    MySqlCommand MyCommand = new MySqlCommand(strCommand, MyConnection);

    for (int i = 0; i < strParameterName.Length; i++)
    {
        MyCommand.Parameters.AddWithValue(strParameterName[i].ToString(), strParameterValue[i].ToString());
    }

    MySqlDataAdapter MyDataAdapter = new MySqlDataAdapter(MyCommand);
    MyDataAdapter.Fill(dtTable);
}

И тогда моя команда Sql будет выглядеть примерно так:

"SELECT * FROM MyTable WHERE FirstName=?FirstName AND LastName=?LastName"

Как видите,Я использую массивы для имени параметра и значения параметра, и они оба должны "совпадать" друг с другом и, конечно, использовать команду Sql.

Кто-то порекомендовал мне использовать .NET "Словарь" вместо массивов.Теперь я никогда не использовал это раньше.Может кто-нибудь показать мне сравнительный пример использования словаря .NET здесь?

Ответы [ 2 ]

2 голосов
/ 08 марта 2011

Поскольку BoltClock уже охватил словарный ответ - вот еще одна альтернатива для рассмотрения;информация о типе:

public static void MySqlLink(string strConnection, string strCommand,
    object args, DataTable dtTable)
{
    ....
        if (args != null)
        {
            foreach (PropertyInfo prop in args.GetType().GetProperties(
                System.Reflection.BindingFlags.Public
                | System.Reflection.BindingFlags.Instance))
            {
                MyCommand.Parameters.AddWithValue("?" + prop.Name,
                    Convert.ToString(prop.GetValue(args, null)));
            }
        }

с (у вызывающего)

var args = new {FirstName = "Josef",LastName = "Stalin"};

лично , хотя - мне нравится подход, который здесь использует LINQ-to-SQL;строка TSQL (например)

"SELECT * from Foo where Id = {0} and Status = {1}"

, и вы просто передаете params object[] параметров;код находит токены и изобретает имена аргументов для каждого @p0 и т. д. в случае сервера sql.

2 голосов
/ 08 марта 2011

Вместо передачи массива имен и массива значений, вы можете передать Dictionary<string, object>, который содержит имена параметров для ключей и произвольные объекты (в вашем случае, также строки) для значений, которые выхотите вставить в ваш запрос.

Каждый элемент содержит строку с именем вашего параметра и значением, которое он должен быть заменен.Они связаны с так называемыми парами ключ-значение и помогают сделать его более понятным для сопоставления имени и значения для вашего запроса.

Примерно так:

var parameters = new Dictionary<string, object>
{
    { "?FirstName", "Josef" }, 
    { "?LastName", "Stalin" }
};

MyConnection.MySqlLink(strConnection, strCommand, parameters, dtTable);

Здесь вы можете видеть, что использовать словарь проще, чем управлять двумя отдельными наборами параметров и значений соответственно.

В своем методе используйте цикл foreach с KeyValuePair<TKey, TValue> вместо цикла for счисловые индексы, такие как:

public static void MySqlLink(string strConnection, string strCommand, Dictionary<string, object> parameters, DataTable dtTable)
{
    dtTable.Clear();
    MySqlConnection MyConnection = new MySqlConnection(strConnection);
    MySqlCommand MyCommand = new MySqlCommand(strCommand, MyConnection);

    foreach (KeyValuePair<string, object> param in parameters)
    {
        MyCommand.Parameters.AddWithValue(param.Key, param.Value);
    }

    MySqlDataAdapter MyDataAdapter = new MySqlDataAdapter(MyCommand);
    MyDataAdapter.Fill(dtTable);
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...