Link to home
Create AccountLog in
Avatar of mathieu_cupryk
mathieu_cuprykFlag for Canada

asked on

ref out parameters.

I have the following:


            InitialPrices.localhost.InitialPriceReportingService WS
               = new InitialPrices.localhost.InitialPriceReportingService();
            int Id = 0;
            string Status = null;
            WS.GetGradeCodeDetailID("WHT", ref Id, ref Status); // These values need to comback from the webservice the id and status.
I am not sure how to work with ref and out.

The method is as following:
[WebMethod(Description = "Get Grade Code Detail based on the grade name")]
        public void GetGradeCodeDetailID(string GradeName, out int GradeCodeDetailID, out string Status)
        {
            string procedureName = "init_price.PRICE_LIST_REPORTING.get_grade_code_dtl_id";
            try
            {
                Database db = DatabaseFactory.CreateDatabase("InitialPrices.Properties.Settings.ConnectionString");
                DbCommand dbCommand = db.GetStoredProcCommand(procedureName);

                db.AddInParameter(dbCommand, "p_grade_name", DbType.String, GradeName);
                db.AddOutParameter(dbCommand, "p_grade_code_dtl_id", DbType.Int32, 4);
                db.AddOutParameter(dbCommand, "p_status", DbType.String, 7);
                db.ExecuteNonQuery(dbCommand);
               

                GradeCodeDetailID = Convert.ToInt32( dbCommand.Parameters[1].Value, CultureInfo.InvariantCulture);
                Status = dbCommand.Parameters[2].Value.ToString();
            }
            catch (Exception ex)
            {
                throw (ex);
            }

            return;
        }


ASKER CERTIFIED SOLUTION
Avatar of Zippit
Zippit

Link to home
membership
Create a free account to see this answer
Signing up is free and takes 30 seconds. No credit card required.
See answer
Avatar of Zippit
Zippit

ref and out are used mainly the same way.  They allow the called function to change the values of the parameters and have the updated values returned to the caller.  The difference between the two is that a ref parameter must be initialized before the call to the function is made.  An out parameter does not need to have it's value initialized before the function call is made as the function will initialize the value.

If the parameter is declared as an out parameter, like the following:

public function muFunction(ref int param1)

then it needs to be called as follows:

int myParam1 = 1234;
myFunction(ref myParam1);
// now do something with myParam1 and its new value

if the function uses an out parameter like the following:

public function muFunction(ref int param1)

then it is used and called as follows:

int myParam1;
myFunction(out myParam1);
// now do something with myParam1 and its new value
Avatar of Dmitry G
No much difference between 'ref' and 'out'. But you need to know it.

An argument passed to a ref parameter must first be initialized. 'out' parameter does not have to be explicitly initialized before being passed to an out parameter. This is major difference. So you may use either of two.

See msdn for more information. They have good example and good explanations:

'ref':
http://msdn.microsoft.com/en-us/library/14akc2c7(VS.71).aspx

'out':
http://msdn.microsoft.com/en-us/library/t3c3bfhx(VS.71).aspx
if you can, it is a good idea not to use out and ref parameters for web services as they are stateless.

if you must then make sure you read http://kbalertz.com/322624/Proxy-Class-First-Parameter-Service-Method-Returns-Return-Value-Reference.aspx
Avatar of mathieu_cupryk

ASKER

I get a no overload for:

 InitialPrices.InitialPriceReportingServiceWS.InitialPriceReportingService WS = new InitialPrices.InitialPriceReportingServiceWS.InitialPriceReportingService();
                            int GradeCodeDetailID;
                            string Status;
                           
                            WS.GetGradeCodeDetailID(gradeName, out GradeCodeDetailID, out Status);
                         


in the web service:

[WebMethod]
        public void GetGradeCodeDetailID(string gradeName, out int GradeCodeDetailID, out string Status)
        {

            string procedureName = "init_price.PRICE_LIST_REPORTING.get_grade_code_dtl_id";
            try
            {
                Database db = DatabaseFactory.CreateDatabase("InitialPrices.Properties.Settings.ConnectionString");
                DbCommand dbCommand = db.GetStoredProcCommand(procedureName);

                db.AddInParameter(dbCommand, "p_grade_name", DbType.String, gradeName);
                db.AddOutParameter(dbCommand, "p_grade_code_dtl_id", DbType.Int32, 4);
                db.AddOutParameter(dbCommand, "p_status", DbType.String, 7);
                db.ExecuteNonQuery(dbCommand);


                GradeCodeDetailID = Convert.ToInt32(dbCommand.Parameters[1].Value, CultureInfo.InvariantCulture);
                Status = dbCommand.Parameters[2].Value.ToString();
            }
            catch (Exception ex)
            {
                throw (ex);
            }
       }
Yeah, well. I'd agree with Solar_Flare. But I can't really see any problems for this specific case. And I'd use 'out' parameters too, not 'ref'.
Great job!