您好,
会员登录 快速注册
退出 ( 条未读消息)
关于本站 意见反馈 首页

公告:小宅博客网可以开发票了,需要发票的,去群里找群主哈!!
全部文章分类
  • 人工智能 >

  • 编程语言 >

  • WPF系列 >

  • ASP.NET系列 >

  • Linux >

  • 数据库 >

  • 嵌入式 >

  • WEB技术 >

  • PLC系列 >

  • 微服务与框架 >

  • 小宅DIY >

  • 学习资料 >

OpenCv基础 ANN车牌识别 yolov5车牌识别 指针式仪表识别 ROS系列 YOLO Halcon Detectron2 昇腾AI ChatGPT在线体验 英伟达JETSON ChatGLM ChatTTS FunASR 地平线 ByteTrack 魔搭社区 LangChain
C C# C++ Python Java Go
WPF
ASP.NET小功能 GPS定位系统-MVC GPS定位系统-VUE ASP.NET WebRTC
Linux Linux内核 Shell MakeFile
MySql SqlServer Oracle
STM8 STM32 51单片机
VUE入门 HTML JavaScript CSS layui镜像网站 ElementUi中文官网 element-plus 图标
三菱 欧姆龙 西门子 施耐德 松下 台达
IOTSharp IOTGateway ABP FRAMEWORK Docker
亚克力音响 编程仙途:智驭万法
面试题与技巧 Python入门技能树 微软C#教程
首页 编程之美 工具下载 全国就业 流量地图 文心一言
C#
内容简介 1、C#环境下使用EF操作MySql 2、实现串口通信 3、TCP通信 4、读写SqlServer数据库 5、读写ini配置文件 6、实现远程升级 7、调用打印机 8、AES数据加密与解密 AES加解密(RijndaelManaged版) 9、FTP的上传和下载 10、封装dll到exe 11、重写Button控件 12、重写Labeld控件 13、重写DataGridView控件 14、重写TabControl控件 15、重写ProgressBar控件 16、加载状态弹窗设计 17、模拟按键精灵 18、24种数据校验算法 19、C#如何调用opencv 20、地图上显示GPS坐标 21、使用EPPlus导出/导入xlsx格式的Excel报表和曲线图 22、exe程序生成安装包 23、DataGridView控件列控制 24、json解析 25、自定义委托事件 26、xml文件的生成与读取 27、DataGridView实现翻页效果 28、如何实现CAD dxf文件的读取 29、StopWatch的使用 30、Async与Await 同步与异步操作 31、关闭登录窗体打开主窗体的方法 32、SQLite数据库的操作 33、MD5数据加密 34、DES数据加密与解密 35、获取本地IP地址 36、打开与保存文件 37、静态图表显示(曲线图) 38、动态图表显示(曲线图) 39、根据公网IP获取地址信息 40、List转DataTable 41、C#下实现Ping操作 42、父窗体中嵌入子窗体 43、获取MySql数据库列表 44、WebSocket通讯 45、Mqtt客户端与服务端通讯 46、使用QRCode生成二维码 47、AForge调用摄像头 48、Emgu.CV调用摄像头 49、获取以太网网卡IP 50、DataGridView全选与定位 51、如何获取系统中所有程序的句柄 遍历指定目录下的所有文件 ​NPOI Excel报表的导入与导出 常用正则表达式字符串格式判断 Task和Thread的启停操作 C# 一些常用小功能1 C# 一些常用小功能2 如何使用C#来发送QQ邮件 Aspose.Slides文档格式转换 C# GDI+ 画心形 跳动动画 使用Remoting实现RPC RabbitMQ.消息发布与订阅 .Net Core 微信/支付宝 官方Demo C# OCR图片文字识别 Quartz 计划任务 文字语音播报 winform基于百度地图的电子围栏、路径规划、小车导航实现 Visual Studio C盘数据迁移,解决C盘空间不足的问题 Kafka通讯(Kafka-Net版) Kafka通讯(Confluent.Kafka版) 获取变量Description描述 C# 将PDF文档转换为Word文档 C# MVC 多图片上传预览
内容简介
2、实现串口通信
激萌の小宅 小宅博客网 C#

文章作者:激萌の小宅

促销:¥0

价格:¥0

