Gitz
Gitz

Reputation: 820

how to return datatable and integer in c#

I am creating a method which returns datatable and an int value.I have create a method which returns only datatable.Please take a look on the code

    public static  DataTable ShutterstockSearchResults(string url)
    { 

       int TotalCont=0;

        DataTable dt = new DataTable();
        try
        {
            //intigration using Basic Aouth with authrization headers

            var request = (HttpWebRequest)WebRequest.Create(url);
            var username = "SC";
            var password = "SK";
            string credentials = Convert.ToBase64String(Encoding.ASCII.GetBytes(username + ":" + password));
            request.Headers[HttpRequestHeader.Authorization] = string.Format("Basic {0}", credentials);
            request.UserAgent = "MyApp 1.0";
            var response = (HttpWebResponse)request.GetResponse();
            using (var stream = response.GetResponseStream())
            using (var reader = new StreamReader(stream))
            {
                JavaScriptSerializer js = new JavaScriptSerializer();
                var objText = reader.ReadToEnd();
                SearchResult myojb = (SearchResult)js.Deserialize(objText, typeof(SearchResult));
               TotalCount = myojb.total_count;          

                dt.Columns.Add("Id");
                dt.Columns.Add("Discription");
                dt.Columns.Add("Small_Thumb_URl");
                dt.Columns.Add("Large_Thumb_URL");
                dt.Columns.Add("Prieview_URL");
                dt.Columns.Add("ContributorID");
                dt.Columns.Add("aspect");
                dt.Columns.Add("image_type");
                dt.Columns.Add("is_illustration");
                dt.Columns.Add("media_type");
                foreach (var item in myojb.data)
                {
                    var row = dt.NewRow();
                    row["ID"] = item.id;
                    row["Discription"] = item.description;
                    row["Small_Thumb_URl"] = item.assets.small_thumb.url;
                    row["Large_Thumb_URL"] = item.assets.large_thumb.url;
                    row["Prieview_URL"] = item.assets.preview.url;
                    row["ContributorID"] = item.contributor.id;
                    row["aspect"] = item.aspect;
                    row["image_type"] = item.image_type;
                    row["is_illustration"] = item.is_illustration;
                    row["media_type"] = item.media_type;
                    dt.Rows.Add(row);
                }
                // List<SearchResult> UserList = JsonConvert.DeserializeObject<List<SearchResult>>(objText);
                // Response.Write(reader.ReadToEnd());
            }          

        }

        catch (WebException ea)
        {

            Console.WriteLine(ea.Message);
            using (var stream = ea.Response.GetResponseStream())
            using (var reader = new StreamReader(stream))
            {
                Console.WriteLine(reader.ReadToEnd());
            }
        }

        return dt;

    }

I want to return datatable and TotalCont.please help

Upvotes: 0

Views: 3454

Answers (5)

Gy&#246;rgy Kőszeg
Gy&#246;rgy Kőszeg

Reputation: 18023

    public static Tuple<DataTable, int> ShutterstockSearchResults(string url)
    {
        [...]
        return new Tuple<DataTable, int>(dt, totalCount);
    }

    public static void SomeConsumerMethod()
    {
        var result = ShutterstockSearchResults(myPath);
        DataTable dt = result.Item1;
        int totalCount = result.Item2;
    }

Upvotes: 2

Vadian
Vadian

Reputation: 26

You can accomplish this with a Tuple. Consider the following simple example:

public class EmptyClass
{
    public static void Main(){
        EmptyClass something = new EmptyClass ();

        Tuple<String, int> tuple = something.returnMe ();

        Console.WriteLine ("Item 1: " + tuple.Item1);
        Console.WriteLine ("Item 2: " + tuple.Item2);
    }

    public EmptyClass ()
    {
    }

    public Tuple<String, int> returnMe() {
        return Tuple.Create ("Hello", 2);
    }
}

Upvotes: 0

Kapol
Kapol

Reputation: 6463

