Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/314.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/oop/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# SQL更新循环非顺序键_C#_Sql_Sql Server_Database Update - Fatal编程技术网

C# SQL更新循环非顺序键

C# SQL更新循环非顺序键,c#,sql,sql-server,database-update,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++) { SqlCo

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


提前感谢您的帮助。

您需要获取相同行的主键值,并将其与数据一起跟踪,以便最终更新正确的行。

您需要获取相同行的主键值,并将其与数据一起跟踪,这样,您就可以在最后更新正确的行。

除非您这样做纯粹是为了练习,否则您知道您可以直接执行更新吗

UPDATE myList SET State = Upper(State)

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

UPDATE myList SET State = Upper(State)

这里有很多错误

不要像那样使用动态SQL。如果你所在的州有一个撇号怎么办? 除非这是.Net 1.0或1.1,否则不应使用ArrayList。改用System.Collections.Generic.List。 不要创建99个SqlCommand对象。创建1个SqlCommand对象,并在循环的每次迭代中更新参数值。 创建SqlCommand,更重要的是,使用using语句创建SqlConnection对象,以确保在引发异常时立即释放非托管资源。 最重要的是,当您意识到可以在一条sql语句中更新多条记录,并且sql有一个简单的函数时,所有这些都变得毫无意义。 因为看起来您可以使用一个正确方法的示例来构建这种查询,所以我暂时假设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();
        }
    }
}

请注意,这只是为了演示如何使用块和参数化查询。您不应该使用此代码。相反,请仔细看看我的第5点。这一切都可以而且应该在一个sql UPDATE语句中完成。

这里有很多错误

不要像那样使用动态SQL。如果你所在的州有一个撇号怎么办? 除非这是.Net 1.0或1.1,否则不应使用ArrayList。改用System.Collections.Generic.List。 不要创建99个SqlCommand对象。创建1个SqlCommand对象,并在循环的每次迭代中更新参数值。 创建SqlCommand,更重要的是,使用using语句创建SqlConnection对象,以确保在引发异常时立即释放非托管资源。 最重要的是,当您意识到可以在一条sql语句中更新多条记录,并且sql有一个简单的函数时,所有这些都变得毫无意义。 因为看起来您可以使用一个正确方法的示例来构建这种查询,所以我暂时假设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();
        }
    }
}

请注意,这只是为了演示如何使用块和参数化查询。您不应该使用此代码。相反,请仔细看看我的第5点。这一切都可以而且应该在一个sql UPDATE语句中完成。

+1是的,你是对的-这段代码非常糟糕-希望我能多次投票支持你的答案!非常感谢你的帮助。我真的在寻找正确的方法来做这件事,因为我知道我是在走黑客路线,这是完美的工作。我有更新命令现在工作。显然,问题在于我对更新语法不熟悉。然而,您关于处理SQL的其他评论让我对最佳实践有了更多的了解。再次感谢。哇-我和马克在一起-我希望我能不止一次地否决这个答案。Geo-假定用户输入的任何内容都不应该直接插入到SQL命令中。事实上,为了安全起见,您可能希望始终使用参数化query
ies可避免SQL注入攻击,B始终在将请求参数反射回页面之前对其进行HTMLEncode,以避免跨站点脚本攻击。感谢大家的帮助。我一直在利用你在这里所说的作为基础,研究通过C与SQL Server交互的正确方法,并意识到我的做法是多么错误和危险。+1是的,你是对的-这段代码非常糟糕-希望我能多次投票支持你的答案!非常感谢你的帮助。我真的在寻找正确的方法来做这件事,因为我知道我是在走黑客路线,这是完美的工作。我有更新命令现在工作。显然,问题在于我对更新语法不熟悉。然而,您关于处理SQL的其他评论让我对最佳实践有了更多的了解。再次感谢。哇-我和马克在一起-我希望我能不止一次地否决这个答案。Geo-假定用户输入的任何内容都不应该直接插入到SQL命令中。事实上,为了安全起见,您可能希望A始终使用参数化查询以避免SQL注入攻击,B始终在将请求参数反射回页面之前对其进行HTMLEncode以避免跨站点脚本攻击。感谢大家的帮助。我一直在以你在这里所说的为基础,研究通过C与SQL Server交互的正确方式,并认识到我的做法是多么错误和危险。这是一个练习,但它的目的是学习如何通过C与SQL Server交互的正确方式。谢谢你指出这一点!这是一个练习,但它的目的是学习如何以正确的方式通过C与SQL Server交互。谢谢你指出这一点!非常感谢。我想这是其中的一部分,上面乔尔的解决方案也包括在内。谢谢!我想这是其中的一部分,上面乔尔的解决方案也包括在内。