Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/295.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 从存储过程内的select获取结果_C#_Asp.net_Json_Sql Server_Stored Procedures - Fatal编程技术网

C# 从存储过程内的select获取结果

C# 从存储过程内的select获取结果,c#,asp.net,json,sql-server,stored-procedures,C#,Asp.net,Json,Sql Server,Stored Procedures,我在MicrosoftSQLServer中有一个存储过程,它将数据插入表中,并作为输出返回错误代码和错误描述 private string[] SetServiceUpdateData(XmlDocument xmlDoc) { string[] returnParms = new string[2]; SqlConnection conn = new SqlConnection(ConfigurationManager.AppSettings["Acessos"].ToStr

我在MicrosoftSQLServer中有一个存储过程,它将数据插入表中,并作为输出返回错误代码和错误描述

private string[] SetServiceUpdateData(XmlDocument xmlDoc)
{
    string[] returnParms = new string[2];

    SqlConnection conn = new SqlConnection(ConfigurationManager.AppSettings["Acessos"].ToString());

    try
    {
        using (SqlCommand cmd = new SqlCommand("dbo.sp_ServiceUpdateData", conn))
        {
            cmd.CommandType = CommandType.StoredProcedure;

            cmd.Parameters.Add("@Id", SqlDbType.VarChar, 255).Value = ValidateParameter(xmlDoc.GetElementsByTagName("Id"));
            cmd.Parameters.Add("@Status", SqlDbType.VarChar, 255).Value = ValidateParameter(xmlDoc.GetElementsByTagName("Status"));

            cmd.Parameters.Add("@ERROR_CODE", SqlDbType.TinyInt, 4).Direction = ParameterDirection.Output;
            cmd.Parameters.Add("@ERROR_DESCRIPTION", SqlDbType.VarChar, 255).Direction = ParameterDirection.Output;

            conn.Open();
            cmd.ExecuteNonQuery();

            dataReader.Close();

            returnParms[0] = Convert.ToString(cmd.Parameters["@Error_code"].Value);
            returnParms[1] = Convert.ToString(cmd.Parameters["@ERROR_DESCRIPTION"].Value);
        }
    }
    catch (Exception e)
    {
        returnParms[0] = returnParms[0] + e.Source;
        returnParms[1] = returnParms[1] + e.Message;
    }
    finally
    {
        if ((conn != null) && (conn.State == ConnectionState.Open))
        {
            conn.Close();
            conn.Dispose();
            conn = null;
        }
    }
    return returnParms;
}
存储过程是这样的(它有很多参数,所以我删除了很多):

代码和存储过程工作正常,我可以插入值并返回输出。存储过程在插入后还有一个select,我需要返回json


如何在从存储过程返回返回返回参数的同时返回该select的值?

为此,您需要使用dataset来执行stroredprocedure。我已经修改了下面的代码

private string[] SetServiceUpdateData(XmlDocument xmlDoc)
{
    string[] returnParms = new string[2];

    SqlConnection conn = new SqlConnection(ConfigurationManager.AppSettings["Acessos"].ToString());

    try
    {
        using (SqlCommand cmd = new SqlCommand("dbo.sp_ServiceUpdateData", conn))
        {
            cmd.CommandType = CommandType.StoredProcedure;

            cmd.Parameters.Add("@Id", SqlDbType.VarChar, 255).Value = ValidateParameter(xmlDoc.GetElementsByTagName("Id"));
            cmd.Parameters.Add("@Status", SqlDbType.VarChar, 255).Value = ValidateParameter(xmlDoc.GetElementsByTagName("Status"));

            cmd.Parameters.Add("@ERROR_CODE", SqlDbType.TinyInt, 4).Direction = ParameterDirection.Output;
            cmd.Parameters.Add("@ERROR_DESCRIPTION", SqlDbType.VarChar, 255).Direction = ParameterDirection.Output;
  DataSet ds = new DataSet("MyDataSet");
            conn.Open();
        SqlDataAdapter da = new SqlDataAdapter();
        da.SelectCommand = sqlComm;

        da.Fill(ds);

            dataReader.Close();

            returnParms[0] = Convert.ToString(cmd.Parameters["@Error_code"].Value);
            returnParms[1] = Convert.ToString(cmd.Parameters["@ERROR_DESCRIPTION"].Value);
        }
    }
    catch (Exception e)
    {
        returnParms[0] = returnParms[0] + e.Source;
        returnParms[1] = returnParms[1] + e.Message;
    }
    finally
    {
        if ((conn != null) && (conn.State == ConnectionState.Open))
        {
            conn.Close();
            conn.Dispose();
            conn = null;
        }
    }
    return returnParms;
}

为此,您需要使用dataset来执行stroredprocedure。我已经修改了下面的代码

private string[] SetServiceUpdateData(XmlDocument xmlDoc)
{
    string[] returnParms = new string[2];

    SqlConnection conn = new SqlConnection(ConfigurationManager.AppSettings["Acessos"].ToString());

    try
    {
        using (SqlCommand cmd = new SqlCommand("dbo.sp_ServiceUpdateData", conn))
        {
            cmd.CommandType = CommandType.StoredProcedure;

            cmd.Parameters.Add("@Id", SqlDbType.VarChar, 255).Value = ValidateParameter(xmlDoc.GetElementsByTagName("Id"));
            cmd.Parameters.Add("@Status", SqlDbType.VarChar, 255).Value = ValidateParameter(xmlDoc.GetElementsByTagName("Status"));

            cmd.Parameters.Add("@ERROR_CODE", SqlDbType.TinyInt, 4).Direction = ParameterDirection.Output;
            cmd.Parameters.Add("@ERROR_DESCRIPTION", SqlDbType.VarChar, 255).Direction = ParameterDirection.Output;
  DataSet ds = new DataSet("MyDataSet");
            conn.Open();
        SqlDataAdapter da = new SqlDataAdapter();
        da.SelectCommand = sqlComm;

        da.Fill(ds);

            dataReader.Close();

            returnParms[0] = Convert.ToString(cmd.Parameters["@Error_code"].Value);
            returnParms[1] = Convert.ToString(cmd.Parameters["@ERROR_DESCRIPTION"].Value);
        }
    }
    catch (Exception e)
    {
        returnParms[0] = returnParms[0] + e.Source;
        returnParms[1] = returnParms[1] + e.Message;
    }
    finally
    {
        if ((conn != null) && (conn.State == ConnectionState.Open))
        {
            conn.Close();
            conn.Dispose();
            conn = null;
        }
    }
    return returnParms;
}

谢谢你的回复

我使用的解决方案是:

SqlDataReader dataReader = cmd.ExecuteReader();

DataTable dataTable = new DataTable();
dataTable.Load(dataReader);

returnParms[3] = string.Empty;
returnParms[3] = JsonConvert.SerializeObject(dataTable);
使用
Newtonsoft
转换为
json
,我的SP、int上出现了一些错误,它们是
varchars


谢谢大家的帮助

谢谢大家的回复

我使用的解决方案是:

SqlDataReader dataReader = cmd.ExecuteReader();

DataTable dataTable = new DataTable();
dataTable.Load(dataReader);

returnParms[3] = string.Empty;
returnParms[3] = JsonConvert.SerializeObject(dataTable);
使用
Newtonsoft
转换为
json
,我的SP、int上出现了一些错误,它们是
varchars


感谢大家提供的帮助

使用ExecuteReadInstant执行查询然后将读取器加载到数据表中您需要在SPUse ExecuteReadInstant中分配返回到输出变量的值ExecuteReadInstant执行查询然后将读取器加载到数据表中您需要分配返回到输出变量的值您的SP