C#Sql参数简写

时间:2011-11-16 08:43:10

标签: c# sql parameters

我正在获取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; } } 个对象中的数据并将其内容放入数据库中:

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值被替换。

如果我查看@的内容,它仍会显示带有command.ExecuteNonQuery()参数的查询字符串。

另外,我在{{1}}上收到此错误:

  

字符串或二进制数据将被截断。

     

声明已经终止。

所以,我的问题是:

  • 是否有更短的方法可以为查询设置和添加多个参数?
  • 可能导致错误的原因是什么?

9 个答案:

答案 0 :(得分:17)

你有一个更大的构造函数:

 command.Parameters.Add(
    "@CategoryName", SqlDbType.VarChar, 80).Value = "toasters";

答案 1 :(得分:5)

使用AddWithValue方法可以缩短代码:

command.Parameters.AddWithValue("@CURSTAT", record.curstat);
//...

答案 2 :(得分:2)

String or binary data would be truncated.最有可能意味着您将太多字符放入其中一个VARCHAR字段中。即,如果您的列PRODDESC是VARCHAR(50),并且您尝试插入的字符串是70个字符,您将看到该错误。

其他人已经解决了执行参数的其他方法,因此您可以减少代码行。

答案 3 :(得分:2)

我做的有点不同。

我有一个扩展方法和一个静态方法来创建Sql参数。

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());

答案 4 :(得分:1)

关于错误,这是一个截断问题,即参数的长度比列可以容纳的长。要解决此问题,请在传递参数时更具体,例如: new SqlParameter("@MyParameter", SqlDbType.VarChar, 30)

就我个人而言,我认为他们目前如何添加可读性和完成工作的参数并没有错。但是,如果你想减少函数中的代码行数,你可以选择@Royi建议的内容,或者只是将参数包装到另一个方法中。

答案 5 :(得分:1)

对于较短的语法,您可以使用AddRange类的SqlParameterCollection方法。这意味着:

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

您收到的错误表示字符串值不适合表列或参数,并且正在被截断。您应该检查列的长度与插入的数据的比较,或者使用SqlParameter构造函数的另一个重载来指定参数的长度。

答案 6 :(得分:0)

如果您想使用以下课程:

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

然后你可以有一个名为myParams的List并执行:

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

你显然必须以某种方式链接参数和值,并且没有办法解决这个问题。但是如果你在这样的类中进行,那么实际执行该操作的代码只有一行。

答案 7 :(得分:0)

我认为消息

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函数。它应该保持这个功能更清洁,你也可以在代码的其他部分使用它。

答案 8 :(得分:0)

这对我有用:

$x