配送方式: 购买后立即生效(如购买异常,请联系站长)
付款之后一定要等待自动跳转结束,否则购买可能会失败
  • 0 天

    有效期

  • 0

    总销量

  • 25

    累计评价

C#环境下使用EF操作MySql - (第一讲)


开发环境为 Visual Studio 2019。


视频讲解如下:


源码下载,提取码:jiyo 

https://pan.baidu.com/s/1J9T0AEll3DgNBIWyD9r3VQ


本章节主要给大家讲解如何使用EntityFrameworkCore对MySql数据库进行增删改查操作,其中也包括如使用EntityFrameworkCore直接执行sql命令。


需要安装的第三方库如下:

MySql.EntityFrameworkCore

Microsoft.EntityFrameworkCore

Microsoft.EntityFrameworkCore.Relational


界面设计如下:


Form1.cs 代码如下:

using Microsoft.EntityFrameworkCore;
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Linq;
using System.Windows.Forms;
using WindowsFormsApp.MySql;

namespace WindowsFormsApp
{
    public partial class Form1 : Form
    {
        private MyDbContext MyDb = new MyDbContext();

        public Form1()
        {
            InitializeComponent();
        }
        private void Form1_Load(object sender, EventArgs e)
        {
            InitMySql();
        }

        private void InitMySql()
        {
            try
            {
                // 尝试初始化数据库。
                // 如果数据库存在,则不会新建数据库和表
                // 如果不存在,则会新建数据库和表
                MyDb.Database.EnsureCreated();
            }
            catch (Exception e)
            {
                MessageBox.Show(e.Message);
            }
        }

        private void button读取_Click(object sender, EventArgs e)
        {
            dataGridView1.Columns.Clear();

            // 第一种读取方法
            //List<data1> data = MyDb.tb_data1.ToList(); // 读取tb_data1表所有数据
            //dataGridView1.DataSource = new BindingList<data1>(data);

            // 第二种读取方法
            //using(MyDbContext db = new MyDbContext())
            //{
            //    List<data1> data = db.tb_data1.ToList(); // 读取tb_data1表所有数据
            //    dataGridView1.DataSource = new BindingList<data1>(data);
            //    db.Dispose();
            //}

            // 第三种读取方法,直接使用sql命令进行读取
            List<data1> data = MyDb.tb_data1.FromSqlRaw("SELECT * FROM tb_data1").ToList();
            if (data.Count() > 0)
            {
                dataGridView1.DataSource = new BindingList<data1>(data);
                MessageBox.Show("读取成功.");
            }
            else
            {
                MessageBox.Show("读取失败.");
            }
        }

