Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/308.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sql-server/27.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 类中多个SqlDataReader和SqlCommand存在问题_C#_Sql Server_Class_Sqldatareader - Fatal编程技术网

C# 类中多个SqlDataReader和SqlCommand存在问题

C# 类中多个SqlDataReader和SqlCommand存在问题,c#,sql-server,class,sqldatareader,C#,Sql Server,Class,Sqldatareader,我对C#有一个问题,我有一个类,其中一个函数用于SqlDataReader,另一个函数用于SqlCommand(第一个用于从数据库读取值,第二个用于在同一个数据库中插入、更新、删除…) 问题是,对于代码的第一部分(登录),我必须从Active Directory中搜索值(它可以工作),然后我必须查看用户在我自己的数据库中是否有用户名和密码(它可以工作),然后,如果用户不在数据库中,我必须创建它并获取ID,如果已经创建了,那么我只需要获取ID 问题是我得到了这样的信息: 无效操作异常为 未由用户代

我对C#有一个问题,我有一个类,其中一个函数用于SqlDataReader,另一个函数用于SqlCommand(第一个用于从数据库读取值,第二个用于在同一个数据库中插入、更新、删除…)

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

问题是我得到了这样的信息:

无效操作异常为 未由用户代码处理

已经存在一个开放的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");

编辑:更新代码(目前有效)

错误的意思与它所说的完全一致。。您已经加载了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);
}

编辑:根据对此答案的评论,它要求使用单独的连接,这似乎很奇怪/不正确。

错误的意思与它所说的完全一致。。您已经加载了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);
}

编辑:根据对此答案的评论,它要求使用单独的连接,这似乎很奇怪/不正确。

您不能使用与插入相同的
DataReader
进行插入/更新。您必须先关闭
DataReader
,然后才能将其他命令与
DataReader

关联。您不能将用于插入的
insert/update
使用相同的
DataReader
。您必须先关闭
DataReader
,然后才能将其他命令与
DataReader
关联。您好,谢谢您的帮助。问题是,如果我关闭阅读器,我必须重新开始时间反查询,我不知道它是否非常有效。。。只有使用classe才能解决这个问题吗?@aliasbody我刚刚添加了一种方法来更改DBMyUpdate函数,使其使用一个新命令,该命令不应与现有的读取器冲突。在代码正常工作之前,不要担心效率。你不想要快速破解的代码。用你的代码我得到了同样的错误。。。这没有任何意义,因为我使用了一个新的SqlCommand…@aliasbody你确定这是重新编译的吗?只是确定一下,因为这听起来不太可能得到同样的错误..嗨,谢谢你的帮助。问题是,如果我关闭阅读器,我必须重新开始时间反查询,我不知道它是否非常有效。。。只有使用classe才能解决这个问题吗?@aliasbody我刚刚添加了一种方法来更改DBMyUpdate函数,使其使用一个新命令,该命令不应与现有的读取器冲突。在代码正常工作之前,不要担心效率。你不想要快速破解的代码。用你的代码我得到了同样的错误。。。这没有任何意义,因为我使用了一个新的SqlCommand…@aliasbody你确定这是重新编译的吗?只是确定一下,因为这听起来不适合得到相同的错误..但是当我试图关闭类中的读卡器(因此操作是自动的)时,我得到一个错误,说更新函数上没有打开的连接:S…但是当我试图关闭类中的读卡器时(因此操作是自动的)然后我得到一个错误,说更新函数上没有打开连接:S。。。