SQL UPDATE循环非顺序键

Geo*_*Ego 1 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();
}
Run Code Online (Sandbox Code Playgroud)

我在上面的例子中使用"uniqueID"来根据主键放置这些值.然而,问题是主键几乎是顺序的; 序列中有一些缺失的数字.因此,即使我确切地拥有了我需要的值的数量,并且它们在数组中以正确的顺序被推回到数据库中,一旦我在序列中失效,其余的数据就会被放置在错误的领域.我知道这是我的逻辑失误,但我不知道如何确保正确地放置每个单独的价值.

在此先感谢您的帮助.

Joe*_*orn 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"功能.

既然看起来你可以使用正确的方法来构建这种查询,我会假设#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();
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

请注意,这只是为了演示using块和参数化查询.您应使用此代码.相反,要好好看看我的观点#5.这可以而且都应该在单个sql UPDATE语句中完成.


Cha*_*ana 5

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

UPDATE myList SET State = Upper(State)
Run Code Online (Sandbox Code Playgroud)