        private void button写入_Click(object sender, EventArgs e)
        {
            //data1 data = new data1();
            //data.text1 = DateTime.Now.ToString();
            //data.text2 = textBox1.Text;

            // 第一种,使用MyDb进行写入操作
            #region
            //MyDb.tb_data1.Add(data);
            //if(MyDb.SaveChanges() > 0)
            //{
            //    MessageBox.Show("新增成功.");
            //}
            //else
            //{
            //    MessageBox.Show("新增失败.");
            //}
            #endregion

            // 第二种,使用MyDbContext类进行写入操作(正常情况下使用这种)
            #region
            //using (MyDbContext db = new MyDbContext())
            //{
            //    db.tb_data1.Add(data);
            //    if(db.SaveChanges() > 0)
            //    {
            //        MessageBox.Show("新增成功.");
            //    }
            //    else
            //    {
            //        MessageBox.Show("新增失败.");
            //    }
            //    db.Dispose(); // 释放资源,可以不需要
            //}
            #endregion

            // 第三种,直接使用sql命令进行插入
            int ret = MyDb.Database.ExecuteSqlInterpolated($"INSERT INTO tb_data1 (text1,text2) VALUES({DateTime.Now},{textBox1.Text})");
            if (ret > 0)
            {
                MessageBox.Show("新增成功.");
            }
            else
            {
                MessageBox.Show("新增失败.");
            }
        }
        private void button修改_Click(object sender, EventArgs e)
        {
            int id = int.Parse(textBox2.Text);

            // 第一种,使用MyDb进行修改操作
            #region
            // 查询键值为id的数据
            //data1 data = MyDb.tb_data1.FirstOrDefault(x => x.key == id);
            //if(data != null)
            //{
            //    data.text2 = textBox1.Text;
            //}
            //// 保存
            //if (MyDb.SaveChanges() > 0)
            //{
            //    MessageBox.Show("修改成功.");
            //}
            //else
            //{
            //    MessageBox.Show("修改失败.");
            //}
            #endregion

            // 第二种,使用MyDbContext类进行修改操作(正常情况下使用这种)
            using (MyDbContext db = new MyDbContext())
            {
                data1 data = db.tb_data1.FirstOrDefault(x => x.key == id);
                if (data != null)
                {
                    data.text2 = textBox1.Text;
                }
                if (db.SaveChanges() > 0)
                {
                    MessageBox.Show("修改成功.");
                }
                else
                {
                    MessageBox.Show("修改失败.");
                }
                db.Dispose(); // 释放资源,可以不需要
            }
        }
        private void button删除_Click(object sender, EventArgs e)
        {
            int id = int.Parse(textBox2.Text);

            // 第一种,使用MyDb进行删除操作
            #region
            // 查询键值为id的数据
            //data1 data = MyDb.tb_data1.FirstOrDefault(x => x.key == id);
            //MyDb.tb_data1.Remove(data);
            //// 保存
            //if (MyDb.SaveChanges() > 0)
            //{
            //    MessageBox.Show("删除成功.");
            //}
            //else
            //{
            //    MessageBox.Show("删除失败.");
            //}
            #endregion

            // 第二种,使用MyDbContext类进行删除操作(正常情况下使用这种)
            using (MyDbContext db = new MyDbContext())
            {
                data1 d = db.tb_data1.FirstOrDefault(x => x.key == id);
                db.tb_data1.Remove(d);
                if (db.SaveChanges() > 0)
                {
                    MessageBox.Show("删除成功.");
                }
                else
                {
                    MessageBox.Show("删除失败.");
                }
                db.Dispose(); // 释放资源,可以不需要
            }
        }
        private void button删除多条_Click(object sender, EventArgs e)
        {
            // 第一种,使用MyDb进行删除操作
            // 查询所有text2的值等于textBox1.Text的数据
            //List<data1> data = MyDb.tb_data1.Where(x => x.text2 == textBox1.Text).ToList();
            // 删除所有text2的值等于textBox1.Text的数据
            //MyDb.tb_data1.RemoveRange(data);
            //// 保存
            //if (MyDb.SaveChanges() > 0)
            //{
            //    MessageBox.Show("批量删除成功.");
            //}
            //else
            //{
            //    MessageBox.Show("批量删除失败.");
            //}

            // 第二种,使用MyDbContext类进行删除操作(正常情况下使用这种)
            using (MyDbContext db = new MyDbContext())
            {
                // 删除所有text2的值等于textBox1.Text的数据
                db.tb_data1.RemoveRange(db.tb_data1.Where(x => x.text2 == textBox1.Text));
                if (db.SaveChanges() > 0)
                {
                    MessageBox.Show("批量删除成功.");
                }
                else
                {
                    MessageBox.Show("批量删除失败.");
                }
                db.Dispose(); // 释放资源,可以不需要
            }
        }
    }
}

MyDbContext.cs 代码如下

using Microsoft.EntityFrameworkCore;

namespace WindowsFormsApp.MySql
{
    /// <summary>
    /// 外部调用,操作数据库的接口
    /// </summary>
    public class MyDbContext : DbContext
    {
        #region 数据库表

        public DbSet<data1> tb_data1 { get; set; }
        public DbSet<data2> tb_data2 { get; set; }

        #endregion

        /// <summary>
        /// 链接到数据库回调
        /// </summary>
        /// <param name="optionsBuilder"></param>
        protected override void OnConfiguring(DbContextOptionsBuilder optionsBuilder)
        {
            // 链接信息
            string sql = @"Server=localhost; Port=3306; Database=test; User=root; Password=123456; CharSet=utf8; Allow User Variables=true;";
            optionsBuilder.UseMySQL(sql);
        }

