asp.net c # ExecuteReader () ошибка - PullRequest
       19

asp.net c # ExecuteReader () ошибка

0 голосов
/ 29 сентября 2011

Следующий код выдает ошибку. dbo.getit отлично работает, когда я вызываю его прямо на сервере. Ошибка происходит в cmd.ExecuteReader (). Что я делаю не так?

    string user;
    string pw;
    SqlDataReader dr = null;
    SqlConnection conn = new SqlConnection("Data Source=xxx;Initial Catalog=myDB;    Integrated Security=True");

    user = Username.Text.Trim();
    pw = Password.Text.Trim();

    conn.Open();

   try {
        SqlCommand cmd = new SqlCommand("dbo.getit", conn);
        cmd.CommandType = CommandType.StoredProcedure;
        cmd.Parameters.AddWithValue("@param1", user);
        cmd.Parameters.AddWithValue("@param2", pw);

        dr = cmd.ExecuteReader();

        while ( dr.Read() )
        {
            Session["username"] = user;
            // Session["admin"] = 
            // Session["completed"] =
            Server.Transfer("all_is_well.aspx");

        }
        conn.Close();
        conn.Dispose();

    } catch (Exception ex) {
        if (dr != null)
        {
            dr.Close();
            conn.Close();
        }
        Server.Transfer("ERROR.aspx");
    }

РЕШЕНИЕ: Замените две соответствующие строки выше этими:

SqlCommand cmd = new SqlCommand("select * from dbo.getit(@param1, @param2);", conn);
cmd.CommandType = CommandType.text;

Ответы [ 3 ]

2 голосов
/ 29 сентября 2011

Это только кажется сомнительным,

Session["username"] = user; 
Server.Transfer("all_is_well.aspx"); 

внутри цикла while!

Можете ли вы хотя бы закончить итерацию в считывателе, используя временный объект для хранения результата запроса,а затем инициализируйте ваш сеанс и выполните Server.Transfer..

1 голос
/ 29 сентября 2011

Server.Transfer прекращает выполнение текущей страницы и начинает выполнение новой страницы для текущего запроса.Кроме того, передача вызовов Конец , который выдает исключение ThreadAbortException по завершении.

Я думаю, что вы пытаетесь сделать (, и я отвечаю нато, что вы пытаетесь сделать - не обязательно лучший способ ), это убедиться, что пользователь каким-то образом авторизован / аутентифицирован на основе хранилища данных.Вам было бы лучше вообще не использовать ExecuteReader.Используйте ExecuteScalar .Если результат ExecuteScalar не равен NULL, пользователь найден.

if (cmd.ExecuteScalar() != null)
{
   Server.Transfer("all_is_well.aspx");
}

else
{
   Server.Transfer("someErrorPage.aspx");
}
0 голосов
/ 18 ноября 2011

РЕШЕНИЕ: замените две соответствующие строки выше этими:

SqlCommand cmd = new SqlCommand("select * from dbo.getit(@param1, @param2);", conn);
cmd.CommandType = CommandType.text;

Это сработало.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...