C# 开放式数据阅读器

C# 开放式数据阅读器,c#,C#,我在运行操作时收到此消息:“已经有一个打开的DataReader与此命令关联,必须先关闭它。” 我的代码是:publicvoidupdatepoints(stringrightscore,stringrightwinner) { 您应该创建一个新的命令实例,而不是在此处重用旧的命令实例: sql = "update Users_Details set lastgame_points='" + points + "', gamesplayed='" + ((int)rdr["gamesplayed

我在运行操作时收到此消息:“已经有一个打开的DataReader与此命令关联,必须先关闭它。”

我的代码是:publicvoidupdatepoints(stringrightscore,stringrightwinner) {


您应该创建一个新的命令实例,而不是在此处重用旧的命令实例:

sql = "update Users_Details set lastgame_points='" + points + "', gamesplayed='" + ((int)rdr["gamesplayed"] + 1) + "',currentpoints='" + ((int)rdr["currentpoints"] + points) + "',pointsPG='" + (((int)rdr["currentpoints"] + points) / ((int)rdr["gamesplayed"] + 1)) + "' where username='" + (string)rdr["username"] + "'";
cmd.CommandText = sql;
cmd.ExecuteScalar();

此外,阅读命令参数,自己格式化sql字符串会使您面临sql注入攻击。

错误消息非常明确地说明了您的错误所在。当您从另一个命令读取数据时,您不能重复使用该命令或另一个命令的连接。您必须首先将所有数据读取到该命令一些
列表
或其他数据结构,然后使用该
列表
的每个元素更新数据库

也可以考虑在事务

中执行您的语句
var transaction = connection.BeginTransaction(); 
... 
transaction.Commit();

这将加快您的更新速度,因为事务将只创建和提交一次,但另一种方式是在每次更新时隐式创建事务,现在它打印“已经有一个打开的数据读取器与此连接关联,必须先关闭。”?而不是“命令”?我的第一个答案是错误的,因为你不能重复使用命令,也不能重复使用连接。请查看正确的答案。不,是同一条消息。好的,谢谢。我会尝试的
var transaction = connection.BeginTransaction(); 
... 
transaction.Commit();