C# 调用SQL Server存储过程时的结果为空
我正在使用ASP.NET构建一个WebAPI,以公开我在数据库中实现的一些存储过程。我正在使用ADO.NET调用存储过程 我有一个控制器: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)
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
是大写的
,而在codeguid
中,将字符串转换为小写的
,这可能是造成问题的原因,因此请尝试添加此.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值,而不是“”。