Convert DataTable to json Dictionary with TableName as key - c#

Want to convert a datatable to the Dictionary object with key as table name and value as the rows in the datatable.
DataTable dt = new DataTable();
dt.TableName = "TableName";
dt.Columns.Add(new DataColumn("ClientId"));
dt.Columns.Add(new DataColumn("ClientName"));
DataRow dr = dt.NewRow();
dr["ClientId"] = 1;
dr["ClientName"] = "Pradeep";
dt.Rows.Add(dr);
dr = dt.NewRow();
dr["ClientId"] = 2;
dr["ClientName"] = "Test";
dt.Rows.Add(dr);
Now convert this dt object to Dictionary<string, object>, which key is the table name and object name is the json string.

This is your solution
String ClientJson = Newtonsoft.Json.JsonConvert.SerializeObject(dt);
Dictionary<string,string> _clientDictionary= new Dictionary<string,string>();
_clientDictionary.Add(dt.TableName,ClientJson);

Related

adding new row to existing dataset which already has values

I have a dataset where I am pulling value from the database, now after that, I want to add some more rows to it. I get four columns from the database: approverName, approverEmail, approverRole, approvalStatus
DataSet dsResult = new DataSet();
dsResult = getDataFromDatabase();
DataTable dt = new DataTable("MyTable");
dt.Columns.Add(new DataColumn("approverName", typeof(string)));
dt.Columns.Add(new DataColumn("approverEmail", typeof(string)));
dt.Columns.Add(new DataColumn("approverRole", typeof(string)));
dt.Columns.Add(new DataColumn("approvalStatus", typeof(string)));
DataRow dr = dt.NewRow();
dr["approverName"] = "John";
dr["approverEmail"] = "John#gc.com";
dr["approverRole"] = "Manager";
dr["approvalStatus"] = "Pending";
dt.Rows.Add(dr);
dsResult.Tables.Add(dt);
But after executing code I don't see this manually added value in the dataset. It only shows the value which I had after executing line 2 of code
You don't need to create another DataTable.
Append new row to existing DataTable
DataSet dsResult = new DataSet();
dsResult = getDataFromDatabase();
DataTable dt = dsResult.Tables[0]; //Get Reference to existing table
DataRow dr = dt.NewRow();
dr["approverName"] = "John";
dr["approverEmail"] = "John#gc.com";
dr["approverRole"] = "Manager";
dr["approvalStatus"] = "Pending";
dt.Rows.Add(dr);

Data Table Getting error when i add data rows[]

DataTable dt = new DataTable();
dt.Columns.Add(new DataColumn("Date", typeof(String)));
dt.Columns.Add(new DataColumn("Time", typeof(String)));
dt.Columns.Add(new DataColumn("Function", typeof(String)));
dt.Columns.Add(new DataColumn("Log Level", typeof(String)));
dt.Columns.Add(new DataColumn("Message", typeof(String)));
When i query DataTable then get DataRows[]
DataRow[] result = dt.Select("Function ='" + strfunction + "'");
Now i want to add that result in DataTable
dt.Rows.Add(result);
But i am getting error
Input array is longer than the number of columns in this table.
try this
foreach (DataRow row in result)
dt.Rows.Add(row);
DataRowCollection.Add() has two overloads:
Add(DatarRow row);
Add(params object[] values);
The one you are currently using is Add(params object[] values); since you are passing an array of a class with base class of object. So you are searching in the same table, getting the same number of columns indeed, but the problem is that; you expect each element of the array to be inserted as a DataRow, but there is only one row inserted and each element of the array DataRow[] result is assigned for columns
With:
dt.Rows.Add(new object[] { "Date", "Time", "a", "Log Level", "Message" });
DataRow[] result = dt.Select("Function ='a'");
foreach (DataRow r in dt.Rows)
{
/* Log r or inpect */
}
No exception was thrown in my test because the result array had only 1 element (as search result).
If i have more then 5 elements in result; since i can't insert 6 column values in a 5 column table it will throw exception.
And the correct way to do it is interating search results array and adding a new row for each array element; using DataRow.ItemArray property
You can try the following which worked for me:
DataRow[] result = dt.Select("Function ='" + strfunction + "'");
foreach (DataRow r in result)
{
dt.Rows.Add(r.ItemArray);
}
Instead of directly adding the DataRow to the DataTable, how about creating a foreach loop and creating a separate DataRow from the DataTable, filling the data and adding it into the DataTable. For example:
DataTable dt = new DataTable();
dt.Columns.Add(new DataColumn("Date", typeof(String)));
dt.Columns.Add(new DataColumn("Time", typeof(String)));
dt.Columns.Add(new DataColumn("Function", typeof(String)));
dt.Columns.Add(new DataColumn("Log Level", typeof(String)));
dt.Columns.Add(new DataColumn("Message", typeof(String)));
//Dummy data added
DataRow dr = dt.NewRow();
dr[0] = "aa";
dr[1] = "bb";
dr[2] = "cc";
dr[3] = "dd";
dr[4] = "ee";
dt.Rows.Add(dr);
string strfunction = "cc";
DataRow[] result = dt.Select("Function ='" + strfunction + "'");
//Initialize Datarow here. I am using the one which is defined above
dr = null;
foreach (var item in result)
{
dr = dt.NewRow();
dr[0] = item[0];
dr[1] = item[1];
dr[2] = item[2];
dr[3] = item[3];
dr[4] = item[4];
dt.Rows.Add(dr);
}
Hope this helps.

copying values of a dataTable to another DataTable with different clumns

