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?