Добавление параметров в запрос sqlCommand - PullRequest
0 голосов
/ 24 октября 2018

Я делаю свою первую миграцию базы данных и пытаюсь воссоздать это 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>(); в верхней части метода.

Как ввести параметры ширины / угла / комментария в полеsqlCommand и убедитесь, что они правильно назначены со своими значениями?

Ответы [ 2 ]

0 голосов
/ 24 октября 2018

Это решило мой вопрос.

   int counter = 1;
        var parameterList = new List<SqlParameter>();
        SqlCommand command = new SqlCommand();
        string sqlCommand = $"UPDATE WITestData SET " +
            "Width01 = {widthParameter}, Angle01 = {angleParameter}, Comment01 = {commentParameter}, " +
            "Width02 = {widthParameter}, Angle02 = {angleParameter}, Comment02 = {commentParameter}, " +
            "Width03 = {widthParameter}, Angle03 = {angleParameter}, Comment03 = {commentParameter}, " +
            "Width04 = {widthParameter}, Angle04 = {angleParameter}, Comment04 = {commentParameter}, " +
            "Width05 = {widthParameter}, Angle05 = {angleParameter}, Comment05 = {commentParameter}, " +
            "Width06 = {widthParameter}, Angle06 = {angleParameter}, Comment06 = {commentParameter}, " +
            "Width07 = {widthParameter}, Angle07 = {angleParameter}, Comment07 = {commentParameter}, " +
            "Width08 = {widthParameter}, Angle08 = {angleParameter}, Comment08 = {commentParameter}, " +
            "Width09 = {widthParameter}, Angle09 = {angleParameter}, Comment09 = {commentParameter}, " +
            "Width10 = {widthParameter}, Angle10 = {angleParameter}, Comment10 = {commentParameter} " +
            "WHERE ReportNumber = @reportNumber";
        var parameters = new object[31];
        for (int i = 0; i < WITestData.WIData.Length; i++)
        {
            //input Parameters into sqlCommand
            string widthParameter = $"@width{(counter < 10 ? counter.ToString("D2") : counter.ToString() )}";
            string angleParameter = $"@angle{(counter < 10 ? counter.ToString("D2") : counter.ToString())}";
            string commentParameter = $"@comment{(counter < 10 ? counter.ToString("D2") : counter.ToString())}";
            using (command)
            {
                parameterList.Add(new SqlParameter(widthParameter, WITestData.WIData[i].Width));
                parameterList.Add(new SqlParameter(angleParameter, WITestData.WIData[i].Angle));
                parameterList.Add(new SqlParameter(commentParameter, WITestData.WIData[i].Comment));

                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++;
        }

Код мог бы выглядеть лучше, но в этом случае я бы занялся этим на более позднем этапе очистки.

0 голосов
/ 24 октября 2018

Первое, что неправильно, это команда . Параметры.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;

Я также предполагаю, что тип данных параметров - Десятичный, Строковый и целочисленный, вы должны заменить 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;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...