DataAdapter Fill without command - c#

I'm trying to fill my dataadapter without using a command. I have a dataset which I manually populated but when I try to attach this dataset with my dataAdapter I'm gettin "The Select command property has not been initialized before calling 'Fill'". This is my code does anyone has an idea for this ?
Thanks
OleDbDataAdapter ad1=new OleDbDataAdapter(cmd);
OleDbDataAdapter ad2=new OleDbDataAdapter(cmd2);
OleDbDataAdapter ad3 = new OleDbDataAdapter();
DataSet ds = new DataSet();
DataTable db1=new DataTable();
DataTable db2=new DataTable();
DataTable db3 = new DataTable();
ds.Tables.Add();
ad1.Fill(db1);
ad2.Fill(db2);
int i;
foreach (DataRow r in db2.Rows)
{
i = 0;
foreach (DataRow rc in db1.Rows)
{
if (r[0].ToString() == rc[0].ToString())
{
i = 1;
}
}
if (i == 0) { ds.Tables[0].ImportRow(r); }
}
ad3.Fill(ds);

I'm not entirely sure what you are trying to accomplish here, it is unclear from your description. You already have placed data in the DataSet with:
ds.Tables[0].ImportRow(r);
Also, a Data Adapter of any type has to have at the very least a SELECT command associated in order for it to fill a Data Table or Data Set.
Could you describe your objective a bit more clearly? Are you trying to add a table to the dataset? Fill it from some external source? View the rows you imported?

Related

C# DataRow from DataTable not reading first value

