c# - ASP.net webforms 存储过程中的异步调用

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

存储过程

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

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

非常感谢任何帮助。

最佳答案

在评论中,@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

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

关于c# - ASP.net webforms 存储过程中的异步调用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53639644/

相关文章:

c# - 从表中的所有行计算 TotalAmount

c# - Unity 中脚本之间最佳的通信方式是什么

c# - 如何在没有内存问题的情况下加载/操作大图像?

c# - 此正则表达式是否允许 "*"?

sql-server - SQL REPLACE 给出错误 : 'String or binary data would be truncated.'

c# - 如何在 Swagger-ui 进行的 oauth2/token 调用中发送 "audience"字段?

c# - 同一张表中的两个一对多关系

asp.net - CSLA 在更改后未将对象报告为脏对象

SQL Server 分区。为明年创建新分区

sql - CASE 表达式中的 MSSQL 子选择