C# DataSet和DataTable:将查询结果保存到DataSet或DataTable中

2023-11-14

在执行对表中数据的查询时还能将数据保存到 DataSet 中,但需要借助 DataAdapter 类来实现。

在实际应用中,DataAdapter 与 DataSet 是在查询操作中使用最多的类。

此外,还可以通过 DataSet 实现对表中数据的增加、修改、删除操作。

DataAdapter 与 DataSet 类简介

DataAdapter 类用于将数据表中的数据查询出来并添加到 DataSet 中,DataAdapter 在 System.Data.SqlClient 命名空间下对应的类名是 SqlDataAdapter。SqlDataAdapter 类的主要构造方法如下表所示。

构造方法 说明
SqlDataAdapter(SqlCommand cmd) 带参数的构造方法,传递 SqlCommand 类的对象作为参数
SqlDataAdapter(string sql, SqlConnection conn) 带参数的构造方法,sql 参数是指定对数据表执行的 SQL 语句,conn 是数据库的连接对象
SqlDataAdapter() 不带参数的构造方法


从 SqlDataAdapter 类的构造方法可以看出,SqlDataAdapter 类需要与 SqlCommand 类和 SqlConnection 类一起使用。

SqlDataAdapter 类常用的属性和方法如下表所示。

属性或方法 说明
SelectCommand 属性,设置 SqlDataAdapter 中要执行的查询语句
InsertCommand 属性,设置 SqlDataAdapter 中要执行的添加语句
UpdateCommand 属性,设置 SqlDataAdapter 中要执行的修改语句
DeleteCommand 属性,设置 SqlDataAdapter 中要执行的删除语句
Fill(DataSet ds) 方法,将 SqlDataAdapter 类中查询出的结果填充到 DataSet 对象中
Fill(DataTable dt) 方法,将 SqlDataAdapter 类中查询出的结果填充到 DataTable 对象 中,DataTable是数据表对象,在一个DataSet对象中由多个 DataTable对象构成
Update(DataSet ds) 方法,更新 DataSet 对象中的数据
Update(DataTable dt) 方法,更新 DataTable 对象中的数据

DataSet 类是一种与数据库结构类似的数据集,每个 DataSet 都是由若干个数据表构成的,DataTable 即数据表,每个 DataTable 也都是由行和列构成的,行使用 DataRow 类表示、列使用 DataColumn 类表示。

此外,用户还可以通过 DataRelation 类设置数据表之间的关系。

下面介绍 DataSet 类以及 DataTable 类的使用。

(1) 、DataSet 类

DataSet 类中的构造方法如下表所示。

构造方法 说明
DataSet() 无参构造方法
DataSet(string DataSetName) 带参数的构造方法,DataSetName 参数用于指定数据集名称

DataSet 类中常用的属性和方法如下表所示。

属性或方法 说明
Tables 属性,获取 DataSet 中所有数据表的集合,Tables[0] 代表集合中的第一个数据表
CaseSensitive 属性,获取或设置 DataSet 中的字符串是否区分大小写
Relations 属性,获取 DataSet 中包含的关系集合
Clear() 方法,清空 DataSet 中的数据
Copy() 方法,复制 DataSet 中的数据
AcceptChanges() 方法,更新 DataSet 中的数据
HasChanges() 方法,获取 DataSet 中是否有数据发生变化
RejectChanges() 方法,撤销对 DataSet 中数据的更改

(2) 、DataTable

DataTable 作为 DataSet 中的重要对象,其与数据表的定义是类似的,都是由行和列构成,并有唯一的表名。从 SqlDataAdapter 类的填充方法 (Fill) 中可以看出允许将数据直接填充到 DataTable 中,这样既能节省存储空间也能简化查找数据表中的数据。

DataTable 中常用的构造方法如下表所示。

构造方法 说明
DataTable()  无参构造方法
DataTable(string TableName) 带参数的构造方法, TableName 参数用于指定数据表的名称

