Асинхронные вызовы в хранимых процедурах веб-форм ASP.net - PullRequest
0 голосов
/ 05 декабря 2018

Хранимые процедуры

CREATE PROCEDURE Contributor_Search
    @fullname VARCHAR(60)
AS
    SELECT 
        C.id, years_of_experience, portfolio_link, specialization,
        notified_id, email, first_name, middle_name, last_name,
        birth_date, age 
    FROM 
        Contributor C 
    INNER JOIN 
        [User] U ON C.id = U.id
    WHERE 
        U.first_name + ' ' + U.middle_name + ' ' + U.last_name = @fullname

CREATE PROCEDURE Show_Original_Content
    @contributor_id INT
AS
    IF @contributor_id IS NULL
        SELECT * 
        FROM Original_Content OC 
        INNER JOIN Content C ON OC.id = C.id 
        INNER JOIN Contributor CO ON C.contributor_id = CO.id 
        WHERE OC.filter_status = 1
    ELSE
        SELECT * 
        FROM Original_Content OC 
        INNER JOIN Content C ON OC.id = C.id 
        INNER JOIN Contributor CO ON C.contributor_id = CO.id 
        WHERE OC.filter_status = 1 AND CO.id = @contributor_id

Я хочу запустить первую хранимую процедуру, если введен ввод, а если нет, просто перейти на вторую с нулем;однако, если ввод предоставлен и он выполняется, я хотел бы получить идентификатор с помощью первой процедуры, а затем использовать его во второй процедуре, это мой текущий подход, который, к сожалению, не работает.

protected void btnSearch_Click(object sender, EventArgs e)
{
    string connectionStr = @"Data Source=(localdb)\MSSQLLocalDB;Initial Catalog=iEgypt;";

    if(inputName.Value.Trim() != "")
    {
        using (SqlConnection con = new SqlConnection(connectionStr))
        {
            SqlCommand cmd = new SqlCommand();
            cmd.Connection = con;
            cmd.CommandText = "Contributor_Search";
            cmd.CommandType = CommandType.StoredProcedure;

            if (inputName.Value.Trim() != "")
            {
                SqlParameter param = new SqlParameter("@fullname", inputName.Value);
                cmd.Parameters.Add(param);
            }
            else
            {
                SqlParameter param = new SqlParameter("@fullname", DBNull.Value);
                cmd.Parameters.Add(param);
            }

            con.Open();

            SqlDataReader rdr = cmd.ExecuteReader();

            id = rdr[0].ToString();
            con.Close();
        }
    }

    using (SqlConnection con = new SqlConnection(connectionStr))
    {
        SqlCommand cmd = new SqlCommand();
        cmd.Connection = con;
        cmd.CommandText = "Show_Original_Content";
        cmd.CommandType = CommandType.StoredProcedure;

        if (id != "")
        {
            SqlParameter param = new SqlParameter("@contributor_id", inputName.Value);
            cmd.Parameters.Add(param);
        }
        else
        {
            SqlParameter param = new SqlParameter("@contributor_id", DBNull.Value);
            cmd.Parameters.Add(param);
        }

        con.Open();

        SqlDataReader rdr = cmd.ExecuteReader();

        gvSearchResults.DataSource = rdr;
        gvSearchResults.DataBind();
    }
}

Любойпомощь очень ценится.

1 Ответ

0 голосов
/ 06 декабря 2018

В комментариях @vjgn предлагает вызвать метод Read перед доступом к строкам в SqlDataReader.Например:

SqlDataReader rdr = cmd.ExecuteReader();
if (rdr.Read())
{
    id = rdr[0].ToString();
}

Это должно работать ... Или же вы можете использовать метод ExecuteScalar и не беспокоиться об открытии считывателя:

id = cmd.ExecuteScalar()?.ToString() ?? "";

Проблема сто есть теперь вам нужно проверить null, а затем преобразовать его в пустую строку.Вероятно, лучше избегать преобразования в пустую строку и просто проверять оба в вашем операторе if.

id = cmd.ExecuteScalar()?.ToString();

...

if (!String.IsNullOrEmpty(id))

Другая потенциальная точка ошибки - если запись имеет нулевое значение в first_name, middle_name или last_name, тогда ваш поиск не найдет никаких результатов, потому что, когда вы объединяете нулевое значение с ненулевым значением, вы получаете ноль.Попробуйте изменить предложение where на следующее:

isnull(U.first_name,'') + ' ' + isnull(U.middle_name,'') + ' ' + isnull(U.last_name,'') = @fullname

Похоже, что точный поиск ...

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