为每个不同的行运行C#中的ExecuteOnQuery

为每个不同的行运行C#中的ExecuteOnQuery,c#,sql,oledb,C#,Sql,Oledb,所以我有一个数据库,里面有学生信息,我想为每个学生添加一个随机生成的分数。 我创建了一个在a-F之间生成随机等级字母的方法 然而,当我更新我的数据库表时,学生们正在学习的所有课程都得到了相同的分数,我想给每个不同的课程一个不同的分数 command.CommandText = "UPDATE CurrentCourses SET CurrenteGrade ='" + RandomLetter(grades) + "'"; command.E

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

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

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

 command.ExecuteNonQuery();
我相信,如果有一种方法可以为每一行运行这个查询,它将解决我的问题。但我真的无法让它发挥作用。我使用Microsoft Access创建了我的数据库

谢谢你

试试这样的东西

UPDATE CurrentCourses SET CurrenteGrade = (select top 1 gradeName from grades ORDER BY NEWID())
在代码中,您没有为学生设置不同的课程。因为在执行查询之前,您的查询只需要一个等级并更新所有行


您可以使用SQL轻松执行该操作。

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)中并非如此,在sqlserver中,SQL具有命名参数,而c#代码中给出的名称确实重要。但是,在我们基于访问的代码中,名称唯一重要的是在循环中使用新名称覆盖参数值时使用它


注;有很好的理由避免使用
.AddWithValue
,但我在这里不赘述。更重要的是避免使用字符串连接将值构建到SQL中。有关更多信息,请访问bobbytables.com。首先,请回答您的确切问题:您需要一个WHERE语句,该语句将更新过滤到一行。这通常通过特定行的ID号或其他唯一标识符(在本例中为学生)来完成


第二:将字符串与原始数据连接在一起可能会导致错误和安全问题。例如,字符串数据中只有一个引号会造成严重破坏。您应该用完SqlParameters

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

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

比如说

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

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

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

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

更新当前课程
设置CurrenteGrade=SUBSTRING('ABCDEF',FLOOR(RAND()*6)+1,1)
在代码中

command.CommandText=@“更新当前课程”
设置CurrenteGrade=SUBSTRING('ABCDEF',FLOOR(RAND()*6)+1,1)”;
command.ExecuteNonQuery();
这不需要循环,也不需要命令参数


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

您可以使用纯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之间的随机数(请参见可以设置新值的注释),并更新每个
CurrentGrade
记录中的随机数


将该命令格式化并连接到您的
CommandText
中,然后执行
ExecuteOnQuery()
请在更新查询中输入where条件。如果没有where条件,它将更新表中的所有数据。

表是否有主键?如果是这样的话,您只需要查询以获取密钥,然后为每个密钥运行带有where子句的更新。也可以考虑使用SQL参数,而不是将值连接到SQL中。也可以向我们展示“RealNoMT”方法的代码吗?如果你使用Access DB,为什么你把它标记为MySQL?Read Onter对我来说好像是一个C语言方法,在执行它之前,查询看起来像更新的Currrices课程设置CurrnEntErre=“SAMPLECURSE”。这里没有循环。当然,我从来没有说过有一个循环,我只是说,即使有一个循环运行X次,你唯一能看到的就是在循环最后运行时选择的字母。有没有一种方法可以这样做:(WHERE/When CourseId不同)。因为我已经有一个CourseId列了,对每个不同的课程运行查询会更容易些。不太确定“CourseId不同的地方”是什么意思-不同于什么?