如何从c#上的datagrid更新mysql数据库?

nsc4cvqm  于 2021-06-18  发布在  Mysql
关注(0)|答案(3)|浏览(441)

我正在尝试从datagrid更新mysql db,但它不起作用。添加的数据不在数据库中,并且没有错误,为什么会发生这种情况。我已经试着解决这个问题好几天了。

  1. private void dtGrid_RowEditEnding(object sender, DataGridRowEditEndingEventArgs e)
  2. {
  3. MySqlConnection conn = DBUtils.GetDBConnection();
  4. string table = "brands";
  5. string sql = "SELECT * FROM "+table;
  6. MySqlDataAdapter myDataAdapter = new MySqlDataAdapter(sql, conn);
  7. conn.Open();
  8. MySqlCommandBuilder myCommandBuilder = new MySqlCommandBuilder(myDataAdapter);
  9. myDataAdapter.InsertCommand = myCommandBuilder.GetInsertCommand();
  10. myDataAdapter.UpdateCommand = myCommandBuilder.GetUpdateCommand();
  11. myDataAdapter.DeleteCommand = myCommandBuilder.GetDeleteCommand();
  12. DataSet myDataSet = new DataSet();
  13. myDataAdapter.Fill(myDataSet, table);
  14. myDataAdapter.AcceptChangesDuringUpdate = true;
  15. myDataAdapter.Update(myDataSet, table);
  16. conn.Close();
  17. }
g6baxovj

g6baxovj1#

看起来您正在运行此代码,只要用户已按名称进行了编辑 RowEditEnding ".
所以我认为问题是你只是在创造 MySqlCommandBuilder 编辑完成后。
你需要创建 MySqlCommandBuilder 首先,进行编辑,然后获取更新/插入/删除命令。
e、 g.类似于以下内容(在vb中很抱歉,但您了解要点):

  1. Using NotesDS As New DataSet
  2. Using NotesDA As New SqlDataAdapter With {.SelectCommand = New SqlCommand With {.Connection = SQLDBConnection, .CommandText = "SELECT * FROM Notes WHERE ID = " & ID}}
  3. NotesDA.Fill(NotesDS, "Notes")
  4. Using NotesDV As New DataView(NotesDS.Tables("Notes"))
  5. Using NoteBuilder As New SqlCommandBuilder(NotesDA) With {.QuotePrefix = "[", .QuoteSuffix = "]"}
  6. If NotesDV.Count = 1 Then
  7. Dim NoteDRV As DataRowView = NotesDV(0)
  8. NoteDRV.BeginEdit()
  9. NoteDRV.Item("UserName") = UserName
  10. NoteDRV.Item("Note") = Note
  11. NoteDRV.Item("NoteDate") = NoteDate
  12. NoteDRV.Item("CompanyCode") = CompanyCode
  13. NoteDRV.EndEdit()
  14. NotesDA.UpdateCommand = NoteBuilder.GetUpdateCommand
  15. NotesDA.Update(NotesDS, "Notes")
  16. End If
  17. End Using
  18. End Using
  19. End Using
  20. End Using

