【问题标题】:Asynchronous calls in ASP.net webforms stored proceduresASP.net webforms 存储过程中的异步调用
【发布时间】:2019-05-07 10:56:32
【问题描述】:

存储过程

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

如果提供了输入,我想运行第一个存储过程,如果没有,则直接跳到第二个,返回 null;如果提供了输入并且它已经运行,我想使用第一个过程获取一个 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();
    }
}

非常感谢任何帮助。

【问题讨论】:

  • 必须在访问数据读取器中的行之前调用SqlDataReaderRead() 方法。

标签: c# asp.net sql-server visual-studio webforms


【解决方案1】:

在 cmets 中,@vjgn 建议在访问 SqlDataReader 中的行之前调用 Read 方法。例如:

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_namemiddle_namelast_name 中有空值,那么您的搜索将找不到任何结果,因为当您将空值与非空值连接时值,你得到空值。尝试将 where 子句更改为以下内容:

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

这看起来像是在进行精确搜索...

【讨论】:

  • 工作并感谢改进,非常感谢。
猜你喜欢
  • 2010-09-06
  • 1970-01-01
  • 2019-03-14
  • 1970-01-01
  • 1970-01-01
  • 2011-03-18
  • 2021-04-02
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多