我正在使用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是否正确。我还缺少什么?
答案 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
,如果其为varchar
或nvarchar
,请尝试此
cmd.Parameters.AddWithValue("@GUID", id.ToString().ToUpper());
将类型GUID
转换为String
修改强>
我注意到你的guid
是upper case
而代码guid
将字符串转换为lower case
可能会导致问题,所以请尝试添加此.ToUpper()
制作字符串uppercase