在C#中为每个不同的行运行ExecuteNonQuery

时间:2017-11-28 17:50:29

标签: c# sql oledb

所以我有一个包含学生信息的数据库,我想为每一个添加一个随机生成的成绩。 我创建了一个在A-F之间生成随机等级字母的方法。

然而,当我更新我的数据库表时,学生正在学习的所有课程都达到相同等级,我想给每个不同的课程一个不同的等级。

 command.CommandText = "UPDATE CurrentCourses SET CurrenteGrade ='" + 
                       RandomLetter(grades) + "'";

 command.ExecuteNonQuery();

我相信如果有办法为每个不同的行运行此查询,它将解决我的问题。但我无法真正开始工作。我使用Microsoft Access来创建我的数据库。

谢谢

7 个答案:

答案 0 :(得分:2)

update语句会影响数据库表中的所有行:

"UPDATE CurrentCourses SET CurrenteGrade ='" + 
                   RandomLetter(grades) + "'"

如果没有WHERE子句,这段代码可以循环运行100次,每次都有一个随机等级,但是表格中的每一行都会说明最后随机化的等级。如果选择了最后一个循环' E'作为随机等级,表格中的所有行都将被评分为E,这表明他们在之前的5秒内已经改变了等级99次(每次代码运行时所有行都会改变。他们只会在代码停止执行)

如果您想将所有课程行更改为同一年级:

sqlCommand.CommandText = "UPDATE CurrentCourses SET CurrenteGrade = ? WHERE Course_ID = ?";

然后填充SqlCommand的参数:

sqlCommand.Parameters.AddWithValue("grade", RandomLetter(grades));
sqlCommand.Parameters.AddWithValue("course", "SoftwareEngineering101");

这是你经常多次(可能在一个循环中)运行的东西,每次都有不同的课程ID。我们的想法是您只需更改参数值,然后重新运行查询:

sqlCommand.CommandText = "UPDATE CurrentCourses SET CurrenteGrade = ? WHERE Course_ID = ?";
sqlCommand.Parameters.AddWithValue("grade", "a"); //dummy values
sqlCommand.Parameters.AddWithValue("course", "a"); //dummy values
//the loop does the real work, repeatedly overwiting param values and running:
foreach(var course in myCoursesArray){
  sqlCommand.Parameters["grade"] = RandomLetter(grades);
  sqlCommand.Parameters["course"] = course;
  sqlCommand.ExecuteNonQuery()
}

有访问权限,使用?对于SQL中的参数占位符,请务必按照与?相同的顺序添加参数。标记出现在sql中。名称是无关紧要的 - 在更强大的数据库系统(如sqlserver)中并非如此,其中SQL命名参数并且c#代码中给出的名称很重要。但是,在我们基于Access的代码中,唯一重要的是在使用循环中的新参数值覆盖参数值时使用它

请注意;有充分的理由避免使用.AddWithValue,但我不会进入这里。避免使用字符串连接在SQL中构建值更为重要。有关详细信息,请访问bobbytables.com

答案 1 :(得分:0)

尝试类似的事情;

UPDATE CurrentCourses SET CurrenteGrade = (select top 1 gradeName from grades ORDER BY NEWID())

在您的代码中,您没有为学生设置不同的课程。因为在执行查询之前,您的查询只需要一个等级并更新所有行。

您可以轻松地使用SQL执行它。

答案 2 :(得分:0)

首先是您的确切问题:您需要一个WHERE语句,将更新过滤到一行。这通常使用ID号或特定行的其他唯一标识符(在这种情况下是学生)。

第二:将字符串与原始数据连接在一起可能会导致错误和安全问题。例如,在字符串数据中使用单引号之类的操作将导致严重破坏。你应该用完SqlParameters。 https://www.dotnetperls.com/sqlparameter

答案 3 :(得分:0)

您可以先查询包含学生和课程的表格中的每一行。

然后对于数据集中的每一行,执行您的方法以随机字母等级更新该行。

例如

foreach (DataRow dr in ds.tables[0].rows)  
{
  command.CommandText = "UPDATE CurrentCourses SET CurrenteGrade ='" + 
  RandomLetter(grades) + "'" + "WHERE PRIMARYKEY = dr.id"
  command.ExecuteNonQuery();
}

答案 4 :(得分:0)

使用不带任何WHERE子句的UPDATE命令每次都会影响每条记录。请注意,在执行查询之前生成随机字母。因此,查询将以单一等级字母运行。

您可以依次使用适当的WHERE子句为每个课程运行此查询,每次选择一个课程。但这效率不高。

或者,更好的是,您可以在SQL本身中应用随机函数,对每条记录进行评估(即让MySQL选择随机等级)。

UPDATE CurrentCourses
SET CurrenteGrade = SUBSTRING('ABCDEF', FLOOR(RAND() * 6) + 1, 1)

在您的代码中

command.CommandText = @"UPDATE CurrentCourses
    SET CurrenteGrade = SUBSTRING('ABCDEF', FLOOR(RAND() * 6) + 1, 1)";
command.ExecuteNonQuery();

这不需要循环,也不需要命令参数。

请注意,RAND()返回介于0.0和1.0之间的随机数(包括0.0但不包括1.0)。因此FLOOR(RAND() * 6)生成[0 .. 5]范围内的整数。添加1以获取[1 .. 6]范围内的数字,该数字用作字符'ABCDEF'中用于剪切一个字母的SUBSTRING函数的索引。

答案 5 :(得分:0)

您可以使用纯T-SQL执行此操作:

declare @idColumn int
DECLARE @MIN INT=1; --We define minimum value, it can be generated.
DECLARE @MAX INT=100; --We define maximum value, it can be generated.

select @idColumn = min( Id ) from CurrentCourses 

while @idColumn is not null
begin
Update CurrentCourses 
SET CurrenteGrade  = @MIN+FLOOR((@MAX-@MIN+1)*RAND(CONVERT(VARBINARY,NEWID())));
    select @idColumn = min( Id ) from CurrentCourses  where Id > @idColumn
end

上面的代码循环遍历所有记录(用您的主键替换Id)并生成1-100之间的随机数(请参阅可以设置新值的注释)并更新每个记录中的随机数{ {1}}记录。

格式化并将该命令连接到CurrentGrade并执行CommandText

答案 6 :(得分:0)

请将where条件放在更新查询中。如果条件不同,它将更新表中的所有数据。