SQL UPDATE Loop Non-Sequential Keys

Я пишу приложение C #, которое будет обновлять поля в базе данных SQL Server. Текущий алгоритм, который я тестирую, просто извлекает данные из поля «Состояние», сохраняет каждое значение в ArrayList, заглаживает его, а затем записывает обратно в базу данных. У меня проблемы с логикой.

Я вытаскиваю все значения в ArrayList и использую их. Это работает нормально. Теперь у меня есть массив с, например, 100 значениями (т. myArray[0]myArray[99] ). Затем я использую цикл FOR для записи значений в базу данных:

 for (int i = 0; i <= (myArray.Count - 1); i++) { SqlCommand myCommand = new SqlCommand("UPDATE myList SET State = '" + recordArray[i].ToString() + "' WHERE uniqueID = '" + (i + 1) + "'", dbConnection); myCommand.ExecuteNonQuery(); } 

Я использую «uniqueID» в приведенном выше примере, чтобы поместить эти значения в соответствии с первичным ключом. Однако проблема заключается в том, что первичный ключ является почти последовательным; в последовательности есть несколько недостающих чисел. Таким образом, несмотря на то, что у меня есть точно количество значений, которые мне нужны, и они находятся в правильном порядке в массиве, который будет отброшен обратно в базу данных, как только я достигнет предела в последовательности, остальная часть данных будет помещена в неправильном поле. Я знаю, что это ошибка в моей логике, но я не понимаю, как я могу обеспечить правильное размещение каждого отдельного значения.

Заранее спасибо за помощь.

    Так много чего здесь не так …

    1. Никогда НИКОГДА не используйте динамический SQL. Что, если в одном из ваших «состояний» есть апостроф?
    2. Если это не так. Net 1.0 или 1.1, вы НЕ должны использовать ArrayList. Вместо этого используйте System.Collections.Generic.List<string> .
    3. Не создавайте 99 объектов SqlCommand. Создайте 1 объект SqlCommand и обновите значение параметра на каждой итерации через цикл.
    4. Создайте объект SqlCommand (и, что еще более важно, SqlConnection) с using оператора using , чтобы убедиться, что неуправляемые ресурсы будут освобождены оперативно, если будет создано исключение.
    5. Прежде всего, все это становится спорным, когда вы понимаете, что можете обновлять несколько записей в одном заявлении sql, и что sql имеет приятную легкую «UPPER» функцию.

    Поскольку похоже, что вы можете использовать пример правильного способа создания такого рода запросов, я буду на мгновение предположить, что №5 как-то не вариант, и вам действительно нужно извлечь все эти данные в приложение а затем обновить его по записи (подсказка: нет). Вот как вы должны создать этот код:

     using (SqlConnection cn1 = new SqlConnection("connection string here")) //inbound data using (SqlCommand cmd1 = new SqlCommand("SELECT uniqueid, State FROM myList", cn1)) using (SqlConnection cn2 = new SqlConnection("connection string here")) using (SqlCommand cmd2 = new SqlCommand("UPDATE myList SET State= @State WHERE uniqueID= @ID", cn2)) { SqlParameter StateParam = cmd2.Parameters.Add("@State", SqlDbType.VarChar, 50); SqlParameter IDParam = cmd2.Parameters.Add("@ID", SqlDbType.Int); cn1.Open(); cn2.Open(); using (SqlDataReader rdr = cmd1.ExecuteReader()) { while (rdr.Read()) { StateParam.Value = rdr["State"].ToString().ToUpper(); IDParam.Value = rdr["uniqueID"]; cmd2.ExecuteNonReader(); } } } 

    Обратите внимание, что это просто демонстрация using блоков и параметризованных запросов. Вы не должны использовать этот код. Вместо этого взгляните на мой пункт № 5. Это может и должно быть сделано в одном заявлении SQL UPDATE.

    Если вы делаете это исключительно как упражнение, вы знаете, что можете просто выполнить обновление напрямую?

     UPDATE myList SET State = Upper(State) 

    Вам нужно получить значения первичных ключей для одних и тех же строк и отслеживать их вместе с данными, чтобы вы могли обновить правильную строку в конце.

    Interesting Posts

    Конденсация подобных строк происходит в группах и порядке

    Лучшая оптимизация запроса

    Заполните ваши таблицы данными мусора?

    Проблема производительности запросов Sql – я что-то прикрутил?

    Эффективный запрос для поиска дубликатов записей

    Как показать таблицу горизонтально, а не вертикально в отчете SSRS

    Обмен данными между удаленными точками

    Вставить проблему параллелизма – многопоточная среда

    SQL Рассчитать процент по 2 столбцам

    Синтаксис SQL для правого внешнего JOIN в SQL Server 2012

    Преобразование значения базы 31 в BigInt в SQL Server

    Как отображать все значения из одной таблицы, но по двум столбцам в этой таблице, отображать значение других таблиц, если их имя столбца одинаково

    Entity Framework 6 Настройка SQL с помощью методов расширения

    Оптимизация SQL Server «ORDER BY» – значительное снижение производительности

    NULL занимает пространство на SQL Server 2012

    Давайте будем гением компьютера.