我正在尝试从带有可选订单的数据库中提取记录。为此,我创建了一个存储过程(为了便于阅读,省略了几列):
CREATE PROCEDURE [dbo].[sp_VendorOverview] (@sortCol nvarchar(50)=NULL)
AS
BEGIN
SET NOCOUNT ON;
select v.Vid, s.Salutation, v.LastName, CONVERT(varchar(100), CAST(v.VAT AS decimal(38,0))) AS VAT
from vendors v
inner join Salutations s
on v.salutation=s.anrede
order by
CASE WHEN @sortCol='LastName' THEN v.LastName
WHEN @sortCol='FirstName' THEN v.FirstName
ELSE NULL
END,
CASE WHEN @sortCol ='VendorNumber' THEN v.VendorNumber
ELSE v.Vid
END
for xml path('VendorBasic'), root('Vendors')
END
在SSMS中运行此sp时,一切正常,结果与预期一致。 但是,尝试从C#应用程序中读取此内容时并非如此:
var vendoren = new List<VendorBasic>();
using (var con = new SqlConnection(ConfigurationManager.ConnectionStrings["Vendor"].ConnectionString))
{
var xml = string.Empty;
con.Open();
using (var cmd = new SqlCommand("dbo.sp_VendorOverview", con))
{
if (!string.IsNullOrEmpty(orderby))
cmd.Parameters.AddWithValue("@sortCol", orderby);
using (XmlReader idr = cmd.ExecuteXmlReader())
{
if (idr.Read())
{
xml = idr.ReadOuterXml();
}
idr.Close();
}
con.Close();
}
if (xml != string.Empty)
{
XmlRootAttribute xRoot = new XmlRootAttribute
{
ElementName = "Vendors",
IsNullable = true
};
var engine = new XmlSerializer(typeof(List<VendorBasic>), xRoot);
vendoren = (List<VendorBasic>)engine.Deserialize(new StringReader(xml));
}
}
反序列化工作正常,为VendorBasic类设置了XmlRoot属性。 我得到了结果。 它们从来没有被Vid以外的任何东西订购。我已经设置了一个断点来检查参数是否正确应用,以防我想要由任何其他列进行排序。它是:
我错过了什么吗?我做错了吗?
答案 0 :(得分:1)
您需要通过执行
告诉SqlCommand
您正在执行存储过程而不是任意命令
cmd.CommandType = CommandType.StoredProcedure;
如果没有它,它基本上会忽略所有参数并使用默认参数执行过程(在这种情况下为null
)。您可以在此问题中找到有关此内容的更多信息:When executing a stored procedure, what is the benefit of using CommandType.StoredProcedure versus using CommandType.Text?。