C# 从存储过程返回值
我在数据库中有:C# 从存储过程返回值,c#,sql-server,linq,C#,Sql Server,Linq,我在数据库中有: ALTER PROCEDURE [dbo].[uspConsumeEnrollments] (--@File NVARCHAR(300), @XML XML, @FamilySent INT = 0 OUTPUT) AS BEGIN SELECT @FamilySent = 755; 在这里,我尝试下载数据: public int Create(FamilyModel model) { try { var X
ALTER PROCEDURE [dbo].[uspConsumeEnrollments]
(--@File NVARCHAR(300),
@XML XML,
@FamilySent INT = 0 OUTPUT)
AS
BEGIN
SELECT @FamilySent = 755;
在这里,我尝试下载数据:
public int Create(FamilyModel model)
{
try
{
var XML = model.GetEnrolmentFromModel().Serialize();
var RV = -99;
var familySent = 0;
using (var imisContext = new ImisDB())
{
var returnParameter = new SqlParameter("@RV", SqlDbType.Int);
returnParameter.Direction = ParameterDirection.Output;
var xmlParameter = new SqlParameter("@XML", XML);
xmlParameter.DbType = DbType.Xml;
var familySentParameter = new SqlParameter("@FamilySent", SqlDbType.Int);
familySentParameter.Value = 0;
familySentParameter.Direction = ParameterDirection.Output;
var sql = "exec @RV = uspConsumeEnrollments @XML, @FamilySent";
SqlParameter[] myParams = { returnParameter, xmlParameter, familySentParameter };
var result = imisContext.Database.ExecuteSqlCommand(sql, myParams);
RV = (int)returnParameter.Value;
Debug.WriteLine("RV: " + RV);
try
{
familySent = (int)familySentParameter.Value;
}
catch { }
Debug.WriteLine("familySent: " + familySent);
}
return RV;
}
catch (SqlException e)
{
}
}
对程序的引用是有效的,因为我得到了RV
我对FamilySent
有问题:我没有得到任何值
在上面的例子中,我有@FamilySent=755代码>
应将其返回并在中显示
Debug.WriteLine("familySent:" + familySent);
但它不起作用。请尝试以下方法:
存储过程的修改版本:
ALTER PROCEDURE [dbo].[uspConsumeEnrollments](
--@File NVARCHAR(300),
@XML XML,
@FamilySent INT = 0 OUTPUT
)
AS
BEGIN
SELECT @FamilySent = 755 as FamilySent;
C#代码:
public int创建(FamilyModel模型)
{
尝试
{
var XML=model.GetEnrolmentFromModel().Serialize();
var-RV=-99;
var familySent=0;
使用(SqlConnection cnx=newsqlconnection(connexionString))
使用(SqlCommand cmd=newsqlcommand(“[dbo].[uspconsumerentrollments]”,cnx))
{
cmd.CommandType=CommandType.storedProcess;
var xmlParameter=newsqlparameter(“@XML”,XML);
xmlParameter.DbType=DbType.Xml;
cmd.Parameters.Add(xmlParameter);
var familySentParameter=new-SqlParameter(@FamilySent”,SqlDbType.Int);
familySentParameter.Value=0;
familySentParameter.Direction=ParameterDirection.Output;
cmd.Parameters.Add(familySentParameter);
cnx.Open();
List res=新列表();
使用(SqlDataReader=cmd.ExecuteReader())
{
if(reader.HasRows)
{
while(reader.Read())
{
对于(int i=0;i0){
foreach(res中的字符串[]s){
RV=s[1];
打破
}
}
}
cnx.Close();
返回RV;
}
捕获(SQLE异常)
{
}
}
请尝试以下方法:
存储过程的修改版本:
ALTER PROCEDURE [dbo].[uspConsumeEnrollments](
--@File NVARCHAR(300),
@XML XML,
@FamilySent INT = 0 OUTPUT
)
AS
BEGIN
SELECT @FamilySent = 755 as FamilySent;
C#代码:
public int创建(FamilyModel模型)
{
尝试
{
var XML=model.GetEnrolmentFromModel().Serialize();
var-RV=-99;
var familySent=0;
使用(SqlConnection cnx=newsqlconnection(connexionString))
使用(SqlCommand cmd=newsqlcommand(“[dbo].[uspconsumerentrollments]”,cnx))
{
cmd.CommandType=CommandType.storedProcess;
var xmlParameter=newsqlparameter(“@XML”,XML);
xmlParameter.DbType=DbType.Xml;
cmd.Parameters.Add(xmlParameter);
var familySentParameter=new-SqlParameter(@FamilySent”,SqlDbType.Int);
familySentParameter.Value=0;
familySentParameter.Direction=ParameterDirection.Output;
cmd.Parameters.Add(familySentParameter);
cnx.Open();
List res=新列表();
使用(SqlDataReader=cmd.ExecuteReader())
{
if(reader.HasRows)
{
while(reader.Read())
{
对于(int i=0;i0){
foreach(res中的字符串[]s){
RV=s[1];
打破
}
}
}
cnx.Close();
返回RV;
}
捕获(SQLE异常)
{
}
}
它会引发异常吗?您是否尝试过调试它?此外,您应该使用读卡器从存储的数据中获取数据procedure@taktakFamilySent获取空值。您可以对读取器多说些什么吗?读取器会让您循环存储过程的结果。这样您就可以得到所需的所有结果。我会尽力给您一个答案你可以test@taktak好的,我正在等待我的解决方案,别忘了完成我的代码,我只给了你捕获数据的方法。它会引发异常吗?你试过调试它吗?另外,你应该使用一个读卡器从你存储的数据中获取数据procedure@taktakFamilySent获取空值。您可以说一些关于读者的更多信息吗?读者使您可以循环存储过程的结果。这样您就可以得到所需的所有结果。我将尽力给您一个您可以得到的答案test@taktak好的,我正在等待我的解决方案,别忘了完成我的代码,我只给了你捕获数据的方法。我编辑了我的代码,我删除了参数@RV,因为它完全没有用。我还更正了d您的存储过程因为您可以为返回的FamilySent命名I编辑了我的代码,我删除了参数@RV,因为它完全没有用处。我还更正了您的存储过程,因为您可以为返回的FamilySent命名