Использование SqlCommand, как добавить несколько параметров в свой объект, вставка через winform в таблицу SQL - PullRequest
1 голос
/ 31 марта 2011

У меня есть десять текстовых полей в моей winform, и мне нужно сохранить текст, набранный в этих текстовых полях, в 10 столбцов таблицы базы данных sql. Итак, для этого я должен написать:

INSERT INTO item (c1,c2,c3...,c10) values (@a,@b....@j) 

cmd.Parameters.Add("@a",SqlDbType.Varchar)
cmd.Parameteres["@a"].Value=textbox1.Text;

cmd.Parameters.Add("@b",SqlDbType.Varchar)
cmd.Parameteres["@b"].Value=textbox2.Text;.
.
.
.
.
cmd.Parameters.Add("@j",SqlDbType.Varchar)
cmd.Parameteres["@j"].Value=textbox10.Text;

ИЛИ десять отдельных запросов для каждого текстового поля:

INSERT INTO item (c1) values (@a)
cmd.Parameters.Add("@a",SqlDbType.Varchar)
cmd.Parameteres["@a"].Value=textbox1.Text;

INSERT INTO item (c2) values (@b) 
cmd.Parameters.Add("@b",SqlDbType.Varchar)
cmd.Parameteres["@b"].Value=textbox2.Text;.
.
.
INSERT INTO item (c10) values (@j)
cmd.Parameters.Add("@j",SqlDbType.Varchar)
cmd.Parameteres["@j"].Value=textbox10.Text;

или, пожалуйста, предложите эффективный код.

Как добавить несколько параметров в cmd одним оператором? это возможно?

Ответы [ 4 ]

10 голосов
/ 31 марта 2011

Вы можете использовать метод расширения, например:

public static class DbCommandExtensions
{
    public static void AddInputParameters<T>(this IDbCommand cmd,
        T parameters) where T : class
    {
        foreach (var prop in parameters.GetType().GetProperties())
        {
            object val = prop.GetValue(parameters, null);
            var p = cmd.CreateParameter();
            p.ParameterName = prop.Name;
            p.Value = val ?? DBNull.Value;
            cmd.Parameters.Add(p);
        }
    }
}

Тогда назовите это так:

cmd.AddInputParameters(new { a = textBox1.Text, b = TextBox2.Text, /* etc */ });

Я использовал это в нескольких проектах без проблем.

9 голосов
/ 31 марта 2011

Я думаю, вы можете использовать Parameters.AddWithValue () метод.

cmd.Parameters.AddWithValue("@j",textbox10.Text);
cmd.Parameters.AddWithValue("@k",textbox11.Text);
cmd.Parameters.AddWithValue("@l",textbox12.Text);
2 голосов
/ 31 марта 2011

2 «решения», которые вы предлагаете в своем вопросе, семантически различны. Какой из них вам следует использовать, зависит от вашей раскладки.

Первое решение вставляет одну запись в таблицу, второй оператор вставки вставляет одну запись (строку) для каждого значения (текстовое поле).

Трудно дать хороший ответ здесь, так как мы не знаем, что вы собираетесь сохранить в этой таблице, и, следовательно, мы не можем сказать, как вы должны сохранить его (как вы сохраняете его, наследственно зависит от того, как Вы должны вызвать оператор вставки SQL).

0 голосов
/ 31 марта 2011

Вы можете использовать такую ​​функцию:

void AddParams(DBCommand cmd,params object[] parameters)
{
    if (parameters != null)
    {
        int index = 0;
        while (index < parameters.Length)
        {
            cmd.Parameters.AddWithValue("@"+(string)parameters[index], parameters[index + 1]);
            index += 2;
        }
    }
}

Возможно, не самый лучший, но функциональный. Звоните по ссылке:

AddParams(a,"test1",b,3,c,DateTime.Now);

Или вы можете использовать расширение, предложенное @Matt Hamilton, для добавления этой функции в класс DBCommand.

...