DataTable 与 DataSet 有很多相似的属性和方法,在下表中列出了一些与 DataSet 类不同的属性。

属性 说明
TableName 属性,获取或设置 DataTable 的名称
Columns 属性,获取 DataTable 中列的集合
Rows 属性,获取 DataTable 中行的集合
DataSet 属性,获取 DataTable 所在的 DataSet
Constraints 属性,获取 DataTable 中的所有约束

使用 DataSet 和 DataTable 类存放查询结果

在实际应用中,将查询结果存储到 DataSet 类或 DataTable 类中均可,在操作查询结果时也非常类似。下面分别通过实例来演示 DataSet 和 DataTable 的使用。

【实例】创建 Windows 应用程序,查询用户信息表(userinfo)中的所有用户名,并将用户名显示在列表控件(ListBox)中。

根据题目要求,设置用户信息查询界面如下图所示。

单击“查询全部用户名”按钮,将所有用户名显示到 ListBox 控件中,首先使用 DataSet 对象存储查询结果,代码如下。

//“查询全部用户”按钮的单击事件
private void button1_Click(object sender, EventArgs e)
{
    //编写数据库连接串
    string connStr = "server=localhost;port=3306;user Id=root;password=winelec68331; database=timing ;Allow User Variables=True"; //连接字符串
    //创建 SQLConnection 的实例
    SqlConnection conn = null;
    try
    {
        conn = new SqlConnection(connStr);
        //打开数据库连接
        conn.Open();
        string sql = "select * from table1";
        //创建 SQLDataAdapter 类的对象
        SqlDataAdapter sda = new SqlDataAdapter(sql, conn);
        //创建DataSet类的对象
        DataSet ds = new DataSet();
        //使用SQLDataAdapter对象sda将查询结果填充到Dataset对象ds中
        sda.Fill(ds);
        //设置ListBox控件的数据源(DataSource)属性
        listBox1.DataSource = ds.Tables[0];
        //在listBox控件中显示name列的值
        listBox1.DisplayMember = ds.Tables[0].Columns[0].ToString();
    }
    catch(Exception ex)
    {
        MessageBox.Show("查询失败!" + ex.Message);
    }
    finally
    {
        if (conn != null)
        {
            //关闭数据库连接
            conn.Close();
        }
    }
}

运行该窗体,效果如下图所示。

从上面的运行效果可以看出,已经将用户信息表 (userinfo) 中的所有用户名显示在列表控件 (ListBox) 中。
需要注意的是,ListBox 控件中的 DataSource 属性用于设置控件中内容的数据源,并需要通过 DisplayMember 属性来指定显示在 ListBox 控件中的内容。

 

在本实例中将 DataSet 对象换成 DataTable 对象,更改部分代码如下。

        private void button1_Click(object sender, EventArgs e)
        {
            string conStr = "server=localhost;port=3306;user Id=root;password=winelec68331; database=timing ;Allow User Variables=True"; //连接字符串
            MySqlConnection conn = null;

            try
            {
                conn = new MySqlConnection(conStr);
                conn.Open();
                string sql = "select * from table1";
                MySqlDataAdapter sda = new MySqlDataAdapter(sql, conn);
                DataTable dt = new DataTable();
                //使用 SqlDataAdapter 对象 sda 将查询结果填充到 DataSet 对象 dt 中
                sda.Fill(dt);
                conn.Close();
                listBox1.DataSource = dt;
                listBox1.DisplayMember = dt.Columns[0].ToString();
            }
            catch (Exception ex)
            {
                MessageBox.Show("查询失败!" + ex.Message);
            }
            finally
            {
                if (conn != null)
                {
                    //关闭数据库连接
                    conn.Close();
                }
            }
        }
    }

}

运行该窗体,效果如下图所示。

http://m.biancheng.net/view/3026.html

 

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

