调用SQL Server存储过程时出现空结果

时间:2017-03-22 01:21:29

标签: c# asp.net sql-server stored-procedures asp.net-web-api

我正在使用ASP.NET构建一个WebAPI来公开我在数据库中实现的一些存储过程。我正在使用ADO.NET来调用存储过程。

我有一个控制器:

public class AuthController : ApiController
{
    [HttpGet]
    [ActionName("AuthSearch")]
    public AuthorizationResult GetAuthSearch(Guid? id, [FromUri]AuthorizationQuery Query)
    {
        SqlConnection con = new SqlConnection("Connection String");
        SqlDataReader reader = null;

        try
        {
            con.Open();

            SqlCommand cmd = new SqlCommand("SP_AUTH_SEARCH", con);
            cmd.CommandType = CommandType.StoredProcedure;

            cmd.Parameters.AddWithValue("@GUID", id);
            cmd.Parameters.AddWithValue("@AUTHNO", Query.AuthNo);
            cmd.Parameters.AddWithValue("@STATUS", Query.Status);
            cmd.Parameters.AddWithValue("@REQDATE_BEGIN", Query.ReqDateBegin);
            cmd.Parameters.AddWithValue("@REQDATE_END", Query.ReqDateEnd);
            cmd.Parameters.AddWithValue("@REQDATE_OP", Query.ReqDateOp);
            cmd.Parameters.AddWithValue("@AUTDATE_BEGIN", Query.AuthDateBegin);
            cmd.Parameters.AddWithValue("@AUTDATE_END", Query.AuthDateEnd);
            cmd.Parameters.AddWithValue("@AUTDATE_OP", Query.AuthDateOp);
            cmd.Parameters.AddWithValue("@EXPDATE_BEGIN", Query.ExpDateBegin);
            cmd.Parameters.AddWithValue("@EXPDATE_END", Query.ExpDateEnd);
            cmd.Parameters.AddWithValue("@EXPDATE_OP", Query.ExpDateOp);
            cmd.Parameters.AddWithValue("@REFPROV", Query.RefProv);
            cmd.Parameters.AddWithValue("@REQPROV_FIRST", Query.ReqProvFirst);
            cmd.Parameters.AddWithValue("@REQPROV_LAST", Query.ReqProvLast);
            cmd.Parameters.AddWithValue("@MEMB_FIRST", Query.MembFirst);
            cmd.Parameters.AddWithValue("@MEMB_LAST", Query.MembLast);
            cmd.Parameters.AddWithValue("@MEMB_ID", Query.MembId);
            cmd.Parameters.AddWithValue("@SORT_COLUMN", 1);
            reader = cmd.ExecuteReader();
            AuthSearchResult auth = null;
            if (reader.Read())
            {
                auth = new AuthSearchResult();
                auth.AuthNo = reader[0].ToString();

            }

            return auth;
        }
        catch (Exception e)
        {
            AuthorizationResult auth = null;
            auth = new AuthorizationResult();
            auth.Descr = e.ToString();
            return auth;
        }
        finally
        {
            con.Close();
        }
    }
}

还有一些模型类:

public class AuthorizationResult
{
    public string AuthNo { get; set; }
    public string Descr { get; set; }
    public string MembId { get; set; }
    public string MembName { get; set; }
    public string MembSex { get; set; }
    public string MembDob { get; set; }
    public string MembHp { get; set; }
    public string ProvName { get; set; }
    public string AuthDate { get; set; }
    public string ReqDate { get; set; }

    public AuthorizationResult()
    {
        AuthNo = " ";
        Descr = " ";
        MembId = " ";
        MembName = " ";
        MembSex = " ";
        MembDob = " ";
        MembHp = " ";
        ProvName = " ";
        AuthDate = " ";
        ReqDate = " ";
    }
}

public class AuthorizationQuery
{
    public string AuthNo { get; set; }

    public string Status { get; set; }
    public string ReqDateBegin { get; set; }
    public string ReqDateEnd { get; set; }
    public string ReqDateOp { get; set; }
    public string AuthDateBegin { get; set; }
    public string AuthDateEnd { get; set; }
    public string AuthDateOp { get; set; }
    public string ExpDateBegin { get; set; }
    public string ExpDateEnd { get; set; }
    public string ExpDateOp { get; set; }
    public string RefProv { get; set; }
    public string ReqProvFirst { get; set; }
    public string ReqProvLast { get; set; }
    public string MembFirst { get; set; }
    public string MembLast { get; set; }
    public string MembId { get; set; }

    public AuthorizationQuery()
    {
        AuthNo = "";
        Status = "";
        ReqDateBegin = "";
        ReqDateEnd = "";
        ReqDateOp = "";
        AuthDateBegin = "";
        AuthDateEnd = "";
        AuthDateOp = "";
        ExpDateBegin = "";
        ExpDateEnd = "";
        ExpDateOp = "";
        RefProv = "";
        ReqProvFirst = "";
        ReqProvLast = "";
        MembFirst = "";
        MembLast = "";
        MembId = "";
    }
}

然而,当我运行我的项目并导航到

localhost/api/Auth/AuthSearch?id=GUID

我得到一个空的结果集。如果我使用相同的GUID值在SQL Server中运行相同的存储过程,则会得到非空的结果集。

我在VB.NET网络表单应用程序中使用了相同的SP而没有任何问题。

我确保连接字符串是正确的,并且我已经仔细检查了我使用的GUID是否正确。我还缺少什么?

当我在SQL Server上运行相同的SP时 When I run the same Stored Procedure on SQLServer

2 个答案:

答案 0 :(得分:1)

也许......

我当然要改变我的策略是避免使用“”。

(如果您被迫提供所有参数,则为“其他”条件。)

if (!String.IsNullOrEmpty(Query.AuthNo))
 cmd.Parameters.AddWithValue("@AUTHNO", Query.AuthNo);
else
 cmd.Parameters.AddWithValue("@AUTHNO", DBNull.Value);

顺便说一句,强烈建议您实施USING(),因为它负责DISPOSE和CLOSE等。

using (var ds = new DataSet())
{
  using (var con = new SqlConnection("Connection String"))
  {
    using (var cmd = new SqlCommand("SP_AUTH_SEARCH", con))
    {
      using (var adapter = new SqlDataAdapter(cmd))
      {
        con.Open();
        adapter.Fill(ds);
      }
    }
  }
  AuthorizationResult auth = null;
  auth = new AuthorizationResult();

  foreach (DataRow dr in ds.Tables[0].Rows)
  {
    auth.AuthNo = dr[0].ToString();
  }

  return auth;
}

答案 1 :(得分:0)

你可以试试这个

cmd.Parameters.Add("@GUID", SqlDbType.UniqueIdentifier).Value = id;

如果您的@GUID类型为UniqueIdentifier,如果其为varcharnvarchar,请尝试此

cmd.Parameters.AddWithValue("@GUID", id.ToString().ToUpper());

将类型GUID转换为String

修改

我注意到你的guidupper case而代码guid将字符串转换为lower case可能会导致问题,所以请尝试添加此.ToUpper()制作字符串uppercase