我正在编写一个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”来根据主键放置这些值。然而,问题是主键几乎是顺序的;序列中有一些缺失的数字。因此,即使我确切地拥有了我需要的值的数量,并且它们在数组中以正确的顺序被推回到数据库中,一旦我在序列中失效,其余的数据就会被放置在错误的领域。我知道这是我逻辑上的失误,但我不知道如何确保正确放置每一个价值。
提前感谢您的帮助。
答案 0 :(得分:8)
这里有很多错误......
System.Collections.Generic.List<string>
。using
语句创建您的SqlCommand(更重要的是,SqlConnection)对象,以确保在抛出异常时立即释放非托管资源。因为看起来你可以用一个正确的方法来构建这种查询的例子,我会假设#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)
您需要获取相同行的主键值,并跟踪数据,以便最后更新正确的行。