C# DataSet和DataTable:将查询结果保存到DataSet或DataTable中 的相关文章

  • 是否可以使用 http url 作为 DirectShow .Net 中源过滤器的源位置?

    我正在使用 DirectShow Net 库创建一个过滤器图 该过滤器图通过使用 http 地址和 WM Asf Writer 来流式传输视频 然后 在网页上 我可以使用对象元素在 Windows Media Player 对象中呈现视频源
  • C#.Net 邮件将进入垃圾邮件文件夹

    我正在从 ASP net Web 应用程序发送电子邮件 邮件发送成功 没有失败 但大多数都进入了垃圾邮件文件夹 请帮助我克服垃圾邮件过滤器 我的发送邮件代码 public void SendMail string FromAddress s
  • 在 C++ 代码中转换字符串

    我正在学习 C 并开发一个项目来练习 但现在我想在代码中转换一个变量 字符串 就像这样 用户有一个包含 C 代码的文件 但我希望我的程序读取该文件并插入将其写入代码中 如下所示 include
  • Selenium - C# - Webdriver - 无法找到元素

    在 C 中使用 selenium 我试图打开浏览器 导航到 Google 并找到文本搜索字段 我尝试下面的 IWebDriver driver new InternetExplorerDriver C driver Navigate GoT
  • 如何修复错误:“检测到无法访问的代码”

    我有以下代码 private string GetAnswer private int CountLeapYears DateTime startDate return count String answer GetAnswer Respo
  • 如何向 Mono.ZeroConf 注册服务?

    我正在尝试测试 ZeroConf 示例http www mono project com Mono Zeroconf http www mono project com Mono Zeroconf 我正在运行 OpenSuse 11 和 M
  • 为什么这个 makefile 在“make clean”上执行目标

    这是我当前的 makefile CXX g CXXFLAGS Wall O3 LDFLAGS TARGET testcpp SRCS main cpp object cpp foo cpp OBJS SRCS cpp o DEPS SRCS
  • if constexpr 中的 not-constexpr 变量 – clang 与 GCC

    struct A constexpr operator bool const return true int main auto f auto v if constexpr v A a f a clang 6 接受该代码 GCC 8 拒绝它
  • Libev,如何将参数传递给相关回调

    我陷入了 libev 中争论的境地 通常 libev 在类似的函数中接收包 接收回调 没关系 但是实际操作中 我们需要派遣一个亲戚 写回调 根据收到的包裹处理具体工作 例如 S RECV MSG pstRecvMsg S RECV MSG
  • Linux 上的 RTLD_LOCAL 和dynamic_cast

    我们有一个由应用程序中的一些共享库构成的插件 我们需要在应用程序运行时更新它 出于性能原因 我们在卸载旧插件之前加载并开始使用新插件 并且只有当所有线程都使用旧插件完成后 我们才卸载它 由于新插件和旧插件的库具有相同的符号 我们dlopen
  • 保证复制省略是否适用于函数参数?

    如果我理解正确的话 从 C 17 开始 这段代码现在要求不进行任何复制 Foo myfunc void return Foo auto foo myfunc no copy 函数参数也是如此吗 下面的代码中的副本会被优化掉吗 Foo myf
  • 如何在 Javascript 中连接 C# ActiveX 事件处理程序

    我尝试使用几个代码片段将 ActiveX 对象与 Javascript 事件处理程序挂钩 我无法确定为什么事件处理程序没有被调用 带有项目的 Github 存储库 https github com JesseKPhillips Csharp
  • 如何防止 Blazor NavLink 组件的默认导航

    从 Blazor 3 1 Preview 2 开始 应该可以防止默认导航行为 https devblogs microsoft com aspnet asp net core updates in net core 3 1 preview
  • SQLAPI++ 的免费替代品? [关闭]

    Closed 这个问题正在寻求书籍 工具 软件库等的推荐 不满足堆栈溢出指南 help closed questions 目前不接受答案 是否有任何免费 也许是开源 的替代品SQLAPI http www sqlapi com 这个库看起来
  • 读取依赖步行者输出

    I am having some problems using one of the Dlls in my application and I ran dependency walker on it i am not sure how to
  • Xamarin Forms Binding - 访问父属性

    我无法访问页面的 ViewModel 属性以便将其绑定到 IsVisible 属性 如果我不设置 BindingContext 我只能绑定它 有没有办法可以在设置 BindingContext 的同时访问页面的 viewmodel root
  • 构建 C# MVC 5 站点时项目之间的处理器架构不匹配

    我收到的错误如下 2017 年 4 月 20 日构建 13 23 38 C Windows Microsoft NET Framework v4 0 30319 Microsoft Common targets 1605 5 警告 MSB3
  • Streamwriter 覆盖 txt 文件中的文本

    有没有什么方法可以重新打开流写入器而不创建新的写入对象 因为此时 当调用 WriteOdd 时 streamwriter 正在覆盖在它之前调用的 WriteEven public void WriteEven StreamWriter wr
  • winform c# 中的弹出窗口

    我正在开发一个需要弹出窗口的项目 但问题是我还希望能够通过表单设计器在此弹出窗口中添加文本框等 所以基本上我有一个按钮 当您单击它时 它将打开我在表单设计器中设计的另一个窗口 我一直在谷歌搜索 但还没有找到我需要的东西 所以我希望你们能帮助
  • 如何在 ASP.NET Core 中注入泛型的依赖关系

    我有以下存储库类 public class TestRepository Repository

