Member 12962919 Ответов: 1

Как сделать веб-сервис с несколькими выходными параметрами?


Я пробовал, но он возвращает null.

Что я уже пробовал:

Моя хранимая процедура такова

USE [webservice]
GO
/****** Object:  StoredProcedure [dbo].[SP_VALIDATE_VIN]    Script Date: 6/30/2017 10:11:32 AM ******/
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
ALTER Proc [dbo].[SP_VALIDATE_VIN]
 @p_vin  varchar(1000),
 @Pmc int,
 @VIN                       varchar(1000) output,
@VEHICLE_MODEL             varchar(1000) output,
@MANUFACTURING_MONTH_YEAR  varchar(1000) output,
@INVOICE_NUMBER            varchar(1000) output,
@INVOICE_DATE              varchar(1000) output,
@INVOICE_TYPE              varchar(1000) output,
@INVOICE_DLR_FOR_CD        varchar(1000) output,
@CUST_NAME                 varchar(1000) output,
@CUST_ADDRESS1             varchar(1000) output,
@CUST_ADDRESS2             varchar(1000) output,
@CUST_ADDRESS3             varchar(1000) output,
@CUST_CITY                 varchar(1000) output,
@CUST_STATE                varchar(1000) output,
@CUST_PINCODE              varchar(1000) output,
@CUST_MOBILE               varchar(1000) output,
@CUST_EMAIL                varchar(1000) output,
@ERR_CD                    int output,
@ERR_MSG                   varchar(1000) output
 as begin
 select @VIN=VIN,@VEHICLE_MODEL=VEHICLE_MODEL,@MANUFACTURING_MONTH_YEAR=MANUFACTURING_MONTH_YEAR,@INVOICE_NUMBER=INVOICE_NUMBER,@INVOICE_DATE=INVOICE_DATE,@INVOICE_TYPE=INVOICE_TYPE,@INVOICE_DLR_FOR_CD=INVOICE_DLR_FOR_CD,@CUST_NAME=CUST_NAME,@CUST_ADDRESS1=CUST_ADDRESS1,@CUST_ADDRESS2=CUST_ADDRESS2,@CUST_ADDRESS3=CUST_ADDRESS3,
 @CUST_CITY=CUST_CITY,@CUST_STATE=@CUST_STATE,@CUST_PINCODE=@CUST_PINCODE,@CUST_MOBILE=@CUST_MOBILE,@CUST_EMAIL=CUST_EMAIL,@ERR_CD=ERR_CD,@ERR_MSG=ERR_MSG  from Validate_vin where P_VIN=@p_vin and PMC= @Pmc
 
 end


и мой код веб-сервиса таков

