存储过程
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_name
、middle_name
或 last_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/