随机推荐

  • C++11智能指针之unique_ptr

    1 智能指针概念 智能指针是基于RAII机制实现的类 模板 具有指针的行为 重载了operator 与operator gt 操作符 可以 智能 地销毁其所指对象 C 11中有unique ptr shared ptr与weak ptr等智
  • 英语 动词过去式和过去分词的变化规则

    动词过去式和过去分词有规则变化和不规则变化两种 实例顺序 动词原形过去式过去分词 发音 ed在清辅音音素后发音为 t 在浊辅音后发音为 d 在元音后发音也为 d 在 t d 后发音为 id 一 规则变化 1 一般在动词原形后加 ed loo
  • 嵌套查询及其与join的区别

    嵌套即可以写在select子句中 也可以写在from子句中 下面以SQL Entity为例来说明 1 嵌套在select中 以父表为主在select中嵌套子表信息 SELECT c Title ANYELEMENT SELECT oa Fi
  • mysql联合索引最左匹配原则的底层实现原理

    mysql联合索引最左匹配原则的底层实现原理 要看懂 需要熟悉mysql b tree的数据结构 b tree的叶节点和叶子节点的排序特性是按照 从小到大 从左到右的这么一个规则 int直接比大小 uuid比较ASCII码 联合索引的排序规
  • 极简式 Unity 获取 bilibili 直播弹幕、SC、上舰、礼物等 插件

    极简式 Unity 获取 bilibili 直播弹幕 SC 上舰 礼物等 1 声明 下载链接 软件均仅用于学习交流 请勿用于任何商业用途 2 介绍 该项目为Unity实时爬取B站直播弹幕 项目介绍 通过传入B站直播间账号 实现监控B站直播弹
  • java threadlocal 详解_Java中的ThreadLocal深入理解详解

    提到 ThreadLocal是什么 ThreadLocal是一个关于创建线程局部变量的类 通常情况下 我们创建的变量是可以被任何一个线程访问并修改的 而使用ThreadLocal创建的变量只能被当前线程访问 其他线程则无法访问和修改 Glo
  • sha256的python实现

    在 Python 中可以使用 hashlib 库来实现 SHA 256 哈希算法 代码如下 import hashlib defsha256 data sha256 hashlib sha256 sha256 update data enc
  • 为什么printf只能用_cdecl调用约定

    1 什么是调用约定 调用约定 Calling conventions 和type representations 名称修饰 name mangling 同是应用二进制接口 application binary interface ABI 概
  • 分析rocketmq-client产生大量rocketmq_client.log日志文件的原因处理方案

    源码 public static final String CLIENT LOG USESLF4J rocketmq client logUseSlf4j public static final String CLIENT LOG ROOT
  • 05 两层神经网络 - 神经网络和深度学习 [Deep Learning Specialization系列]

    本文是Deep Learning Specialization系列课程的第1课 Neural Networks and Deep Learning 中Shallow Neural Network部分的学习笔记 在前面的章节中 我们以逻辑回归
  • Yolov5改进之更改损失函数(EIOU、SIOU)

    目录 1 修改metrics py文件 2 修改loss py函数 1 修改metrics py文件 找到bbox iou代码段 def bbox iou box1 box2 xywh True GIoU False DIoU False
  • 测试用例----测试大纲法

    一 应用场合 在一个程序中涉及多个窗口 每个窗口有多个操作 窗口和窗口之间有一定的联系 或者说操作之间的联系 为了弄清它们之间的联系 使用测试大纲法 二 使用测试大纲法分析程序 1 列大纲 提纲 分析需求 列出所有的窗口以及每个窗口包含的操
  • MQTT 固定报头 中 剩余长度字段的计算

    剩余长度 简介 位置 固定报头中 从第2个字节开始 剩余长度等于可变报头的长度 10字节 加上有效载荷的长度 剩余长度 Remaining Length 表示当前报文剩余部分的字节数 包括可变报头和负载的数据 剩余长度不包括用于编码剩余长度
  • 什么是区块链----概念

    前言 从2016年年初开始 区块链这个概念越来越热越来越火 有人说他可以颠覆金融行业 也有人觉得这就是个噱头 这个2016火起来的技术其实早在2008年 比特币的诞生就基于区块链 技术火归火 落地的应用却没有那么多 周围的朋友同学都听说过这
  • 搭建Serv-U FTP服务器共享文件外网远程访问「无公网IP」

    文章目录 1 前言 2 本地FTP搭建 2 1 Serv U下载和安装 2 2 Serv U共享网页测试 2 3 Cpolar下载和安装 3 本地FTP发布 3 1 Cpolar云端设置 3 2 Cpolar本地设置 4 公网访问测试 5
  • linux系统通过docker安装oracle远程访问(附带相关问题解决方案)

    文章目录 一 虚拟机网络配置 二 安装docker 三 拉取oracle镜像并配置 四 设置oracle支持外部连接访问 重难点 总结 一 虚拟机网络配置 虚拟机配置的方案 1 桥接模式 虚拟机和主机共用同一个网段 适用于固定网络的开发环境
  • auto refresh

    div user div
  • TCP为什么需要三次握手进行连接,二次或四次不可以吗?

    一 三次握手的作用 为了确认双方具有接收和发送的能力 二 三次握手的原因 1 可以阻止重复历史连接的初始化 主要原因 2 可以同步双方的初始序列号 3 可以避免资源的浪费 三 分析原因 1 为了防止旧的重复连接初始化造成混乱 当客户端发送了
  • 嵌入式软件中如何排查bug?

    明确Bug现象 要准确描述Bug出现的场景 现象 能复现就最好 查看日志信息 嵌入式系统日志可以帮助定位问题 看是否有报错 异常信息 用仿真工具调试 许多嵌入式芯片都有相应的仿真调试工具 可以在仿真环境下单步跟踪 查看变量值等 加打印调试
  • C# DataSet和DataTable:将查询结果保存到DataSet或DataTable中

    在执行对表中数据的查询时还能将数据保存到 DataSet 中 但需要借助 DataAdapter 类来实现 在实际应用中 DataAdapter 与 DataSet 是在查询操作中使用最多的类 此外 还可以通过 DataSet 实现对表中数