Используя SqlCommand, как добавить несколько параметров к своему объекту, вставка через winform в таблицу sql

У меня есть десять текстовых полей в моей 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 в одном операторе? Является ли это возможным?


person sqlchild    schedule 31.03.2011    source источник


Ответы (4)


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

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 */ });

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

person Matt Hamilton    schedule 31.03.2011
comment
сэр, я использую .net 2.0, так что вместо 'var' и ‹› что мне использовать? - person sqlchild; 04.04.2011
comment
IDbCommand.CreateParameter возвращает IDbDataParameter, поэтому объявите p как это. В противном случае, насколько мне известно, это должно нормально работать в .NET 2.0. - person Matt Hamilton; 04.04.2011

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

cmd.Parameters.AddWithValue("@j",textbox10.Text);
cmd.Parameters.AddWithValue("@k",textbox11.Text);
cmd.Parameters.AddWithValue("@l",textbox12.Text);
person Anuraj    schedule 31.03.2011

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

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

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

person Frederik Gheysels    schedule 31.03.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.

person Marco    schedule 31.03.2011