Cannot change date value of MySQL bound text box - c#

Not sure if anyone has experience this issue. I have a TextBox that I have bound to a DataSet that I'm getting from a MySql database and it is populating the value but if I try changing the value it just reverts to the original value when I leave the textBox. Here is an example of my code:
string connectString = "Database=customerDatabase;Data Source=localhost"+
";port=3306;User Id=root;Password=datascan;Allow Zero DateTime=true";
MySqlConnection dataConnection = new MySqlConnection(connectString);
dataConnection.Open();
DataSet dataSet = new DataSet();
string query = "select programsUpdated from customers";
MySqlDataAdapter dataAdapter = new MySqlDataAdapter(query, dataConnection);
dataAdapter.Fill(dataSet);
dataConnection.Close();
BindingSource source = new BindingSource(dataSet, "Table");
textBox.DataBindings.Add("Text", source, "programsUpdated");
I tried putting textBox.DataBindings[0].WriteValue(); in the textBox.Leave event but that did nothing. And Ive researched it but haven't been able to find anyone with the same or even similar problem.
It seems to have something to do with the Type of the data that I'm binding which in this case is MySqlDateTime. I tested it with System.DateTime and the problem did not happen.
Any help would be appreciated

I cant believe I didnt think of this sooner, but I ended up using a DateTimePicker as opposed to a TextBox.
dateTimePicker.DataBindings.Add("Value", dataSet.Tables[0], "programsUpdated");

Related

Read in a databse table but only get one field

I have a table with four text fields but when I execute the following I only get one field in the DataGridview. I am not geting all the records either I dont think. How to fix it so I get all the fields and records? text= table name this is in a function/method. Is it the query thats fouling things up?
string connetionString = #"Provider=Microsoft.ACE.OLEDB.12.0;Data Source=C:\\temp\\Set.mdb;Persist Security Info=False";
string sql = "SELECT Property, PValue, PDefault, PType FROM "+text;
OleDbConnection connection = new OleDbConnection(connetionString);
OleDbDataAdapter dataadapter = new OleDbDataAdapter(sql, connection);
DataSet ds = new DataSet();
connection.Open();
dataadapter.Fill(ds, text);
connection.Close();
dataGridView1.DataSource = ds;
dataGridView1.DataMember = text;
There's a myriad of things that could be wrong. But none of them are evidenced in your question.
Your DataGridView might not have the correct columns added, or doesn't have AutoGenerateColumns = true.
You haven't mentioned if the data is actually missing from the dataset, or if it's just your view that's broken. Wouldn't you KNOW you're not getting all the records back? Not just have a hunch? Breakpoint that line, Sir!
Have you tried running that command directly on the database? Are the results good there?
I expect the answer will be that the data is fine, but the view is not showing all the data, Data...

DataAdapter: Update unable to find TableMapping['Table'] or DataTable 'Table'