public string validate_vin(string _p_vin, int _PMC)
{
    List<Validate_vin> Vinvalidationlist = new List<Validate_vin>();
    try
    {

        // string sql = "select VIN,VEHICLE_MODEL,MANUFACTURING_MONTH_YEAR,INVOICE_NUMBER,INVOICE_DATE,INVOICE_TYPE,INVOICE_DLR_FOR_CD,CUST_NAME,CUST_ADDRESS1,CUST_ADDRESS2,CUST_ADDRESS3,CUST_CITY,CUST_STATE,CUST_PINCODE,CUST_MOBILE,CUST_EMAIL,ERR_CD,ERR_MSG from Validate_vin where P_VIN = '" + _p_vin + "' and PMC = '" + _PMC + "'";
        using (SqlConnection con = new SqlConnection(conn))
        {
            SqlCommand cmd = new SqlCommand();
            cmd.Connection = con;
            con.Open();
            cmd.CommandType = CommandType.StoredProcedure;
            cmd.CommandText = "SP_VALIDATE_VIN";
            cmd.Parameters.AddWithValue("@p_vin", _p_vin);
            cmd.Parameters.AddWithValue("@Pmc", _PMC);
            cmd.Parameters.Add("@VIN", SqlDbType.VarChar,1000);
            cmd.Parameters["@VIN"].Direction = ParameterDirection.Output;
            cmd.Parameters.Add("@VEHICLE_MODEL", SqlDbType.VarChar,1000);
            cmd.Parameters["@VEHICLE_MODEL"].Direction = ParameterDirection.Output;
            cmd.Parameters.Add("@MANUFACTURING_MONTH_YEAR", SqlDbType.VarChar,1000);
            cmd.Parameters["@MANUFACTURING_MONTH_YEAR"].Direction = ParameterDirection.Output;
            cmd.Parameters.Add("@INVOICE_NUMBER", SqlDbType.VarChar,1000);
            cmd.Parameters["@INVOICE_NUMBER"].Direction = ParameterDirection.Output;
            cmd.Parameters.Add("@INVOICE_DATE", SqlDbType.VarChar,1000);
            cmd.Parameters["@INVOICE_DATE"].Direction = ParameterDirection.Output;
            cmd.Parameters.Add("@INVOICE_TYPE", SqlDbType.VarChar,1000);
            cmd.Parameters["@INVOICE_TYPE"].Direction = ParameterDirection.Output;
            cmd.Parameters.Add("@INVOICE_DLR_FOR_CD", SqlDbType.VarChar,1000);
            cmd.Parameters["@INVOICE_DLR_FOR_CD"].Direction = ParameterDirection.Output;
            cmd.Parameters.Add("@CUST_NAME", SqlDbType.VarChar,1000);
            cmd.Parameters["@CUST_NAME"].Direction = ParameterDirection.Output;
            cmd.Parameters.Add("@CUST_ADDRESS1", SqlDbType.VarChar,1000);
            cmd.Parameters["@CUST_ADDRESS1"].Direction = ParameterDirection.Output;
            cmd.Parameters.Add("@CUST_ADDRESS2", SqlDbType.VarChar,1000);
            cmd.Parameters["@CUST_ADDRESS2"].Direction = ParameterDirection.Output;
            cmd.Parameters.Add("@CUST_ADDRESS3", SqlDbType.VarChar,1000);
            cmd.Parameters["@CUST_ADDRESS3"].Direction = ParameterDirection.Output;
            cmd.Parameters.Add("@CUST_CITY", SqlDbType.VarChar,1000);
            cmd.Parameters["@CUST_CITY"].Direction = ParameterDirection.Output;
            cmd.Parameters.Add("@CUST_STATE", SqlDbType.VarChar,1000);
            cmd.Parameters["@CUST_STATE"].Direction = ParameterDirection.Output;
            cmd.Parameters.Add("@CUST_PINCODE", SqlDbType.VarChar,1000);
            cmd.Parameters["@CUST_PINCODE"].Direction = ParameterDirection.Output;
            cmd.Parameters.Add("@CUST_MOBILE", SqlDbType.VarChar,1000);
            cmd.Parameters["@CUST_MOBILE"].Direction = ParameterDirection.Output;
            cmd.Parameters.Add("@CUST_EMAIL", SqlDbType.VarChar,1000);
            cmd.Parameters["@CUST_EMAIL"].Direction = ParameterDirection.Output;
            cmd.Parameters.Add("@ERR_CD", SqlDbType.Int);
            cmd.Parameters["@ERR_CD"].Direction = ParameterDirection.Output;
            cmd.Parameters.Add("@ERR_MSG", SqlDbType.VarChar,1000);
            cmd.Parameters["@ERR_MSG"].Direction = ParameterDirection.Output;
            SqlDataReader dr= cmd.ExecuteReader();
            //SqlDataAdapter da = new SqlDataAdapter("SP_VALIDATE_VIN", conn);
            //DataSet ds = new DataSet();
            //da.Fill(ds);
            while (dr.Read())
            {
                Validate_vin Vin_validation = new Validate_vin();
                Vin_validation.VIN = Convert.ToString(dr["VIN"].ToString());
                Vin_validation.VEHICLE_MODEL= Convert.ToString(dr["VEHICLE_MODEL"].ToString());
                Vin_validation.MANUFACTURING_MONTH_YEAR= Convert.ToString(dr["MANUFACTURING_MONTH_YEAR"].ToString());
                Vin_validation.INVOICE_NUMBER= Convert.ToString(dr["INVOICE_NUMBER"].ToString());
                Vin_validation.INVOICE_DATE= Convert.ToString(dr["INVOICE_DATE"].ToString());
                Vin_validation.INVOICE_TYPE= Convert.ToString(dr["INVOICE_TYPE"].ToString());
                Vin_validation.INVOICE_DLR_FOR_CD= Convert.ToString(dr["INVOICE_DLR_FOR_CD"].ToString());
                Vin_validation.CUST_NAME= Convert.ToString(dr["CUST_NAME"].ToString());
                Vin_validation.CUST_ADDRESS1= Convert.ToString(dr["CUST_ADDRESS1"].ToString());
                Vin_validation.CUST_ADDRESS2= Convert.ToString(dr["CUST_ADDRESS2"].ToString());
                Vin_validation.CUST_ADDRESS3= Convert.ToString(dr["CUST_ADDRESS3"].ToString());
                Vin_validation.CUST_CITY= Convert.ToString(dr["CUST_CITY"].ToString());
                Vin_validation.CUST_STATE= Convert.ToString(dr["CUST_STATE"].ToString());
                Vin_validation.CUST_PINCODE= Convert.ToString(dr["CUST_PINCODE"].ToString());
                Vin_validation.CUST_MOBILE= Convert.ToString(dr["CUST_MOBILE"].ToString());
                Vin_validation.CUST_EMAIL= Convert.ToString(dr["CUST_EMAIL"].ToString());
                Vin_validation.ERR_CD= Convert.ToString(dr["ERR_CD"].ToString());
                Vin_validation.ERR_MSG= Convert.ToString(dr["ERR_MSG"].ToString());
                Vinvalidationlist.Add(Vin_validation);
            }
            con.Close();
        }
    }
    catch (Exception ex)
    {
        throw ex;
    }
    finally
    {

    }
    return JsonConvert.SerializeObject(Vinvalidationlist, Newtonsoft.Json.Formatting.Indented);
}