编辑
@尤金,你的工作是什么 DataGrid 一定要吗?想必你正在设定一个 DataView 作为 DataContext ?
如果是这样的话,那么你将使用 DataAdapter 填充 DataView 在页面加载上?这就是 DataAdapter 你需要初始化你的 MySqlCommandBuilder 与。
请尝试以下操作:
宣布你 DataAdapter , DataSet 以及 DataView 在页面顶部。
使用 BeginningEdit dtgrid的处理程序来初始化 MySqlCommandBuilder 在你宣布的 DataAdapter 使用 RowEditEnding 运行 DataAdapter.Update 命令
e、 g.(据我所知,我使用的是sql,但mysql的工作原理是一样的)

  1. using System.Windows;
  2. using System.Windows.Controls;
  3. using System.Data;
  4. using System.Data.SqlClient;
  5. namespace testApp
  6. {
  7. /// <summary>
  8. /// Interaction logic for MainWindow.xaml
  9. /// </summary>
  10. public partial class MainWindow : Window
  11. {
  12. public MainWindow()
  13. {
  14. InitializeComponent();
  15. }
  16. private SqlDataAdapter myDataAdapter;
  17. private DataView myDataView;
  18. private DataSet myDataSet;
  19. private SqlCommandBuilder myBuilder;
  20. private SqlConnection myConn = new SqlConnection("CONNECTIONSTRING");
  21. private void Window_Loaded(object sender, RoutedEventArgs e)
  22. {
  23. myConn.Open();
  24. myDataAdapter = new SqlDataAdapter {SelectCommand=new SqlCommand() {Connection=myConn, CommandText="SELECT MINumber, CompanyName FROM EIncCompanies WHERE CompanyName LIKE 'Test%'" } };
  25. myDataSet = new DataSet();
  26. myDataAdapter.Fill(myDataSet, "EIncCompanies");
  27. myDataView = new DataView(myDataSet.Tables["EIncCompanies"]);
  28. dtGrid.DataContext = myDataView;
  29. }
  30. private void dtGrid_BeginningEdit(object sender, DataGridBeginningEditEventArgs e)
  31. {
  32. myBuilder = new SqlCommandBuilder(myDataAdapter) { QuotePrefix="[", QuoteSuffix="]"};
  33. DataRowView myDRV = (DataRowView)dtGrid.SelectedItem;
  34. myDRV.BeginEdit();
  35. }
  36. private void dtGrid_RowEditEnding(object sender, DataGridRowEditEndingEventArgs e)
  37. {
  38. DataRowView myDRV = (DataRowView)dtGrid.SelectedItem;
  39. myDRV.EndEdit();
  40. myDataAdapter.UpdateCommand = myBuilder.GetUpdateCommand();
  41. myDataAdapter.Update(myDataSet, "EIncCompanies");
  42. }
  43. }
  44. }

我还设置了 Mode=TwoWay, UpdateSourceTrigger=PropertyChanged 论图书馆的装订 DataGrid .

展开查看全部
vsnjm48y

vsnjm48y2#

@尤金
所以这里:

  1. DataTable dt = new DataTable();
  2. DataSet ds = new DataSet();
  3. dt = ((DataView)dtGrid.ItemsSource).ToTable() as DataTable;
  4. ds.Tables.Add(dt);

然后用

  1. myDataAdapter.Fill(ds, table);

您正在创建一个新的数据表,然后向其中添加一个现有的数据表。这就是为什么所有行都被再次添加。
尝试将代码更改为。xaml编号:

  1. <Grid>
  2. <TabControl Height="310" HorizontalAlignment="Left" Margin="-1,-1,0,0" Name="tabControl1" VerticalAlignment="Top" Width="763">
  3. <TabItem Header="Brands" Name="tabBrands">
  4. <DataGrid ItemsSource="{Binding}" Name="dtGrid" Height="280" Width="750" BeginningEdit="dtGrid_BeginningEdit" RowEditEnding="dtGrid_RowEditEnding" AutoGenerateColumns="True" AutoGeneratingColumn="dtGrid_AutoGeneratingColumn" />
  5. </TabItem>
  6. <TabItem Header="Later" Name="tabItem2">
  7. </TabItem>
  8. </TabControl>
  9. </Grid>

c级#

  1. public partial class MainWindow : Window
  2. {
  3. private MySqlDataAdapter myDataAdapter;
  4. private DataSet myDataSet;
  5. private MySqlCommandBuilder myBuilder;
  6. private MySqlConnection myConn = DBUtils.GetDBConnection();
  7. public MainWindow()
  8. {
  9. InitializeComponent();
  10. myConn.Open();
  11. myDataAdapter = new MySqlDataAdapter {SelectCommand=new MySqlCommand() {Connection=myConn, CommandText= "SELECT * FROM brands" } };
  12. myDataSet = new DataSet();
  13. myDataAdapter.Fill(myDataSet, "brands");
  14. dtGrid.DataContext = myDataSet.Tables["brands"].DefaultView;
  15. }
  16. private void dtGrid_BeginningEdit(object sender, DataGridBeginningEditEventArgs e)
  17. {
  18. myBuilder = new MySqlCommandBuilder(myDataAdapter);
  19. DataRowView myDRV = (DataRowView)dtGrid.SelectedItem;
  20. myDRV.BeginEdit();
  21. }
  22. private void dtGrid_RowEditEnding(object sender, DataGridRowEditEndingEventArgs e)
  23. {
  24. DataRowView myDRV = (DataRowView)dtGrid.SelectedItem;
  25. myDRV.EndEdit();
  26. myDataAdapter.UpdateCommand = myBuilder.GetUpdateCommand();
  27. myDataAdapter.Update(myDataSet, "brands");
  28. }
  29. private void dtGrid_AutoGeneratingColumn(object sender, DataGridAutoGeneratingColumnEventArgs e)
  30. {
  31. var tc = e.Column as System.Windows.Controls.DataGridTextColumn;
  32. var b = tc.Binding as System.Windows.Data.Binding;
  33. b.UpdateSourceTrigger = UpdateSourceTrigger.PropertyChanged;
  34. b.ValidatesOnDataErrors = true;
  35. b.NotifyOnValidationError = true;
  36. }
  37. }

