MySQL 基础增删改

本文介绍了数据库的基本概念,如数据库、SQL和关系型数据库,重点讲解了MySQL的概述以及如何通过Navicat连接、创建数据库和执行基本的数据库操作,包括连接、创建表、数据插入、更新和删除,以及SQL中的WHERE条件应用。

1.数据库

Database,简称DB。按照一定的数据结构来组织、存储和管理数据的仓库。

存储货物的地方,我们叫做仓库。存储数据的地方,我们叫数据库

 

2 SQL

SQL(Structured Query Language),结构化查询语言。

是一种操作关系型数据库的编程语言,定义了一套操作关系型数据库统一 SQL 标准。

 

3. 关系型数据库

关系型数据库: 由多张相互连接的二维表组成的数据库,就像Excel一样,由行和列组成的二维表。

特点:

  • 使用表存储数据,格式统一,便于维护

  • 使用SQL语句操作,标准统一,使用方便

  • 数据存储在磁盘中,安全

代表:

  • Mysql

  • Oracle

 

4 MySQL概述

MySQL是一种广泛使用的开源关系型数据库管理系统(RDBMS),它是最流行的开源数据库之一。MySQL由瑞典的MySQL AB公司开发,后来被sun收购,最终被Oracle收购。MySQL以其开源免费、简单易用、高性能和可靠性而闻名。

Oracle收费,性能稳定。

5 数据库操作

1 连接数据库

  • 打开navicate

  • 点击连接

  • 选择Mysql

  • 填写数据库连接信息

  • 确认连接(连接前也可以测试连接)

 

 

2 创建数据库

  • 选择数据库

  • 右键选择新建数据库

  • 填写数据库名,字符集,排序规则

     

    字符集:utf8mb4兼容性更好

    排序规则:默认utf8mb4_0900_ai_ci。 0900 指的是 Unicode 校对算法版本 , ai 指的是口音不敏感;也就是说,排序时 e,è,é,ê 和 ë 之间没有区别; ci 表示不区分大小写。也就是说

    6 创建表

    1 数据类型

  • 数字

  • ,排序时 p 和 P 之间没有区别。

  • 字符串

  • 日期类型  

    CHAR和VARCHAR的区别:

    • char不论你实际存储了多少的字符,都会占用设置的n个字符空间 , 比如手机号码,性别,身份证号等

    • varchar它存储的长度并不固定, 实际使用多少就占用多少

    DATETIME和TIMESTAMP区别:

    TIMESTAMP: 1970-01-01 00:00:01.000000’到 2038-01-19 03:14:07.999999。

    DATETIME: 1000-01-01 00:00:00.000000到 9999-12-31 23:59:59.999999。

    对于跨时区的业务,TIMESTAMP更为合适。

    2 创建表
  • 打开数据库,右键表--新建表

  • 填写字段名,类型,长度等信息

    7 SQL通用语法 

    3 删除表
  • 直接将表删除

  • SQL语句可以单行或多行书写,以分号结尾。

  • SQL语句可以使用空格/缩进来增强语句的可读性

  • 注释

    • 单行注释:-- 注释内容 或 # 注释内容

    • 多行注释: /* 注释内容 */ 

      8 表操作

      1 添加数据(INSERT)

       给指定字段添加数据
          insert into 表名 (字段1,字段2...) values (值1,值2...);
      给全部字段添加数据
          insert into 表名 values (值1,值2...);
      批量添加数据
          insert into 表名 (字段1,字段2...) values (值1,值2...),(值1,值2...),(值1,值2...);
          insert into 表名  values (值1,值2...),(值1,值2...),(值1,值2...);

      2 修改数据(UPDATE)

      update 表名 set 字段1=值1, 字段2=值2,...[where 条件]

      修改语句的条件可以有,也可以没有,如果没有条件,则会修改整张表的所有数据。

      3 删除数据(DELETE)

      delete from 表名 [where 条件]

      DELETE 语句的条件可以有,也可以没有,如果没有条件,则会删除整张表的所有数据。

      9 条件(where)

      sql语句里,where后面跟条件

      运算符
          =、!=、<>、<、<=、>、>=、
      关键字
          BETWEEN…AND、IN(set)、IS NULL、AND、OR、NO