I have a DataTable dt1 that contains this columns : PRODUCT_ID,MIN_VALUE,MAX_VALUE,AMOUNT
and another DataTable dt2 that contains this columns : ID,MIN,MAX,POINT_TO_ADD
dt1 contains multiple rows that I want to copy them to dt2 how can I do that ?
try this
foreach (DataRow sourcerow in dt1.Rows)
{
DataRow destRow = dt2.NewRow();
destRow["ID"] = sourcerow["PRODUCT_ID"];
destRow["MIN"] = sourcerow["MIN_VALUE"];
destRow["MAX"] = sourcerow["MAX_VALUE"];
destRow["POINT_TO_ADD"] = sourcerow["AMOUNT"];
dt2.Rows.Add(destRow);
}
Try this:
for(int i=0;i<dt1.Rows.Count;i++){
DataRow dr = dt2.NewRow();
dr["ID"] = dt1.Rows[i]["PRODUCT_ID"];
dr["MIN"] = dt1.Rows[i]["MIN_VALUE"];
dr["MAX"] = dt1.Rows[i]["MAX_VALUE"];
dr["POINT_TO_ADD"] = dt1.Rows[i]["AMOUNT"];
dt2.Rows.Add(dr);
}

Add rows in a gridview c#

Im new in asp.net. I want to know how to add a row in a gridview programatically. I was able to do it but it just displays the latest addition.
Here is my code:
DataTable dt = new DataTable();
dt.Columns.Add("Question");
dt.Columns.Add("Answer");
DataRow dr = dt.NewRow();
dr["Question"] = txtQuestion.Text;
dr["Answer"] = txtAnswer.Text;
dt.Rows.Add(dr);
dt.AcceptChanges();
gvQnA.DataSource = dt;
gvQnA.DataBind();
Its because you are creating new table each time and binding it with the grid
Do code as below may resolve your issue ...
here i am taking existing datasource and binding it again by adding two more row...
DataTable dt = gridView.DataSource as DataTable;
if (dt != null)
{
DataRow dr = dt.NewRow();
dr["Question"] = txtQuestion.Text;
dr["Answer"] = txtAnswer.Text;
dt.Rows.Add(dr);
dt.AcceptChanges();
gvQnA.DataSource = dt;
gvQnA.DataBind();
}
#Pranay is correct.In addition You can also achive that by using DataTable as property.
private DataTable Dt
{
set { ViewState.Add("Dt", value); }
get { return (DataTable)ViewState["Dt"]; }
}
...
DataRow dr = Dt.NewRow();
dr["Question"] = txtQuestion.Text;
dr["Answer"] = txtAnswer.Text;
Dt.Rows.Add(dr);
Dt.AcceptChanges();
gvQnA.DataSource = Dt;
gvQnA.DataBind();
You have added one row in your code thats why it is showing one row.
If you have added multiple rows it would have shown proper result
DataTable dt = new DataTable();
dt.Columns.Add("Question");
dt.Columns.Add("Answer");
DataRow dr = dt.NewRow();
dr["Question"] = txtQuestion.Text;
dr["Answer"] = txtAnswer.Text;
dt.Rows.Add(dr);
**DataRow dr = dt.NewRow();
dr["Question"] = "2nd row";
dr["Answer"] = "2nd row";
dt.Rows.Add(dr);**
dt.AcceptChanges();
gvQnA.DataSource = dt;
gvQnA.DataBind();
May be #Pranay is also right
Hey Just check this. This might help u
DataTable dataTable = new DataTable();
int columnsCount = // Set the number of the table's columns here.
for (int columnIndex = 0; columnIndex < columnsCount; columnIndex++)
{
DataColumn dataColumn = new DataColumn();
// Assign dataColumn properties' values here ..
dataTable.Columns.Add(dataColumn);
}
int rowsCount = // Set the number of the table's rows here.
for (int columnIndex = 0; columnIndex < columnsCount; columnIndex++)
{
DataRow dataRow = new DataRow();
dataRow["ColumnName"] = // Set the value here ..
dataTable.Rows.Add(dataRow);
}

How to calculate the expression of a datatable

Current Code:
foreach (Expressions e in expressionObj)
{
if ((e.Expression != null) && (e.ColumnName != null))
{
newtable1.Columns.Add(new DataColumn(e.ColumnName, typeof(decimal), e.Expression));
}
}
I have an expression as ID+ID which is to be added as new column in the datatable as SUM-ID where ID=2, but the result got is 22 instead of 4.
Let's see:
DataTable dt = new DataTable();
dt.Columns.Add(new DataColumn("ID", typeof(decimal)));
dt.Columns.Add(new DataColumn("SUM-ID", typeof(decimal), "ID + ID"));
var row = dt.NewRow();
row["ID"] = 2;
dt.Rows.Add(row);
var val = dt.Rows[0]["SUM-ID"];
Result: val is 4 as expected.
Let's try something else:
DataTable dt = new DataTable();
dt.Columns.Add(new DataColumn("ID", typeof(string)));
dt.Columns.Add(new DataColumn("SUM-ID", typeof(decimal), "ID + ID"));
var row = dt.NewRow();
row["ID"] = "2";
dt.Rows.Add(row);
var val = dt.Rows[0]["SUM-ID"];
Result: val is 22
Conclusion: Your ID column is of type string but it needs to be a numeric type instead otherwise string concatenation is used.
Update: If you cannot (or don't want to) set the datatype of the column then you can use Convert inside the expression: 2 * Convert(ID, 'System.Int32')

Categories

Resources