        /// <summary>
        /// 数据模式回调
        /// </summary>
        /// <param name="modelBuilder"></param>
        protected override void OnModelCreating(ModelBuilder modelBuilder)
        {
            base.OnModelCreating(modelBuilder);

            // 如果需要将表中某个字段从数据库中排除,但又不想在代码中删除该字段,可以用如下方法
            // modelBuilder.Entity<表名>().Ignore(x => x.字段);
            //
            // 例如,将Tb_rdata表中text字段排除
            //modelBuilder.Entity<data1>().Ignore(x => x.text1);

            // 如果该表不存在键值,则可以采用如下方法
            // modelBuilder.Entity<表名>().HasNoKey();
            //
            // 例如:
            //modelBuilder.Entity<data1>().HasNoKey();
        }
    }
}


data1.cs 代码如下

using System.ComponentModel.DataAnnotations;

namespace mysql.MySql
{
    public class data1
    {
        /// <summary>
        /// 添加键值,默认名称是id,数据类型为int
        /// </summary>
        [Key]
        public int ids { get; set; }

        /// <summary>
        /// 文本数据
        /// </summary>
        public string text { get; set; }
    }
}


data2.cs 代码如下

namespace WindowsFormsApp.MySql
{
    public class data2
    {
        /// <summary>
        /// EF 默认名称为ID的变量为键值
        /// </summary>
        public int id { get; set; }

        /// <summary>
        /// 数据
        /// </summary>
        public string text { get; set; }
    }
}


还有一种不使用EF的链接方式:

string sql = @"SELECT * FROM tb_data1";
string constr = @"Server=localhost; Port=3306; Database=test; User=root; Password=JYZN_2331_agv; CharSet=utf8; Allow User Variables=true;";

// 连接到数据库
MySqlConnection sqlCon = new MySqlConnection(constr);
sqlCon.Open();

// 执行sql命令
MySqlCommand sqlCmd = new MySqlCommand(sql, sqlCon);
MySqlDataAdapter ad = new MySqlDataAdapter(sqlCmd);
DataSet ds = new DataSet();
ad.Fill(ds);
ds.Dispose();


内容简介
2、实现串口通信

友情链接: CSDN激萌の小宅 95知识库 自考题库 罗分明个人网络博客 精益编程leanboot

小宅博客  www.bilibili996.com All Rights Reserved. 备案号: 闽ICP备2024034575号

网站经营许可证  福建省福州市 Copyright©2021-2025 版权所有

小宅博客
首页 智能家居 地图定位
公告:小宅博客网可以开发票了,需要发票的,去群里找群主哈!!

文章作者:激萌の小宅

促销:¥0

价格:¥0

配送方式: 购买后立即生效(如购买异常,请联系站长)
付款之后一定要等待自动跳转结束,否则购买可能会失败
  • 0 天

    有效期

  • 0

    总销量

  • 25

    累计评价

C#环境下使用EF操作MySql - (第一讲)


开发环境为 Visual Studio 2019。


视频讲解如下:


源码下载,提取码:jiyo 

https://pan.baidu.com/s/1J9T0AEll3DgNBIWyD9r3VQ


本章节主要给大家讲解如何使用EntityFrameworkCore对MySql数据库进行增删改查操作,其中也包括如使用EntityFrameworkCore直接执行sql命令。


需要安装的第三方库如下:

MySql.EntityFrameworkCore

Microsoft.EntityFrameworkCore

Microsoft.EntityFrameworkCore.Relational


界面设计如下:


Form1.cs 代码如下:

using Microsoft.EntityFrameworkCore;
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Linq;
using System.Windows.Forms;
using WindowsFormsApp.MySql;

namespace WindowsFormsApp
{
    public partial class Form1 : Form
    {
        private MyDbContext MyDb = new MyDbContext();

        public Form1()
        {
            InitializeComponent();
        }
        private void Form1_Load(object sender, EventArgs e)
        {
            InitMySql();
        }

        private void InitMySql()
        {
            try
            {
                // 尝试初始化数据库。
                // 如果数据库存在,则不会新建数据库和表
                // 如果不存在,则会新建数据库和表
                MyDb.Database.EnsureCreated();
            }
            catch (Exception e)
            {
                MessageBox.Show(e.Message);
            }
        }

