类中有多个SqlDataReader和SqlCommand的问题

时间:2011-06-09 15:37:06

标签: c# sql-server class sqldatareader

我遇到了C#的问题,我有一个带有SqlDataReader函数的Class和另一个用于SqlCommand的函数(第一个用于从DataBase读取值,第二个用于INSERT,UPDATE,DELETE ... in相同的数据库)。

问题是,对于代码的第一部分(登录),我必须从Active Directory中搜索值(它可以工作),然后我必须查看用户是否在我自己的DB中有用户名和密码(它工作),然后,如果用户不在数据库中,那么我必须创建它并获取ID,如果它已经创建,那么我只需要获取ID。

问题是我收到了这条消息:

  

InvalidOperationException是   用户代码未处理

     

已经存在Open DataReader   与此命令相关联,谁为   首先关闭。

有代码:

Class.cs:

    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);
    }

** Login.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");

编辑:更新代码(暂时可用)

2 个答案:

答案 0 :(得分:3)

错误意味着它的内容。你已经加载了一个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);
}

编辑:基于对此答案的评论,它需要使用看似奇怪/不正确的单独连接。

答案 1 :(得分:0)

您不能对用于插入的DataReader使用相同的insert/update。在将其他命令与DataReader相关联之前,您必须先关闭DataReader