这会丢失按钮,但您现在可以编辑和添加行,而不需要按钮。向DATAGRID底部的空白行添加行。

展开查看全部
r1zk6ea1

r1zk6ea13#

@simon,我做了不同的事情,现在它插入了dtgrid中的所有值,而不仅仅是新值,也许我没有正确地共享它。填充dbgrid:

  1. public MainWindow()
  2. {
  3. InitializeComponent();
  4. /*string sql = "SELECT * FROM brands";*/
  5. MySqlConnection conn = DBUtils.GetDBConnection();
  6. MySqlCommand cmd = new MySqlCommand("select * from brands", conn);
  7. conn.Open();
  8. DataTable dt = new DataTable();
  9. dt.Load(cmd.ExecuteReader());
  10. conn.Close();
  11. dtGrid.ItemsSource = dt.DefaultView;
  12. }

插入新项目

  1. private void Insert_Click(object sender, RoutedEventArgs e)
  2. {
  3. MySqlConnection conn = DBUtils.GetDBConnection();
  4. string table = "brands";
  5. string sql = "SELECT * FROM " + table;
  6. MySqlDataAdapter myDataAdapter = new MySqlDataAdapter(sql, conn);
  7. conn.Open();
  8. MySqlCommandBuilder myCommandBuilder = new MySqlCommandBuilder(myDataAdapter);
  9. DataSet myDataSet = new DataSet();
  10. DataTable dt = new DataTable();
  11. DataSet ds = new DataSet();
  12. dt = ((DataView)dtGrid.ItemsSource).ToTable() as DataTable;
  13. ds.Tables.Add(dt);
  14. myDataAdapter.InsertCommand = myCommandBuilder.GetInsertCommand();
  15. myDataAdapter.UpdateCommand = myCommandBuilder.GetUpdateCommand();
  16. myDataAdapter.DeleteCommand = myCommandBuilder.GetDeleteCommand();
  17. myDataAdapter.Fill(ds, table);
  18. myDataAdapter.AcceptChangesDuringUpdate = true;
  19. myDataAdapter.Update(ds, table);
  20. }

xaml公司

  1. <Window x:Class="TechD.MainWindow"
  2. xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
  3. xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
  4. Title="TechDep" Height="390" Width="902">
  5. <Grid>
  6. <TabControl Height="310" HorizontalAlignment="Left" Margin="-1,-1,0,0" Name="tabControl1" VerticalAlignment="Top" Width="763">
  7. <TabItem Header="Brands" Name="tabBrands">
  8. <DataGrid AutoGenerateColumns="True" Height="280" Name="dtGrid" Width="750" CanUserAddRows="True" ItemsSource="{Binding}" RowEditEnding="dtGrid_RowEditEnding" />
  9. </TabItem>
  10. <TabItem Header="Later" Name="tabItem2">
  11. </TabItem>
  12. </TabControl>
  13. <Button Content="Insert" Height="23" HorizontalAlignment="Left" Margin="774,21,0,0" Name="Insert" VerticalAlignment="Top" Width="90" Click="Insert_Click" />
  14. <Button Content="Button" Height="23" HorizontalAlignment="Left" Margin="774,50,0,0" Name="button2" VerticalAlignment="Top" Width="90" />
  15. <Button Content="Button" Height="23" HorizontalAlignment="Left" Margin="774,79,0,0" Name="button3" VerticalAlignment="Top" Width="90" />
  16. <Button Content="Button" Height="23" HorizontalAlignment="Left" Margin="774,108,0,0" Name="button4" VerticalAlignment="Top" Width="90" />
  17. </Grid>
展开查看全部

相关问题