This code snippet is throwing an error:
Update unable to find TableMapping['Table'] or DataTable 'Table'.) on adapter.Update(ds); line
Why it is throwing this type of error?
SqlConnection con = new SqlConnection();
con.ConnectionString = connectionString();
DataSet ds = new DataSet();
string strQuery = "SELECT * FROM Cars";
SqlDataAdapter adapter = new SqlDataAdapter();
adapter.SelectCommand = new SqlCommand(strQuery, con);
SqlCommandBuilder builder = new SqlCommandBuilder(adapter);
adapter.Fill(ds, "Cars");
//Code to modify data in the DataSet
ds.Tables["Cars"].Rows[0]["Brand"] = "NewBrand";
adapter.UpdateCommand = builder.GetUpdateCommand();
adapter.Update(ds);
Use
adapter.Update(ds, "Cars");
instead.
I have tested it. I got the same error without and it works if i specify the tablename. However, i must admit that i yet don't know why the DataAdapter needs to know the table-name since it has all informations it needs. If i useds.GetChanges i get one row with the correct table-name.
Update I have found nothing on MSDN but finally found it in the source(ILSpy). Here is the implementation of DBDataAdapter.Update(DataSet):
public override int Update(DataSet dataSet)
{
return this.Update(dataSet, "Table");
}
So if you don't specify a table, the table-name "Table" is used and if you've specified a table-name other than that you'll get this error, that's really strange!
I assume that the reason for this is that the DataAdapter cannot call GetChanges to determine the table to update for two reasons:
It would be inefficient since it needs to loop all tables and all of their rows to find rows with a RowState != Unchanged
It's possible that multiple tables needs to be updated since they contain changed rows. That is not supported via DataAdapter. Hence DataAdapter.Update(DataSet) assumes the default name "Table" as table-name.
Edit: However, maybe someone can explain me why the DataAdapter doesn't use DataSet.Tables[0].TableName instead.
So in general it seems to be best practise to specify the name of the table you want to update.
It's because .NET cannot assume that the table name in the DataSet/DataTable is identical to the database table. Thus .NET warns you about it.
To solve it you need to add a mapping to the DataAdapter:
da.TableMappings.Add("TableNameInDb", "TableNameInTheDataSet");
However, even if you have specified a name in the DataSet or the DataSource it still doesn't work, since the adapter seems to forget the name.
I only got it working by using:
da.TableMappings.Add("Table", "TableNameInDb");
I agree with jgauffin and I will only explain it with more text.
First, I must explain how TableMapping works. If we don't specify TableMappings with SqlDataAdapter (SqlDataAdapter that will fill our DataSet) then by default the first table will be named "Table", the second will be named "Table1", the third will be named "Table2" etc.
So, when we want to name DataTable in DataSet, we use it like this:
System.Data.DataSet myDataSet = new System.Data.DataSet();
using (System.Data.SqlClient.SqlDataAdapter dbAdapter = new System.Data.SqlClient.SqlDataAdapter(dbCommand))
{
dbAdapter.TableMappings.Add("Table", "Cars");
dbAdapter.TableMappings.Add("Table1", "Trucks");
//...
dbAdapter.Fill(myDataSet);
}
And only then we can modify it like this:
myDataSet.Tables["Cars"].Rows[0]["Brand"] = "Toyota";
myDataSet.Tables["Trucks"].Rows[0]["Brand"] = "MAN";

C# change mdb filed data type to memo and save it

I would like to change the data type in my db from "Text" to "Memo".
first of all, I didnt find the "Memo" data type in c#.
second: I got the following code to execute command in the db:
public void SQLCommand(String strSQL)
{
OleDbConnection objConnection = null;
OleDbCommand objCmd = null;
String strConnection;
strConnection = #"Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" + path + "\\tasks.mdb";
objConnection = new OleDbConnection(strConnection);
objConnection.ConnectionString = strConnection;
objConnection.Open();
objCmd = new OleDbCommand(strSQL, objConnection);
objCmd.ExecuteNonQuery();
objConnection.Close();
UpdateListView();
}
how can I change the 3rd column's data type and save it?
I can change the data type when form_load with this function:
public void tst()
{
conn.Open();
DataSet ds = new DataSet();
OleDbDataAdapter adapter = new OleDbDataAdapter("SELECT * from Tasks", conn);
adapter.Fill(ds);
DataTable dt = ds.Tables[0];
dt.Columns[3].DataType = System.Type.GetType("System.String");
conn.Close();
}
but with this function, it change to the data type to string > and I want memo.
also this function is no good since I need to run it everytime and if I change it permanently to memo I will just have to make a little if at the begining.
~Thanks.
String in C# is the equivalent of both Text and Memo in that it supports texts of either length.
If I understand the question correctly I think you're misunderstanding what you're actually doing in your code. When you set the DataType of the column, you're not changing the database in any way, you are just changing the datatype of a column in the DataTable instance that you've created.
If you actually want to change the structure of the database the best way would probably be to do it manually in Access, since I'm not sure if that's really supported in ADO.Net (I suppose you might be able to do it using ALTER statements). Otherwise you might be able to do it using DAO which used to be the Access/Jet way of doing things like that, but that was deprecated quite a while ago so might not work well in .Net.

Cannot commit DataSet changes to database

