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"来根据主键放置这些值.然而,问题是主键几乎是顺序的; 序列中有一些缺失的数字.因此,即使我确切地拥有了我需要的值的数量,并且它们在数组中以正确的顺序被推回到数据库中,一旦我在序列中失效,其余的数据就会被放置在错误的领域.我知道这是我的逻辑失误,但我不知道如何确保正确地放置每个单独的价值.
在此先感谢您的帮助.
这里有很多不妥之处......
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();
}
}
}
Run Code Online (Sandbox Code Playgroud)
请注意,这只是为了演示using块和参数化查询.您应不使用此代码.相反,要好好看看我的观点#5.这可以而且都应该在单个sql UPDATE语句中完成.
除非你纯粹是一个练习,否则你知道你可以直接执行更新吗?
UPDATE myList SET State = Upper(State)
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
1530 次 |
| 最近记录: |