我正在获取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}}上收到此错误:
字符串或二进制数据将被截断。
声明已经终止。
所以,我的问题是:
答案 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