Как сделать веб-сервис с несколькими выходными параметрами?
Я пробовал, но он возвращает 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....", и это сгенерирует результирующий набор, который вы можете использовать для обработки существующего кода.