0

I am trying to return datatable from wcf service. I have written service. The code for it is as below

 [WebInvoke(Method = "PUT", RequestFormat = WebMessageFormat.Json, ResponseFormat = WebMessageFormat.Json, UriTemplate = "TableData")]
    public DataTable GetData(Parameters param)
    {
        try
        {


            var Id = int.Parse(param.Id);
            var tableName = param.TableName;
            var listSelectCol = new ArrayList();
            bool bFirst = true;
            var sSelectColList = new StringBuilder();
            var Query ="";
            var List = from TableEntity in _TableEntityRepository.AsQueryable()
                                  join ColumnEntity in _ColumnEntityRepository.AsQueryable() on TableEntity.Id equals ColumnEntity.Id
                                  where sysTableEntity.TableName.Equals(tableName)
                                  select ColumnEntity.Name;



            foreach (var x in List 
            {
                if (bFirst)
                    bFirst = false;
                else
                    sSelectColList.Append(", ");

                sSelectColList.Append("t." + x.ToString(CultureInfo.InvariantCulture));
                listSelectCol.Add(x.ToString(CultureInfo.InvariantCulture));


            }

                 Query =
                    "select " + sSelectColList + " ,  t.Name as MyName  from  " + tableName +
                    " t   Where t.Id = " + Id;





            var cmdQuery = new SqlCommand(Query, new SqlConnection(ConfigurationManager.AppSettings.Get("connectionString")));
            var sdaQuery = new SqlDataAdapter(cmdQuery);
            var diffTableFrom = new DiffTable();
            var colValues = new DataColumn("ColValues", typeof(System.String));

            var dt = new DataTable();
            dt.Columns.Add(colValues);

            sdaQuery.Fill(dt);

            diffTableFrom.ReturnDiffTable = dt;

            foreach (DataRow row1 in dt.Rows) 
            {
                foreach (string i in listSelectCol)
                {
                    row1["ColValues"] = row1["ColValues"] + row1[i].ToString() + ",";

                }
                row1["ColValues"] = row1["ColValues"].ToString().Remove(row1["ColValues"].ToString().Length - 1);


            }


            return dt;

        }

        catch (Exception e)
        {



            throw new WebFaultException<string>(
        string.Format(
            "{0}{1}",
            e.Message, (e.InnerException != null ? e.InnerException.Message : string.Empty)), HttpStatusCode.BadRequest);
        }


    }

The class for DiffTable is

  public class DiffTable
    {
        public DataTable ReturnDiffTable {get;set;}
    }

The code for call from my viewmodel is

function loadData(id, tablename) {
        debugger;

        var input =
       {

           TableName: tableName,
           Id: id

       };


        return $.ajax({
            url: "../Service/TableData",
            type: "PUT",
            contentType: 'application/json',
            processData: false,
            data: JSON.stringify(input),
            error: function (XMLHttpRequest, textStatus, errorThrown) {

                alert(errorThrown);
            },
           success: function (allData) {
                var mappedData = $.map(allData, function (item) {
                    return new TableChangesDetail(item);

                });

                self.TableChangesDetailList(mappedData);


            }

        });

    }

When i try to call this service from my viewmodel using ajax, i get error in fiddler as [Fiddler] ReadResponse() failed: The server did not return a response for this request.

How do i return datatable from wcf service? When i debug the service and put breakpoint on return dt; then i get 1 row. So data is returned from database but not back to viewmodel.

What am i doing wrong here?

UPDATE1

After i changed this line written in my service

var dt = new DataTable(); 

to

var dt = new DataTable("Test");

I am now not getting any errors. But fiddler is not recieving data in json format. When i open up fiddler and can see data under TextView tab in some wiered format. That is the reason i am not getting in my knockout model. How do i fix this now?

DevelopmentIsMyPassion
  • 3,541
  • 4
  • 34
  • 60

1 Answers1

0

I managed to find another way. I am not sure if thats clever. What i did is to convert that datatable to list and return list. So i added below code in my service

foreach (DataRow row1 in dt.Rows) 
            {
                var list = new LookUpTable();
                list.Name = (string) row1["Name"];
                list.Id = row1["Id"];
                myReturnList.Add(list);


            }


return myReturnList.ToList();
DevelopmentIsMyPassion
  • 3,541
  • 4
  • 34
  • 60