Your method needs an additional out parameter if you want to "return" more than one value. Just pass an uninitialized variable of the desired type into your method and assign that variable inside.

public void Test()
{
    int i;
    DataTable ShutterstockSearchResults("Some string", out i);
}

your ShutterstockSearchResults method needs to be modified accordingly:

public static DataTable ShutterstockSearchResults(string url, out int outParam)
{
    outParam = 10;

    // do other stuff
}

If you do not change outParam any further inside ShutterstockSearchResults, it will have the value 10 after returning to Test.

Upvotes: 0

apomene
apomene

Reputation: 14389

To answer the comments in Klaus answer:

    public class MyReturnType
    {
         public DataTable TheDataTable {get; set;}
         public int TotalCount {get; set;}
    }

and in your method:

public static  MyReturnType ShutterstockSearchResults(string url)
    { 
       MyReturnType result=new MyReturnType();
       int TotalCont=0;

        DataTable dt = new DataTable();
        try
        {
            //intigration using Basic Aouth with authrization headers

            var request = (HttpWebRequest)WebRequest.Create(url);
            var username = "SC";
            var password = "SK";
            string credentials = Convert.ToBase64String(Encoding.ASCII.GetBytes(username + ":" + password));
            request.Headers[HttpRequestHeader.Authorization] = string.Format("Basic {0}", credentials);
            request.UserAgent = "MyApp 1.0";
            var response = (HttpWebResponse)request.GetResponse();
            using (var stream = response.GetResponseStream())
            using (var reader = new StreamReader(stream))
            {
                JavaScriptSerializer js = new JavaScriptSerializer();
                var objText = reader.ReadToEnd();
                SearchResult myojb = (SearchResult)js.Deserialize(objText, typeof(SearchResult));
               TotalCount = myojb.total_count;          

                dt.Columns.Add("Id");
                dt.Columns.Add("Discription");
                dt.Columns.Add("Small_Thumb_URl");
                dt.Columns.Add("Large_Thumb_URL");
                dt.Columns.Add("Prieview_URL");
                dt.Columns.Add("ContributorID");
                dt.Columns.Add("aspect");
                dt.Columns.Add("image_type");
                dt.Columns.Add("is_illustration");
                dt.Columns.Add("media_type");
                foreach (var item in myojb.data)
                {
                    var row = dt.NewRow();
                    row["ID"] = item.id;
                    row["Discription"] = item.description;
                    row["Small_Thumb_URl"] = item.assets.small_thumb.url;
                    row["Large_Thumb_URL"] = item.assets.large_thumb.url;
                    row["Prieview_URL"] = item.assets.preview.url;
                    row["ContributorID"] = item.contributor.id;
                    row["aspect"] = item.aspect;
                    row["image_type"] = item.image_type;
                    row["is_illustration"] = item.is_illustration;
                    row["media_type"] = item.media_type;
                    dt.Rows.Add(row);
                }
                // List<SearchResult> UserList = JsonConvert.DeserializeObject<List<SearchResult>>(objText);
                // Response.Write(reader.ReadToEnd());
            }          

        }

        catch (WebException ea)
        {

            Console.WriteLine(ea.Message);
            using (var stream = ea.Response.GetResponseStream())
            using (var reader = new StreamReader(stream))
            {
                Console.WriteLine(reader.ReadToEnd());
            }
        }

        result.TheDataTable=dt;
        result.TotalCount=TotalCount;
        return result:

    }

Upvotes: 1

Klaus Byskov Pedersen
Klaus Byskov Pedersen

Reputation: 121037

Generally speaking, a method can only return one type.

You have two options:

1) Create a class that has a DataTable and an int field, such as:

public class MyReturnType
{
     public DataTable TheDataTable {get; set;}
     public int TotalCount {get; set;}
}

And return this type from your method.

2) You can add an out parameter to your method:

public static  DataTable ShutterstockSearchResults(string url, out totalCount)

And assign to totalCount within your method.

Upvotes: 5

Related Questions