向sqlCommand查询添加参数

时间:2018-10-24 06:58:38

标签: c# sql ms-access

我正在进行第一次数据库迁移,并尝试重新创建此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中,并确保正确分配了它们的值?

2 个答案:

答案 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

代码可能看起来更好,但在这种情况下,我将在以后的清理阶段进行处理。