我正在进行第一次数据库迁移,并尝试重新创建此sqlCommand
,以便它将正确的值添加到代表性对象。
string sqlCommand = "UPDATE WITestData SET " +
"Width01 = ?, Angle01 = ?, Comment01 = ?, " +
"Width02 = ?, Angle02 = ?, Comment02 = ?, " +
"Width03 = ?, Angle03 = ?, Comment03 = ?, " +
"Width04 = ?, Angle04 = ?, Comment04 = ?, " +
"Width05 = ?, Angle05 = ?, Comment05 = ?, " +
"Width06 = ?, Angle06 = ?, Comment06 = ?, " +
"Width07 = ?, Angle07 = ?, Comment07 = ?, " +
"Width08 = ?, Angle08 = ?, Comment08 = ?, " +
"Width09 = ?, Angle09 = ?, Comment09 = ?, " +
"Width10 = ?, Angle10 = ?, Comment10 = ? " +
"WHERE ReportNumber = @reportNumber";
var parameters = new object[31];
for (int i = 0; i < WITestData.WIData.Length; i++)
{
parameters[3 * i] = WITestData.WIData[i].Width;
parameters[3 * i + 1] = WITestData.WIData[i].Angle;
parameters[3 * i + 2] = WITestData.WIData[i].Comment;
} parameters[30] = WITestData.ReportNumber;
if (ExecuteNonQuery(sqlCommand, parameterList))
{
var index = m_DataManager.Database.WITestData.FindIndex(t => t.ReportNumber == WITestData.ReportNumber);
m_DataManager.Database.WITestData[index] = WITestData;
return true;
}
return false;
}
我在for(...)中添加了以下内容,以便为每个对象分配一个单独的参数,以便它将输出正确的值。
for (int i = 0; i < WITestData.WIData.Length; i++)
{
//input Parameters into sqlCommand
string widthParameter = $"@width{counter}";
string angleParameter = $"@angle{counter}";
string commentParameter = $"@comment{counter}";
using (SqlCommand command = new SqlCommand())
{
parameterList.Add(new SqlParameter(widthParameter, WITestData.WIData[i].Width));
parameterList.Add(new SqlParameter("@angle", angleParameter));
parameterList.Add(new SqlParameter("@comment", commentParameter));
parameterList.Add(command.Parameters.AddWithValue("@reportNumber", WITestData.ReportNumber));
command.Parameters.Clear();
}
parameters[3 * i] = WITestData.WIData[i].Width;
parameters[3 * i + 1] = WITestData.WIData[i].Angle;
parameters[3 * i + 2] = WITestData.WIData[i].Comment;
counter++;
}
注意:我已经在方法顶部创建了一个int counter = 1
和一个var parameterList = new List<SqlParameter>();
。
如何将width / angle / comment参数输入到sqlCommand中,并确保正确分配了它们的值?
答案 0 :(得分:0)
第一件事是代码中的 command.Parameters.Clear(); 。这会删除命令中的所有参数,但是,似乎在那行之后,您从未将参数读取到命令对象中,而是尝试将它们添加到类型未定义的对象数组中。
尝试修复代码,我从代码中提供的基本信息开始。您的查询需要31个参数。因此,我假设 WIData.Length 为10,并在循环后添加一个最终参数( ReportNumber )
通过这种方法,您可以简化很多代码
// A command requires an sql text and an OPEN connection to execute....
OleDbCommand cmd = new OleDbCommand(sqlCommand, connection);
// Use directly the parameters collection inside the command object
var parameters = cmd.Parameters;
// Loop over the WIData array length (10 times = 30 parameters)
for (int i = 0; i < WITestData.WIData.Length; i++)
{
// No need to give an unique name, however, if you really want a name
// you can replace ? with
// "W"+i.ToString(), "A"+i.ToString() and "C"+i.ToString()
parameters.Add("?", OleDbType.Decimal).Value = WITestData.WIData[i].Width;
parameters.Add("?", OleDbType.Decimal).Value = WITestData.WIData[i].Angle;
parameters.Add("?", OleDbType.VarWChar).Value = WITestData.WIData[i].Comment;
}
parameters.Add("?", OleDbType.Integer).Value = WITestData.ReportNumber;
我还假定参数的数据类型为Decimal,Strings和integer,如果它们不正确,则应替换OleDbType,但不要删除该类型。这样可以确保正确解析您的值。
这是标准方法,但是如果您想保留当前代码,则可以将循环更改为
for (int i = 0; i < WITestData.WIData.Length; i++)
{
string widthParameter = $"@width{counter}";
string angleParameter = $"@angle{counter}";
string commentParameter = $"@comment{counter}";
parameterList.Add(widthParameter, OleDbType.Deciaml).Value = WITestData.WIData[i].Width;
parameterList.Add(angleParameter, OleDbType.Decimal).Value = WITestData.WIData[i].Width;
parameterList.Add(commentParameter, OleDbType.VarWChar).Value = WITestData.WIData[i].Comment;
counter++;
}
parameterList.Add("@reportNumber", OleDbType.Integer).Value = WITestData.ReportNumber;
答案 1 :(得分:0)
这解决了我的问题。
VueJs
代码可能看起来更好,但在这种情况下,我将在以后的清理阶段进行处理。