adding new row to existing dataset which already has values - c#

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);

Related

Convert DataTable to json Dictionary with TableName as key

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);

Bind Data in Gridview Without entering in database

I am trying to Bind Data Inserted through any Registration Form in Grid-view.
BUT, their is No DATABASE. We Don't have any Database, So No data is Stored to retrieve. How can i Do this..???
//declare a datatable
DataTable dt = new DataTable();
dt.Columns.Add(new DataColumn("id", typeof(int)));
dt.Columns.Add(new DataColumn("Name", typeof(string)));
//fill it with data
DataRow dr = dt.NewRow();
dr["id"] = 1;
dr["Name"] = "Name"
dt.Rows.Add(dr);
//set the datasource and bind the grid view
GridView1.DataSource = dt;
GridView1.DataBind();

value getting changed during SqlBulkCopy

I am trying to upload some data from csv file to sql server using SqlBulkCopy
The problem here is that the values get changed automatically
eg 0.9824 becomes 0.982400000095367
Here is the code that I am using
using (SqlBulkCopy bulkCopy = new SqlBulkCopy(strConnectionString, SqlBulkCopyOptions.FireTriggers))
{
DataTable dt = new DataTable();
dt.Columns.Add(new DataColumn("dt", typeof(DateTime)));
dt.Columns.Add(new DataColumn("wreb", typeof(string)));
dt.Columns.Add(new DataColumn("zid", typeof(int)));
dt.Columns.Add(new DataColumn("zone_name", typeof(string)));
dt.Columns.Add(new DataColumn("region", typeof(string)));
dt.Columns.Add(new DataColumn("iloss", typeof(float)));
dt.Columns.Add(new DataColumn("dloss", typeof(float)));
for (int i = 0; i < DataDS.Tables[0].Rows.Count; i++)
{
DataRow myDr = dt.NewRow();
myDr["dt"] = DateTime.ParseExact(DataDS.Tables[0].Rows[i]["dt"].ToString(), "d/M/yyyy", null);
myDr["wreb"] = DataDS.Tables[0].Rows[i]["wreb"].ToString();
myDr["zid"] = DataDS.Tables[0].Rows[i]["zid"].ToString();
myDr["zone_name"] = DataDS.Tables[0].Rows[i]["zone_name"].ToString();
myDr["region"] = DataDS.Tables[0].Rows[i]["region"].ToString();
myDr["iloss"] = DataDS.Tables[0].Rows[i]["iloss"].ToString();
myDr["dloss"] = DataDS.Tables[0].Rows[i]["dloss"].ToString();
dt.Rows.Add(myDr);
myDr = null;
}
bulkCopy.BulkCopyTimeout = 0;
bulkCopy.ColumnMappings.Add("dt", "Zdate");
bulkCopy.ColumnMappings.Add("wreb", "Entity");
bulkCopy.ColumnMappings.Add("zid", "ZoneID");
bulkCopy.ColumnMappings.Add("zone_name", "Zone_Name");
bulkCopy.ColumnMappings.Add("region", "region");
bulkCopy.ColumnMappings.Add("iloss", "iloss");
bulkCopy.ColumnMappings.Add("dloss", "dloss");
bulkCopy.DestinationTableName = "tbl_zloss";
bulkCopy.WriteToServer(dt);
}
Looks like you're using float which is an imprecise datatype.
Use decimal to get exact values. Precision and scale depend on your data

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.

Sqlbulkcopy doesn't seem to work for me

I have created a datatable and trying to insert that datatable through SqlBulkCopy but somehow it doesn't seem to work for me....
I got the error,
The given value of type DateTime from the data source cannot be converted
to type decimal of the specified target column.
My Datasource is,
DataTable dt = new DataTable();
dt.Columns.Add(new DataColumn("EmpId", typeof(Int64)));
dt.Columns.Add(new DataColumn("FromDate", typeof(DateTime)));
dt.Columns.Add(new DataColumn("ToDate", typeof(DateTime)));
dt.Columns.Add(new DataColumn("DaysPresent", typeof(decimal)));
dt.Columns.Add(new DataColumn("OpeningAdvance", typeof(double)));
dt.Columns.Add(new DataColumn("AdvanceDeducted", typeof(double)));
dt.Columns.Add(new DataColumn("RemainingAdvance", typeof(double)));
dt.Columns.Add(new DataColumn("SalaryGiven", typeof(double)));
dt.Columns.Add(new DataColumn("CreatedDate", typeof(DateTime)));
foreach (GridViewRow row in gridEmployee.Rows)
{
if (row.RowType == DataControlRowType.DataRow)
{
DataRow dr = dt.NewRow();
dr["EmpId"] = Convert.ToInt64(((HiddenField)row.Cells[0].FindControl("HiddenId")).Value);
dr["FromDate"] = Convert.ToDateTime(GetMonthNumberFromAbbreviation(fromdate[1].ToString()) + '/' + fromdate[0].ToString() + '/' + fromdate[2].ToString());
dr["ToDate"] = Convert.ToDateTime(GetMonthNumberFromAbbreviation(todate[1].ToString()) + '/' + todate[0].ToString() + '/' + todate[2].ToString());
dr["DaysPresent"] = Convert.ToDecimal(((TextBox)row.Cells[3].FindControl("TxtDaysPresent")).Text);
dr["OpeningAdvance"] = Convert.ToDouble(((TextBox)row.Cells[4].FindControl("txtOpeningAdv")).Text);
dr["AdvanceDeducted"] = Convert.ToDouble(((TextBox)row.Cells[5].FindControl("TxtAdvanceDeducted")).Text);
dr["RemainingAdvance"] = Convert.ToDouble(((TextBox)row.Cells[6].FindControl("TxtClosingAdvance")).Text);
dr["SalaryGiven"] = Convert.ToDouble(((TextBox)row.Cells[7].FindControl("TxtSalary")).Text);
dr["CreatedDate"] = Convert.ToDateTime(System.DateTime.Now.ToString());
dt.Rows.Add(dr);
}
}
SqlBulkCopy sbc = new SqlBulkCopy(connectionString);
sbc.DestinationTableName = "SalaryDetails";
sbc.WriteToServer(dt);
sbc.Close();
And my destination Table looks like this,
alt text http://img231.imageshack.us/img231/5448/mytable.jpg
You need to specify a column mapping, as you don't have the same number of columns in the DataTable and the destination table.
You can do it like this:
sbc.ColumnMappings.Add("EmpId", "EmpId");
sbc.ColumnMappings.Add("FromDate", "FromDate");
// and so on, with the rest of the columns; and after that comes
sbc.WriteToServer(dt);
sbc.Close();

Categories

Resources