C# 调用SQL Server存储过程时的结果为空

C# 调用SQL Server存储过程时的结果为空,c#,asp.net,sql-server,stored-procedures,asp.net-web-api,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)

我正在使用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
我得到一个空的结果集。如果在SQL Server中使用相同的
GUID
值运行相同的存储过程,则会得到一个非空的结果集

我在VB.NET web窗体应用程序中使用了相同的SP,没有任何问题

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

当我在SQL Server上运行相同的SP时 你可以试试这个

cmd.Parameters.Add("@GUID", SqlDbType.UniqueIdentifier).Value = id;
cmd.Parameters.AddWithValue("@GUID", id.ToString().ToUpper());
如果您的
@GUID
类型为
UniqueIdentifier
如果是
varchar
nvarchar
,请尝试此操作

cmd.Parameters.Add("@GUID", SqlDbType.UniqueIdentifier).Value = id;
cmd.Parameters.AddWithValue("@GUID", id.ToString().ToUpper());
将类型
GUID
转换为
String

编辑

我注意到在您的sp中,
guid
大写的
,而在code
guid
中,将字符串转换为
小写的
,这可能是造成问题的原因,因此请尝试添加此
.ToUpper()
以使字符串成为
大写的
可能

我当然会改变策略,避免使用“”

(如果您被迫提供所有参数,“else”条件已就位。)

顺便说一下,强烈建议您使用()实现,因为它负责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;
}

在调试器中单步执行时的结果是什么?AuthorizationResult对象是否正确填充?(如前所述,即使程序按预期运行,您也只能在每个AuthorizationResult中填充AuthNo。)@Khelvaster我填充AuthNo只是为了调试目的。如果尝试使用索引值填充AuthorizationResult对象,则会出现索引越界异常。如果我按列名做,我也会得到一个错误。如果我找到任何东西,我将逐步调试并更新我的问题数据库中@guid列的类型是什么?它是否给出了任何错误?旁注:您不应该在存储过程中使用
sp\uu
前缀。微软已经这样做了,而且你确实有可能在将来的某个时候发生名称冲突。最好只是简单地避免使用
sp.
并使用其他东西作为前缀,或者根本不使用前缀!我的
@Guid
类型为
UnqiueIdentifier
。我尝试了你的建议,但不幸的是,我仍然得到一个空的结果集,如果你尝试.tostring,那么?你能尝试添加像
cmd.Parameters.AddWithValue(“@guid”,“B49FFBD7…”)这样的guid吗谢谢,但Guid不区分大小写。我尝试对GUID进行硬编码并使用
ToString().ToUpper()
,但仍然得到一个空的数据集如果不了解SPC内部的内容,很难找到问题这很有意义,但是,如果我不提供参数,我会收到一个
SqlException
,因为
SP\u Auth\u Search
要求提供所有参数。将
else cmd.Parameters.AddWithValue(“@AUTHNO”,DBNull.Value)是正确的方法吗?这似乎有点矛盾。。。未传递时,SP将parms默认为NULL。我不熟悉SP_Auth_Search。。。我对它做了一个眼罩,但什么也没有出现。。。如果您在“某处”应用了此设置,我建议您将其关闭。。同样,这是因为在SP中,通过设置默认的NULL值,使参数成为可选的。然后,我可能再次读错了-我看到运行它时,您提供了NULL。也许您可以修改SP,使参数默认为NULL(如果尚未设置)。
SP\u Auth\u Search
是我的老板编写的自定义存储过程。不幸的是,我没有权限对数据库进行任何编程更改。获取它-然后传递NULL值,而不是“”。