        private void button读取_Click(object sender, EventArgs e)
        {
            dataGridView1.Columns.Clear();

            // 第一种读取方法
            //List<data1> data = MyDb.tb_data1.ToList(); // 读取tb_data1表所有数据
            //dataGridView1.DataSource = new BindingList<data1>(data);

            // 第二种读取方法
            //using(MyDbContext db = new MyDbContext())
            //{
            //    List<data1> data = db.tb_data1.ToList(); // 读取tb_data1表所有数据
            //    dataGridView1.DataSource = new BindingList<data1>(data);
            //    db.Dispose();
            //}

            // 第三种读取方法,直接使用sql命令进行读取
            List<data1> data = MyDb.tb_data1.FromSqlRaw("SELECT * FROM tb_data1").ToList();
            if (data.Count() > 0)
            {
                dataGridView1.DataSource = new BindingList<data1>(data);
                MessageBox.Show("读取成功.");
            }
            else
            {
                MessageBox.Show("读取失败.");
            }
        }

        private void button写入_Click(object sender, EventArgs e)
        {
            //data1 data = new data1();
            //data.text1 = DateTime.Now.ToString();
            //data.text2 = textBox1.Text;

            // 第一种,使用MyDb进行写入操作
            #region
            //MyDb.tb_data1.Add(data);
            //if(MyDb.SaveChanges() > 0)
            //{
            //    MessageBox.Show("新增成功.");
            //}
            //else
            //{
            //    MessageBox.Show("新增失败.");
            //}
            #endregion

            // 第二种,使用MyDbContext类进行写入操作(正常情况下使用这种)
            #region
            //using (MyDbContext db = new MyDbContext())
            //{
            //    db.tb_data1.Add(data);
            //    if(db.SaveChanges() > 0)
            //    {
            //        MessageBox.Show("新增成功.");
            //    }
            //    else
            //    {
            //        MessageBox.Show("新增失败.");
            //    }
            //    db.Dispose(); // 释放资源,可以不需要
            //}
            #endregion

            // 第三种,直接使用sql命令进行插入
            int ret = MyDb.Database.ExecuteSqlInterpolated($"INSERT INTO tb_data1 (text1,text2) VALUES({DateTime.Now},{textBox1.Text})");
            if (ret > 0)
            {
                MessageBox.Show("新增成功.");
            }
            else
            {
                MessageBox.Show("新增失败.");
            }
        }
        private void button修改_Click(object sender, EventArgs e)
        {
            int id = int.Parse(textBox2.Text);

            // 第一种,使用MyDb进行修改操作
            #region
            // 查询键值为id的数据
            //data1 data = MyDb.tb_data1.FirstOrDefault(x => x.key == id);
            //if(data != null)
            //{
            //    data.text2 = textBox1.Text;
            //}
            //// 保存
            //if (MyDb.SaveChanges() > 0)
            //{
            //    MessageBox.Show("修改成功.");
            //}
            //else
            //{
            //    MessageBox.Show("修改失败.");
            //}
            #endregion

            // 第二种,使用MyDbContext类进行修改操作(正常情况下使用这种)
            using (MyDbContext db = new MyDbContext())
            {
                data1 data = db.tb_data1.FirstOrDefault(x => x.key == id);
                if (data != null)
                {
                    data.text2 = textBox1.Text;
                }
                if (db.SaveChanges() > 0)
                {
                    MessageBox.Show("修改成功.");
                }
                else
                {
                    MessageBox.Show("修改失败.");
                }
                db.Dispose(); // 释放资源,可以不需要
            }
        }
        private void button删除_Click(object sender, EventArgs e)
        {
            int id = int.Parse(textBox2.Text);

            // 第一种,使用MyDb进行删除操作
            #region
            // 查询键值为id的数据
            //data1 data = MyDb.tb_data1.FirstOrDefault(x => x.key == id);
            //MyDb.tb_data1.Remove(data);
            //// 保存
            //if (MyDb.SaveChanges() > 0)
            //{
            //    MessageBox.Show("删除成功.");
            //}
            //else
            //{
            //    MessageBox.Show("删除失败.");
            //}
            #endregion

            // 第二种,使用MyDbContext类进行删除操作(正常情况下使用这种)
            using (MyDbContext db = new MyDbContext())
            {
                data1 d = db.tb_data1.FirstOrDefault(x => x.key == id);
                db.tb_data1.Remove(d);
                if (db.SaveChanges() > 0)
                {
                    MessageBox.Show("删除成功.");
                }
                else
                {
                    MessageBox.Show("删除失败.");
                }
                db.Dispose(); // 释放资源,可以不需要
            }
        }
        private void button删除多条_Click(object sender, EventArgs e)
        {
            // 第一种,使用MyDb进行删除操作
            // 查询所有text2的值等于textBox1.Text的数据
            //List<data1> data = MyDb.tb_data1.Where(x => x.text2 == textBox1.Text).ToList();
            // 删除所有text2的值等于textBox1.Text的数据
            //MyDb.tb_data1.RemoveRange(data);
            //// 保存
            //if (MyDb.SaveChanges() > 0)
            //{
            //    MessageBox.Show("批量删除成功.");
            //}
            //else
            //{
            //    MessageBox.Show("批量删除失败.");
            //}

            // 第二种,使用MyDbContext类进行删除操作(正常情况下使用这种)
            using (MyDbContext db = new MyDbContext())
            {
                // 删除所有text2的值等于textBox1.Text的数据
                db.tb_data1.RemoveRange(db.tb_data1.Where(x => x.text2 == textBox1.Text));
                if (db.SaveChanges() > 0)
                {
                    MessageBox.Show("批量删除成功.");
                }
                else
                {
                    MessageBox.Show("批量删除失败.");
                }
                db.Dispose(); // 释放资源,可以不需要
            }
        }
    }
}