F-ES Sitecore

Что не так с кодом, который вы разместили? (Примечание - "это не работает" - это не тот ответ, который содержит достаточно информации, чтобы люди могли вам помочь)

Member 12962919

после выполнения его возврата 0 отсчитывается в dr.

F-ES Sitecore

Тогда SP_VALIDATE_VIN не возвращает данные, учитывая входные данные, которые вы предоставляете. Мы не можем получить доступ к вашим данным, и мы не знаем, каковы ваши входные данные, поэтому мы не можем сказать вам, почему это так, вам нужно будет посмотреть на базу данных и значения, которые вы даете для своих параметров, чтобы попытаться решить это. Возможно, используйте что-то вроде SQL Profiler, так как это покажет вам точно, что выполняется против базы данных.

Member 12962919

можете ли вы проверить, что процедура или код полностью верны или что-то в них неправильно

F-ES Sitecore

Глядя на это дальше, кажется, что вы выбираете все данные в свои выходные параметры, но ваш код обращается к данным так, как если бы это был результирующий набор. Ваш SP не генерирует никаких результатов, он просто устанавливает значение выходных параметров, поэтому без каких-либо результатов ExecuteReader ничего не возвращает. Возможно, вам придется использовать ExecuteNonQuery, а не ExecuteReader, а затем изучить выходные параметры (google "ado.net выходные параметры", чтобы увидеть, как правильно использовать выходные параметры).


В качестве альтернативы откажитесь от всех выходных параметров и просто выполните обычное "SELECT VIN, Vehicle_Model....", и это сгенерирует результирующий набор, который вы можете использовать для обработки существующего кода.

1 Ответов

Рейтинг:
2

sunithaNag

вы должны возвращать данные из SP вместо использования параметров out put.
как показано ниже

-- =============================================

ALTER PROCEDURE [dbo].[my_test]	
	(
	@template_id varchar(50)
	
	
	)
AS
BEGIN
	-- SET NOCOUNT ON added to prevent extra result sets from
	-- interfering with SELECT statements.
	SET NOCOUNT ON;

    -- Insert statements for procedure here
	SELECT 
      [app_id]
    , [business_domain_id]
     , [business_line]
    ,  [language_cd]
    , [email_type]
    , [email_from]
     , [email_subject]
     [email_body]
  FROM [dbo].[EmailTemplate]
  where @template_id=template_id
END


в сетях

public static string getData(string tempid)
        {
            List<MyTemplate> mylist = new List<MyTemplate>();
            SqlDataAdapter da = new SqlDataAdapter();
            System.Data.DataSet ds = new DataSet();
            using (SqlConnection con = new SqlConnection(ConfigurationManager.ConnectionStrings["DBConnectionStr"].ToString()))
            {
                SqlCommand cmd = new SqlCommand();
                cmd.Connection = con;
                con.Open();
                cmd.CommandType = CommandType.StoredProcedure;
                cmd.CommandText = "dbo.[my_test]";
                cmd.Parameters.AddWithValue("@template_id", tempid);
                da.SelectCommand = cmd;
                da.Fill(ds);

            }
            if (ds != null && ds.Tables.Count > 0 && ds.Tables[0] != null)
            {
                foreach (DataRow Dr in ds.Tables[0].Rows)
                {
                    MyTemplate mTemp = new MyTemplate();
                    mTemp.appId = Dr["app_id"].ToString();
                    mTemp.bDomainId = Dr["business_domain_id"].ToString();
                    mTemp.Bline = Dr["business_line"].ToString();
                    mTemp.emlBody = Dr["email_body"].ToString();
                    mTemp.emlFrom = Dr["email_from"].ToString();
                  //  mTemp.emlSubj = Dr["email_subject"].ToString();
                    mTemp.emlTyp = Dr["email_type"].ToString();
                    mylist.Add(mTemp);

                }

            }


            return JsonConvert.SerializeObject(mylist, Newtonsoft.Json.Formatting.Indented);
        }
}









Ответ в JSON:

<pre lang="objc">
[
{
"appId": "0ba9a0e7-25d4-4174-967a-956b47d04d4c",
"bDomainId": "9dd3f102-273c-40a2-a122-69628712680a",
"Bline": "EUR",
"СПГ": ноль,
"emlTyp": "имя пользователя",
"emlFrom": "support@xxx.com",
"emlSubj": null,
"emlBody": "[DEV] www.accessxxx.com"
}
]