<think>嗯,用户的问题是如何在DataGridTextColumn中实现对MySQL数据库增删改操作。这个问题涉及到WPF开发的核心数据处理流程,需要结合用户提供的引用内容来设计解决方案。用户之前提到的引用资料很有帮助,可以看到他们已经在使用SqlHelper类封装数据库连接,并通过数据绑定将查询结果显示在DataGrid中。不过引用中只展示了数据查询的实现,现在需要补充完整的CRUD操作逻辑。在梳理方案时,需要特别注意几个关键技术点:首先是如何捕获用户对DataGrid的编辑操作,这需要处理RowEditEnding等事件;其次是如何将界面操作转化为SQL语句,特别是要区分新增和修改的状态;最后是数据绑定模型的设计,引用[1]中提到的EquipAlarm实体类应该扩展属性变更通知功能。考虑到WPF的数据绑定机制,最合理的方案是采用MVVM模式。因为引用[5]提到过DescriptionAttribute的应用,说明用户对绑定机制有一定了解。虽然用户没有直接要求MVVM,但这种架构最能解决他们的核心诉求:将DataGrid操作同步到数据库。需要提醒用户注意的是并发处理问题,引用[1]中的连接字符串显示他们使用单机数据库,暂时不需要考虑复杂并发,但基础的事务处理还是必要的。另外引用[3]提到过通过刷新页面来更新数据,这其实是不必要的性能损耗,正确的做法应该通过数据绑定自动更新。在代码示例设计上,把重点放在命令绑定和SQL参数处理这两个最容易出错的环节。特别注意展示如何将实体对象的修改映射到UPDATE语句的参数上,因为引用[1]中Tool_ViewModel.GetEquipAlarms方法已经实现了反向的数据装载逻辑。最后补充的优化建议是有意为之。用户引用[2]提到过“传统行业数据库使用较少”的背景,所以考虑引入EntityFramework这样的ORM框架可能对他们长期开发更有利,虽然初期学习成本略高,但能避免直接操作SQL的安全风险。</think> 下面是如何在WPF的`DataGridTextColumn`中实现对MySQL数据库增删改操作的完整方案,结合MVVM模式和数据绑定: --- ### 一、实现增删改的核心步骤 #### 1️⃣ **MVVM模式准备** ```csharp // ViewModel基类 public class ViewModelBase : INotifyPropertyChanged { public event PropertyChangedEventHandler? PropertyChanged; protected void OnPropertyChanged([CallerMemberName] string? name = null) { PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(name)); } } // 实体类(实现属性变更通知) public class EquipAlarm : ViewModelBase { private string _name; public string Name { get => _name; set { _name = value; OnPropertyChanged(); } } // 其他属性(如ID、Status等)... } ``` #### 2️⃣ **ViewModel数据绑定** ```csharp public class MainViewModel : ViewModelBase { public ObservableCollection<EquipAlarm> Alarms { get; set; } = new ObservableCollection<EquipAlarm>(); public ICommand SaveCommand { get; } public ICommand DeleteCommand { get; } public MainViewModel() { // 初始化命令 SaveCommand = new RelayCommand(SaveChanges); DeleteCommand = new RelayCommand(DeleteRecord); // 加载初始数据 LoadData(); } private void LoadData() { var ds = SqlHelper.GetInfo(); var data = Tool_ViewModel.GetEquipAlarms(ds); Alarms.Clear(); foreach (var item in data) Alarms.Add(item); } } ``` #### 3️⃣ **SQLHelper增删改扩展** ```csharp public static class SqlHelper { // 更新操作(通用方法) public static void ExecuteNonQuery(string sql, params MySqlParameter[] parameters) { using var con = new MySqlConnection(mySQLConStr); con.Open(); using var cmd = new MySqlCommand(sql, con); cmd.Parameters.AddRange(parameters); cmd.ExecuteNonQuery(); } // 示例:更新记录 public static void UpdateRecord(EquipAlarm alarm) { string sql = @"UPDATE table1 SET Name = @Name, Status = @Status WHERE ID = @ID"; ExecuteNonQuery(sql, new MySqlParameter("@Name", alarm.Name), new MySqlParameter("@Status", alarm.Status), new MySqlParameter("@ID", alarm.ID)); } // 删除记录 public static void DeleteRecord(int id) { string sql = "DELETE FROM table1 WHERE ID = @ID"; ExecuteNonQuery(sql, new MySqlParameter("@ID", id)); } } ``` #### 4️⃣ **命令实现** ```csharp private void SaveChanges(object param) { foreach (var alarm in Alarms) { // 判断是更新还是新增(通过ID是否为0) if(alarm.ID > 0) SqlHelper.UpdateRecord(alarm); else SqlHelper.InsertRecord(alarm); // 需实现InsertRecord方法 } } private void DeleteRecord(object param) { if(param is EquipAlarm selected) { SqlHelper.DeleteRecord(selected.ID); Alarms.Remove(selected); } } ``` #### 5️⃣ **XAML关键绑定** ```xml <DataGrid x:Name="dataGrid1" ItemsSource="{Binding Alarms}" AutoGenerateColumns="False" CanUserAddRows="True"> <DataGrid.Columns> <!-- 示例文本列(绑定Name属性) --> <DataGridTextColumn Header="设备名称" Binding="{Binding Name, UpdateSourceTrigger=PropertyChanged}" Width="*"/> <!-- 删除按钮列 --> <DataGridTemplateColumn> <DataGridTemplateColumn.CellTemplate> <DataTemplate> <Button Content="删除" Command="{Binding Path=DataContext.DeleteCommand, RelativeSource={RelativeSource AncestorType=DataGrid}}" CommandParameter="{Binding}"/> </DataTemplate> </DataGridTemplateColumn.CellTemplate> </DataGridTemplateColumn> </DataGrid.Columns> </DataGrid> <!-- 保存按钮 --> <Button Content="保存所有更改" Command="{Binding SaveCommand}"/> ``` --- ### 二、解决关键问题方案 1. **编辑同步问题** - 在ViewModel中自动跟踪`EquipAlarm`对象的属性变更(通过`INotifyPropertyChanged`) - SQL更新时仅修改变更字段(对比原始状态) 2. **新增行处理** ```csharp // 在ViewModel中添加 public void AddNewRecord() { Alarms.Add(new EquipAlarm()); // ID=0表示新记录 } ``` 3. **删除后刷新** - 直接操作`ObservableCollection`自动更新UI - 无需整体刷新数据库 4. **并发冲突** ```csharp // 更新时添加时间戳校验 string sql = @"UPDATE table1 SET ... WHERE ID=@ID AND TimeStamp=@OriginalTS"; ``` --- ### 三、优化建议 1. **事务处理**(批量操作) ```csharp using var transaction = mySqlCon.BeginTransaction(); try { // 循环执行命令 transaction.Commit(); } catch { transaction.Rollback(); } ``` 2. **数据验证** ```xml <DataGridTextColumn Binding="{Binding Name, ValidatesOnExceptions=True}"> <DataGridTextColumn.ElementStyle> <Style TargetType="TextBox"> <Setter Property="Background" Value="Pink" /> </Style> </DataGridTextColumn.ElementStyle> </DataGridTextColumn> ``` 3. **异步加载** ```csharp private async Task LoadDataAsync() { await Task.Run(() => { // 数据库操作 }); } ``` --- ### 引用说明 实现基于WPF数据绑定机制[^5],数据库操作层参考MySQL ADO.NET规范[^1],事务处理参考数据库最佳实践[^2]。MVVM模式可显著降低View与数据操作的耦合度[^3]。 ---
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值