我的C#有问题,我有一个class的一个函数用于SqlDataReader,另一个用于SqlCommand(第一个只用于从数据库中读取值,第二个用于同一DB中的INSERT、UPDATE、DELETE…)。
问题是,对于代码的第一部分(登录),我必须从Active Directory中搜索值(有效),然后我必须查看用户是否在我自己的数据库中有用户名和密码(有效)。然后,如果用户不在数据库中,我必须创建它并获取ID,如果它已经创建,我只需要获取ID。
问题是我收到这样的消息:
InvalidOperationException为未由用户代码处理
已存在Open DataReader与该命令关联,作为首先关闭。
有一个代码:
类别:
private static string MyConnectionString = "THIS IS MY CONNECTION";
private SqlConnection MyConnection = new SqlConnection(MyConnectionString);
public SqlCommand MyCommand = new SqlCommand();
public SqlDataReader MyReader = null;
public void DBMyReader(String SqlQuery)
{
if (MyConnection.State != ConnectionState.Open)
MyConnection.Open();
MyCommand.Connection = MyConnection;
MyCommand.CommandText = SqlQuery;
MyReader = MyCommand.ExecuteReader(CommandBehavior.CloseConnection);
}
public void DBMyUpdate(String SqlQuery)
{
if (MyConnection.State != ConnectionState.Open)
MyConnection.Open();
var cmdTest = new SqlCommand();
cmdTest.Connection = MyConnection;
cmdTest.CommandText = SqlQuery;
cmdTest.ExecuteNonQuery();
}
public void DBMyInsert(String SqlQuery)
{
DBMyUpdate(SqlQuery);
}
**登录.aspx.cs:**
MyClass.DBMyReader("SELECT util_codi,util_logi,util_nome FROM Tgep_util WHERE util_logi='"
+ Session["username"].ToString() + "'");
MyClass.MyReader.Read();
if (!MyClass.MyReader.HasRows)
{
MyClass.MyReader.Close();
MyClass.DBMyInsert("INSERT INTO Tgep_util(util_logi,util_nome) "
+ "VALUES ('" + Session["username"].ToString() + "','" + Session["nome"].ToString() + "')");
}
MyClass.DBMyReader("SELECT util_codi,util_logi,util_nome FROM Tgep_util WHERE util_logi='"
+ Session["username"].ToString() + "'");
MyClass.MyReader.Read();
Session["user_id"] = MyClass.MyReader["util_codi"].ToString();
Response.Redirect("FRM_Principal.aspx");
编辑:更新代码(目前有效)
该错误的含义正是它所说的。。您已经加载了一个SQLCommand并开始读取行,现在正尝试执行插入操作。您需要先关闭该读卡器,或者使用新命令。
在DBMyUpdate函数中,您可以创建一个新命令:
public void DBMyUpdate(String SqlQuery)
{
if (MyConnection.State != ConnectionState.Open)
MyConnection.Open();
var cmdUpdate = new SqlCommand();
cmdUpdate.Connection = MyConnection;
cmdUpdate.CommandText = SqlQuery;
cmdUpdate.ExecuteNonQuery(CommandBehavior.CloseConnection);
}
编辑:根据对这个答案的评论,它需要使用单独的连接,这似乎很奇怪/不正确。
对于用于插入的insert/update
,不能使用相同的DataReader
。在将其他命令与DataReader
关联之前,必须先关闭DataReader
。