SQL UPDATE循环非顺序键

时间:2009-11-03 14:50:40

标签: c# sql sql-server database-update

我正在编写一个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”来根据主键放置这些值。然而,问题是主键几乎是顺序的;序列中有一些缺失的数字。因此,即使我确切地拥有了我需要的值的数量,并且它们在数组中以正确的顺序被推回到数据库中,一旦我在序列中失效,其余的数据就会被放置在错误的领域。我知道这是我逻辑上的失误,但我不知道如何确保正确放置每一个价值。

提前感谢您的帮助。

3 个答案:

答案 0 :(得分:8)

这里有很多错误......

  1. 从不从不使用这样的动态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”功能。
  6. 因为看起来你可以用一个正确的方法来构建这种查询的例子,我会假设#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语句中完成。

答案 1 :(得分:5)

除非你纯粹是练习,否则你知道你可以直接执行更新吗?

UPDATE myList SET State = Upper(State)

答案 2 :(得分:0)

您需要获取相同行的主键值,并跟踪数据,以便最后更新正确的行。