MyDbContext.cs 代码如下

using Microsoft.EntityFrameworkCore;

namespace WindowsFormsApp.MySql
{
    /// <summary>
    /// 外部调用,操作数据库的接口
    /// </summary>
    public class MyDbContext : DbContext
    {
        #region 数据库表

        public DbSet<data1> tb_data1 { get; set; }
        public DbSet<data2> tb_data2 { get; set; }

        #endregion

        /// <summary>
        /// 链接到数据库回调
        /// </summary>
        /// <param name="optionsBuilder"></param>
        protected override void OnConfiguring(DbContextOptionsBuilder optionsBuilder)
        {
            // 链接信息
            string sql = @"Server=localhost; Port=3306; Database=test; User=root; Password=123456; CharSet=utf8; Allow User Variables=true;";
            optionsBuilder.UseMySQL(sql);
        }

        /// <summary>
        /// 数据模式回调
        /// </summary>
        /// <param name="modelBuilder"></param>
        protected override void OnModelCreating(ModelBuilder modelBuilder)
        {
            base.OnModelCreating(modelBuilder);

            // 如果需要将表中某个字段从数据库中排除,但又不想在代码中删除该字段,可以用如下方法
            // modelBuilder.Entity<表名>().Ignore(x => x.字段);
            //
            // 例如,将Tb_rdata表中text字段排除
            //modelBuilder.Entity<data1>().Ignore(x => x.text1);

            // 如果该表不存在键值,则可以采用如下方法
            // modelBuilder.Entity<表名>().HasNoKey();
            //
            // 例如:
            //modelBuilder.Entity<data1>().HasNoKey();
        }
    }
}


data1.cs 代码如下

using System.ComponentModel.DataAnnotations;

namespace mysql.MySql
{
    public class data1
    {
        /// <summary>
        /// 添加键值,默认名称是id,数据类型为int
        /// </summary>
        [Key]
        public int ids { get; set; }

        /// <summary>
        /// 文本数据
        /// </summary>
        public string text { get; set; }
    }
}


data2.cs 代码如下

namespace WindowsFormsApp.MySql
{
    public class data2
    {
        /// <summary>
        /// EF 默认名称为ID的变量为键值
        /// </summary>
        public int id { get; set; }

        /// <summary>
        /// 数据
        /// </summary>
        public string text { get; set; }
    }
}


还有一种不使用EF的链接方式:

string sql = @"SELECT * FROM tb_data1";
string constr = @"Server=localhost; Port=3306; Database=test; User=root; Password=JYZN_2331_agv; CharSet=utf8; Allow User Variables=true;";

// 连接到数据库
MySqlConnection sqlCon = new MySqlConnection(constr);
sqlCon.Open();

// 执行sql命令
MySqlCommand sqlCmd = new MySqlCommand(sql, sqlCon);
MySqlDataAdapter ad = new MySqlDataAdapter(sqlCmd);
DataSet ds = new DataSet();
ad.Fill(ds);
ds.Dispose();