C # SqlParameters Short Hand - PullRequest
       0

C # SqlParameters Short Hand

9 голосов
/ 16 ноября 2011

Я беру данные, которые находятся в List из Record объектов, и помещаю их содержимое в базу данных:

// Processes a Record and adds it to the database
public bool addRecord(SqlConnection db, List<Record> recordsToAdd)
{
    using (SqlCommand command = db.CreateCommand())
    {
        foreach (Record record in recordsToAdd)
        {
            // Set the query command text
            command.CommandText = @"INSERT INTO SMDGROUP_STPRODMASTER (PRODCODE, TOTFREE, TOTPHYS, ITEMTYPE, PRODESC) VALUES ('@PRODCODE', '@TOTFREE', '@TOTPHYS', '@ITEMTYPE', '@PRODESC')";

            SqlParameter param1 = new SqlParameter("@CURSTAT", record.curstat);
            SqlParameter param2 = new SqlParameter("@ITEMDESC", record.itemdesc);
            SqlParameter param3 = new SqlParameter("@PRODCODE", record.prodcode);
            SqlParameter param4 = new SqlParameter("@TOTFREE", record.totfree);
            SqlParameter param5 = new SqlParameter("@TOTPHYS", record.totphys);
            SqlParameter param6 = new SqlParameter("@ITEMTYPE", record.itemtype);
            SqlParameter param7 = new SqlParameter("@PRODESC", record.proddesc);

            command.Parameters.Add(param1);
            command.Parameters.Add(param2);
            command.Parameters.Add(param3);
            command.Parameters.Add(param4);
            command.Parameters.Add(param5);
            command.Parameters.Add(param6);
            command.Parameters.Add(param7);

            // Execute the query
            command.ExecuteNonQuery();
        }
        return true;
    }
}

Вот мой класс Record:

class Record
{
    public string curstat { get; set; }
    public string itemtype { get; set; }
    public string itemdesc { get; set; }
    public string prodcode { get; set; }
    public string proddesc { get; set; }
    public string totfree { get; set; }
    public string totphys { get; set; }
}

Просто глядя на код, я чувствую, что есть более короткий способ достижения этого.

Но, во-вторых, я даже не уверен, правильно ли я это сделал, что @PARAMETER значения заменяются.

Если я просматриваю содержимое command, он все равно показывает строку запроса с параметрами @.

Также я получаю эту ошибкуon command.ExecuteNonQuery():

Строка или двоичные данные будут усечены.

Оператор завершен.

Итак, мои вопросы:

  • Существует ли более короткий способ задания и добавления нескольких параметров в запрос?
  • Что может быть причиной ошибки?

Ответы [ 8 ]

17 голосов
/ 16 ноября 2011

У вас есть конструктор большего размера:

 command.Parameters.Add(
    "@CategoryName", SqlDbType.VarChar, 80).Value = "toasters";
5 голосов
/ 16 ноября 2011

Использование метода AddWithValue сделает код немного короче:

command.Parameters.AddWithValue("@CURSTAT", record.curstat);
//...
2 голосов
/ 16 ноября 2011

Я делаю это немного иначе.

У меня есть и метод расширения, и статический метод для создания SqlParameters.

public static SqlParameter ToParam(this object v,string name){
return new SqlParameter(name,v);
}

Тогда я делаю что-то вроде этого:

var p = new List<SqlParameter>();
p.Add(record.curstat.ToParam("@curstat"));
p.Add(record.itemdesc.ToParam("@itemdesc"));
//etc...

command.Parameters.AddRange(p.ToList());
2 голосов
/ 16 ноября 2011

Скорее всего String or binary data would be truncated. означает, что вы кладете слишком много символов в одно из полей VARCHAR.То есть, если ваш столбец PRODDESC - это VARCHAR (50), а строка, которую вы пытаетесь вставить, - это 70 символов, вы увидите эту ошибку.сократить строки кода.

1 голос
/ 16 ноября 2011

Для более короткого синтаксиса вы можете использовать метод AddRange класса SqlParameterCollection. Это значит:

command.Parameters.AddRange(new [] {
    new SqlParameter(...),
    new SqlParameter(...),
    new SqlParameter(...) });

Полученная ошибка указывает на то, что строковое значение не помещается в столбец или параметр таблицы и усекается. Вы должны проверить длину столбца в сравнении с вставляемыми данными или указать длину параметров, используя другую перегрузку конструктора SqlParameter.

1 голос
/ 16 ноября 2011

Что касается ошибки, то это проблема усечения, т.е. длина вашего параметра больше, чем может вместить ваш столбец.Чтобы решить эту проблему, будьте более точны при передаче своих параметров, например, new SqlParameter("@MyParameter", SqlDbType.VarChar, 30).

. Лично я не думаю, что в них нет ничего плохого в том, что добавление параметров в настоящее время делает их читаемыми и выполняет работу.Однако, если вы хотите уменьшить количество строк кода в своей функции, вы можете либо пойти на то, что предложил @Royi, либо просто упаковать параметр, добавив его в другой метод.

0 голосов
/ 16 ноября 2011

Я думаю, что сообщение

String or binary data would be truncated.

The statement has been terminated.

происходит из-за ошибки в вашем тексте команды: в запросе SQL параметры, даже если они являются строками, не должны заключаться в кавычки.

Замените команду этим

command.CommandText = @"INSERT INTO SMDGROUP_STPRODMASTER 
      (PRODCODE, TOTFREE, TOTPHYS, ITEMTYPE, PRODESC) 
      VALUES (@PRODCODE, @TOTFREE, @TOTPHYS, @ITEMTYPE, @PRODESC)";

Чтобы сократить код, я думаю, вы могли бы добавить куда-нибудь (например, в свой класс записей или в вспомогательный класс) метод, который создает массив параметров из объекта записии затем вызовите функцию AddRange.Он должен содержать эту функцию в чистоте, и вы можете использовать ее также в другой части кода.

0 голосов
/ 16 ноября 2011

Если вы хотите использовать следующий класс:

Class MyParam
{
    public string name {get;set;}
    public object value {get;set;}
}

, вы можете создать список myParams и сделать:

foreach(var p in myParams) command.Parameters.AddWithValue(p.name, p.value);

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

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