gpt4 book ai didi

c# - SQL UPDATE 循环非顺序键

转载 作者:太空宇宙 更新时间:2023-11-03 17:23:06 26 4
gpt4 key购买 nike

我正在编写一个 C# 应用程序来更新 SQL Server 数据库中的字段。我正在测试的当前算法只是从“State”字段中提取数据,将每个值存储在 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. Never NEVER NEVER 这样使用动态 SQL。如果您的“状态”中有一个撇号怎么办?
  2. 除非是 .Net 1.0 或 1.1,否则您不应该使用 ArrayList。使用 System.Collections.Generic.List<string>相反。
  3. 不要创建 99 个 SqlCommand 对象。创建1 SqlCommand 对象,并通过循环在每次迭代时更新参数值。
  4. 使用 using 创建您的 SqlCommand(更重要的是 SqlConnection)对象声明,以确保在抛出异常时及时释放非托管资源。
  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 block 和参数化查询。您应该使用此代码。相反,请仔细阅读我的第 5 点。这可以而且应该全部在单个 sql UPDATE 语句中完成。

关于c# - SQL UPDATE 循环非顺序键,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1667809/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com