I've written a small form that reads the data from a database table (SQL CE 3.5) and displays it in a DataGridView control. This works fine. I then modified it to make a change to the data before displaying it, which also seems to work fine with the exception that it doesn't seem to actually commit the changes to the database. The code is as follows:
using (SqlCeConnection conn = new SqlCeConnection(
Properties.Settings.Default.Form1ConnectionString
)) {
conn.Open();
using (SqlCeDataAdapter adapter = new SqlCeDataAdapter(
"SELECT * FROM People", conn
)) {
//Database update command
adapter.UpdateCommand = new SqlCeCommand(
"UPDATE People SET name = #name " +
"WHERE id = #id", conn);
adapter.UpdateCommand.Parameters.Add(
"#name", SqlDbType.NVarChar, 100, "name");
SqlCeParameter idParameter = adapter.UpdateCommand.Parameters.Add(
"#id", SqlDbType.Int);
idParameter.SourceColumn = "id";
idParameter.SourceVersion = DataRowVersion.Original;
//Create dataset
DataSet myDataSet = new DataSet("myDataSet");
DataTable people = myDataSet.Tables.Add("People");
//Edit dataset
adapter.Fill(myDataSet, "People");
people.Rows[0].SetField("name", "New Name!");
adapter.Update(people);
//Display the table contents in the form datagridview
this.dataGridView1.DataSource=people;
}
}
The form displays like so:
Looking at the table via Visual Studio's Server Explorer however, doesn't show any change to the table.
What am I doing wrong?
I found it. It took days but I found it.
Properties.Settings.Default.Form1ConnectionString is "Data Source=|DataDirectory|\Form1.sdf". The update works if I replace the automatically generated "|DataDirectory|" with the actual path. Oddly enough reading from the database works either way.
Shouldn't the update line be
adapter.Update(myDataSet, "People")
I would make sure the DataSet believes it's been changed. Invoke DataSet.HasChanges (returns bool) and DataSet.GetChanges, which returns a delta of the DataSet from the original.
Have you also tried this against Sql Server Express just to eliminate any issues with the CE data adapter?

Help with DataAdapter - DB doesn't update?

I have a data adapter. When I check the function at runtime I see the changes, but nothing happens in the database. How do I debug this? What went wrong?
OleDbDataAdapter adapter = new OleDbDataAdapter();
string queryString = "SELECT * FROM tasks";
OleDbConnection connection = new OleDbConnection(cn.ConnectionString);
adapter.SelectCommand = new OleDbCommand(queryString, connection);
OleDbCommandBuilder builder = new OleDbCommandBuilder(adapter);
connection.Open();
adapter.Fill(ds.Tables["Tasks"]);
adapter.Update(ds);
return ds;
Nothing is happening in the database because you're running a SELECT query. What are you expecting to happen?
Well unless you snipped a lot of code, you are not changing anything in the dataset per se.
What are you trying to achieve?
Here, you are selecting some data, filling the dataset with it, then putting back the unchanged dataset in the DB.
You should first change something in the dataset itself before calling adapter.Update(ds)
Cheers,
Florian
You are selecting data via the SelectCommand. If you want to update data, you need to run the UpdateCommand.
I assume you didn't post the full source code, as it looks as though you're not modifying the dataset. However, I just tweaked your code a bit (see my comments).
Hopefully this will help...
string queryString = "SELECT * FROM tasks";
OleDbConnection connection = new OleDbConnection(cn.ConnectionString);
connection.Open(); // open connection first
SqlCommand cmd = new SqlCommand(queryString, connection);
OleDbDataAdapter adapter = new OleDbDataAdapter(cmd); // use the cmd above when instantiating the adapter
OleDbCommandBuilder builder = new OleDbCommandBuilder(adapter);
adapter.Fill(ds.Tables["Tasks"]);
// Modify your dataset here.
// Don't call AcceptChanges() as this will prevent the update from working.
adapter.Update(ds);
connection.Close(); // Close connection before ending the function
return ds;
This should allow OleDbCommandBuilder to do its thing by automatically scripting the database updates.
As far as I can see you've not actually changed any of the contents of the tasks table. When you call adapter.Fill you are populated the empty dataset with the records from the database. You are then calling adapter.Update without changing any records within the dataset. The update command only performs changes when the dataset > datatable > datarows are edited and marked as dirty.
you are only specifying the select command. you also need to specify the insert command... i.e:
DataAdapter.InsertCommand = new OleDbCommand....

Categories