I'm new to StackOverflow and I have a question here.
When I'm reading my Rows from a DataTable, the first time the result is empty (the app crash) and after if I'm in debug mode, I can see that the first row is read but its too late.
Here is the code.
MySqlDataAdapter da = new MySqlDataAdapter(query, conn);
DataSet ds = new DataSet();
da.Fill(ds);
foreach (DataTable table in ds.Tables)
{
foreach (DataRow myrow in table.Rows)
{
Number.Text = Convert.ToString(myrow[0]);
Text.Text = Convert.ToString(myrow[1]);
I changed the query, shoing the same thing but in a fifferent way and now its working.

can i change the column type of a DataTable after using data adapter to fill it

So, I am trying to change the column type of table to bool but I don't know if this is possible because I used data adapter to fill the table as in the following code
private void GetData(string selectCommand)
{
try
{
// Create a new data adapter based on the specified query.
dataAdapter = new OleDbDataAdapter(selectCommand, conn);
OleDbCommandBuilder commandBuilder = new OleDbCommandBuilder(dataAdapter);
// Populate a new data table and bind it to the BindingSource.
System.Data.DataTable table = new System.Data.DataTable();
table.Locale = System.Globalization.CultureInfo.InvariantCulture;
dataAdapter.Fill(table);
//table.Columns["Status"].DataType = typeof(bool);
if (table.Rows.Count > 0)
bindingSource1.DataSource = table;
else
{
MessageBox.Show("There is no such Data.", "No Result");
showAll();
}
}
as you can see the commented line was a wrong way. Can someone help?
Sharing MSDN Link for your reference. Try changing the data type of the DataColumn using the GetType() method.
DataColumn statusColumn = table.Columns["Status"];
statusColumn.DataType = System.Type.GetType("System.Boolean");

Do I need to perform a fill before an update in ADO.NET?

This may seem trivial but every example I've ever seen of ADO.net almost always has a 'fill' before an 'update'. We really don't want to fill a dataset that may have 1000's of blobs, we just want to add(insert) to the table. Is fill required for an update?As an example here's sample code from MSFT's web site (we're doing something similar):
SqlConnection con = new SqlConnection("Server=Darkover;uid=<username>;pwd=<strong password>;database=northwind");
SqlDataAdapter da = new SqlDataAdapter("Select * From MyImages", con);
SqlCommandBuilder MyCB = new SqlCommandBuilder(da); // What does this even do?
DataSet ds = new DataSet("MyImages");
da.MissingSchemaAction = MissingSchemaAction.AddWithKey;
FileStream fs = new FileStream(#"C:\winnt\Gone Fishing.BMP", FileMode.OpenOrCreate, FileAccess.Read);
byte[] MyData= new byte[fs.Length];
fs.Read(MyData, 0, System.Convert.ToInt32(fs.Length));
fs.Close();
da.Fill(ds,"MyImages"); // are they really filling a dataset with all those images???
DataRow myRow;
myRow=ds.Tables["MyImages"].NewRow();
myRow["Description"] = "This would be description text";
myRow["imgField"] = MyData;
ds.Tables["MyImages"].Rows.Add(myRow);
da.Update(ds, "MyImages");
con.Close();
You want the call to da.Fill() in order to get the schema for the MyImages table. That way you can use the DataRow returned by the call to NewRow() with the correct schema (columns, keys, etc) when assigning values to the columns.
You can tell the SqlDataAdapter to return only the schema with no data by setting the SqlDataAdapter.FillCommandBehavior:
da.FillCommandBehavior = CommandBehavior.SchemaOnly;
da.Fill(ds,"MyImages"); // Just get the schema for MyImages
DataRow myRow = ds.Tables["MyImages"].NewRow();
myRow["Description"] = "This would be description text";
myRow["imgField"] = MyData;
ds.Tables["MyImages"].Rows.Add(myRow);
da.Update(ds, "MyImages");
You can alternatively use da.FillSchema(), with either a single DataTable or a DataSet if your query returns multiple tables.
DataTable dt = new DataTable();
da.FillSchema(dt, SchemaType.Mapped);
DataRow myRow = dt.NewRow();
myRow["Description"] = "This would be description text";
myRow["imgField"] = MyData;
dt.Rows.Add(myRow);
da.Update(dt);

DataSet update in winform app

I have some difficulty with the following: I have a dataset that I want to use to update the database when a change of value is made in the gridView. The dataset comes from the following method:
public static DataSet Display_all_members()
{
ds = new DataSet();
try
{
string query = "SELECT date_to, last_name ,first_name , member_pay FROM Member ";
conS.Open();
adapter = new SqlDataAdapter(query, conS);
adapter.Fill(ds, "To_display");
}
catch (Exception r)
{}
finally
{
conS.Close();
}
return ds;
}
In the form I do
ds2 = DAL.Display_all_members ();
dataGridView1.DataSource = ds2;
dataGridView1.DataMember = "To_display";
now I get to update and I do the following in the form
if (ds2.HasChanges() == true)
{
DAL.update(ds2);
}
In the method
public static void update(DataSet ki)
{
SqlCommandBuilder n = new SqlCommandBuilder(da);
da.Update(ds);
}
And it doesn’t work. What’s the problem?
This is the error: Update unable to find TableMapping['Table'] or DataTable 'Table'.
It might be just a typo, but your update method is using two different variables - DataSet ki, and da in the DataAdapter.Update() call.
Try this:
protected void update(DataSet ds)
{
da.Update(ds, 'To_display")
}
From DataAdapter DataTable and DataColumn Mappings (ADO.NET):
"If you do not specify a TableName or a DataTableMapping name when calling the Fill or Update method of the DataAdapter, the DataAdapter looks for a DataTableMapping named "Table". If that DataTableMapping does not exist, the TableName of the DataTable is "Table"."
If you're using the same DataSet that you originally filled, you'll probably want to keep specifying the table name where required to avoid this error.

add data to DataGrid View through DataSet?

I have a datagridview that is bound to a dataset
I defined the table and the columns, how I can programmaticlly insert data to it?
I did this
http://msdn.microsoft.com/en-us/library/5ycd1034%28VS.71%29.aspx
but it did not show the data in my DataGridView !!!
now you need to assign the values to the datagridview
DataTable dt = new DataTable();
// Add rows to dt
datagridview.DataSource = dt;
Sample example
SqlDataAdapter da = new SqlDataAdapter(quryString, con);
DataSet ds = new DataSet();
da.Fill(ds, "Emp");
//dataGridView1.DataSource = ds.Tables["Emp"];
dataGridView1.Columns.Add("EmpID", "ID");
dataGridView1.Columns.Add("FirstName", "FirstName");
dataGridView1.Columns.Add("LastName", "LastName");
int row = ds.Tables["Emp"].Rows.Count - 1;
for (int r = 0; r<= row; r++)
{
dataGridView1.Rows.Add();
dataGridView1.Rows[r].Cells[0].Value = ds.Tables["Emp"].Rows[r].ItemArray[0];
dataGridView1.Rows[r].Cells[1].Value = ds.Tables["Emp"].Rows[r].ItemArray[1];
dataGridView1.Rows[r].Cells[2].Value = ds.Tables["Emp"].Rows[r].ItemArray[2];
}
it can be bounded directly by .
DataSet ds = new DataSet();
in C#
DataGridView.DataSource = ds.Tables["your Table index which you want to bind with datagridview"];
Like
DataGridView.DataSource = ds.Tables[0];
In VB
DataGridView.DataSource = ds.Tables("your Table index which you want to bind with datagridview")
like
DataGridView.DataSource = ds.Tables(0)

Categories

Resources