Проблема с несколькими SqlDataReader и SqlCommand в классе - PullRequest
0 голосов
/ 09 июня 2011

У меня проблема с C #, у меня есть класс с функцией для SqlDataReader и другой для SqlCommand (первый предназначен только для чтения значений из базы данных, а второй - для INSERT, UPDATE, DELETE ... вта же база данных).

Проблема в том, что для первой части кода (логина) мне нужно искать значения в Active Directory (это работает), затем я должен видеть, есть ли у пользователяимя пользователя и пароль в моей собственной БД (это работает), и затем, если пользователь не находится в БД, тогда я должен создать его и получить идентификатор, если он уже создан, тогда я просто должен получить идентификатор.

Проблема в том, что я получаю это сообщение:

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 ]

3 голосов
/ 09 июня 2011

Ошибка означает именно то, что написано. Вы загрузили 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);
}

edit: на основе комментариев к этому ответу требуется использование отдельных соединений, которые кажутся странными / неправильными.

0 голосов
/ 09 июня 2011

Нельзя использовать тот же DataReader для insert/update, который вы использовали для вставки. Вы должны закрыть DataReader перед тем, как связать какую-либо другую команду с DataReader.

...