【问题标题】:Problem with multiple SqlDataReader and SqlCommand in a Class一个类中有多个 SqlDataReader 和 SqlCommand 的问题
【发布时间】:2011-06-10 00:25:24
【问题描述】:

我有一个 C# 问题,我有一个类,其中一个函数用于 SqlDataReader,另一个用于 SqlCommand(第一个仅用于从数据库读取值,第二个用于 INSERT、UPDATE、DELETE ...相同的数据库)。

问题是,对于代码的第一部分(登录),我必须从 Active Directory 中搜索值(它有效),然后我必须查看用户在我自己的数据库中是否有用户名和密码(它有效),然后,如果用户不在数据库中,那么我必须创建它并获取 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");

编辑:更新代码(目前可用)

【问题讨论】:

    标签: c# sql-server class sqldatareader


    【解决方案1】:

    该错误的含义与它所说的完全一样。您已经加载了一个 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);
    }
    

    编辑:根据这个答案的 cmets,它需要使用单独的连接,这看起来很奇怪/不正确。

    【讨论】:

    • 您好,感谢您的帮助。问题是如果我关闭阅读器我必须开始另一个时间查询我不知道它是否非常有效......有没有解决方案你只使用类来解决问题?
    • @aliasbody 我刚刚添加了一种方法来更改您的 DBMyUpdate 函数以使用不应与现有阅读器冲突的新命令。
    • 在您的代码有效之前不要担心效率。您不想要快速损坏的代码。
    • 用你的代码我得到了同样的错误......这没有任何意义,因为我使用了一个新的 SqlCommand......
    • @aliasbody 你确定这是重新编译的吗?只是确保,因为这听起来不正确得到同样的错误..
    【解决方案2】:

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

    【讨论】:

    • 但是当我试图关闭类中的阅读器时(所以操作是自动的)然后我收到一个错误,说更新功能上没有打开连接:S...
    猜你喜欢
    • 1970-01-01
    • 2013-02-06
    • 1970-01-01
    • 2013-06-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-06-30
    相关资源
    最近更新 更多