Ado.net总结-Command(指挥官)

2023-11-16

Command

  1. 概述
    在 System.Data.SqlClient 命名空间下,对应的 Command 类为 SqlCommand,在创建 SqlCommand 实例前必须已经创建了与数据库的连接。
    SqlCommand 类中常用的构造方法如下表所示:
构造方法 说明
SqlCommand() 无参构造方法
SqlCommand(string commandText,SqlConnection conn) 带参的构造方法,第 1 个参数是要执行的 SQL 语句,第 2 个参数是数据库的连接对象

对数据库中对象的操作不仅包括对数据表的操作,还包括对数据库、视图、存储过程等数据库对象的操作,接下来主要介绍的是对数据表和存储过程的操作。
在对不同数据库对象进行操作时,SqlCommand 类提供了不同的属性和方法,常用的属性和方法如下表所示:

属性或方法 说明
CommandText 属性,Command 对象中要执行的 SQL 语句
Connection 属性,获取或设置数据库的连接对象
CommandType 属性,获取或设置命令类型
Parameters 属性,设置 Command 对象中 SQL 语句的参数
ExecuteReader() 方法,获取执行查询语句的结果
ExecuteScalar() 方法,返回查询结果中第 1 行第 1 列的值
ExecuteNonQuery() 方法,执行对数据表的增加、删除、修改操作,返回影响的行数
  1. 使用Command类操作数据库
    Command 类中提供了 3 种命令类型,分别是 Text、TableDirect 以及 StoredProcedure,默认情况下是 Text。
    所谓 Text 类型是指使用 SQL 语句的形式,包括增加、删除、修改以及查询的SQL语句。
    StoredProcedure 用于执行存储过程;TableDirect 仅在 OLE DB 驱动程序中有效。
    在使用 Command 类操作数据库时需要通过以下步骤完成。
  1. 创建SqlCommand类的实例
    创建 SqlCommand 类的实例分两种情况,一种是命令类型为 Text 的,一种是命令类型为 StoredProcedure 的。

命令类型为 Text

SqlCommand SqlCommand 类的实例名 = new SqlCommand( SQL 语句 , 数据库连接类的实例 );

其中:

  • SQL 语句:指该 SqlCommand 类的实例要执行的 SQL 语句。
  • 数据库连接类的实例:指使用 SqlConnection 类创建的实例,通常数据库连接类的实例处于打开的状态。

命令类型为 StoredProcedure

SqlCommand SqlCommand 类的实例名 = new SqlCommand( 存储过程名称 , 数据库连接类的实例 );

需要注意的是,存储过程必须是当前数据库实例中的存储过程,并且在调用带参数的存储过程时,还需要在 SqlCommand 类的实例中添加对应的存储过程参数。
为存储过程添加参数,需要使用 SqlCommand 类实例的 Parameters 属性来设置,具体的代码如下。

SqlCommand 类实例 .Parameters.Add( 参数名 , 参数值 );
  1. 执行对数据表的操作
    在执行对数据表的操作时通常分为两种情况,一种是执行非查询 SQL 语句的操作,即增加、修改、删除的操作,一种是执行查询 SQL 语句的操作。

执行非查询 SQL 语句的操作

在执行非查询 SQL 语句时并不需要返回表中的数据,直接使用 SqlCommand 类的 ExecuteNonQuery 方法即可,该方法的返回值是一个整数,用于返回 SqlCommand 类在执行 SQL 语句后,对表中数据影响的行数。
当该方法的返回值为 -1 时,代表 SQL 语句执行失败,当该方法的返回值为 0 时,代表 SQL 语句对当前数据表中的数据没有影响。
例如 要删除学号为 1100 的学生的信息,而表中不存在该学号的学生的信息,SQL语句可以正常执行,但对表中的影响行数是 0。
具体的代码如下:

SqlCommand 类的实例 .ExecuteNonQuery();

需要注意的是,如果执行的 SQL 语句在数据库中执行错误,则会产生异常,因此该部分需要进行异常处理。

执行查询语句的操作

在执行查询语句时通常需要返回查询结果,SqlCommand 类中提供的 ExecuteReader 方法在执行查询 SQL 语句后,会返回一个 SqlDataReader 类型的值,通过遍历 SqlDataReader 类中的结果即可得到返回值。
具体的代码如下:

SqlDataReader dr = SqlCommand 类的实例 .ExecuteReader();

此外,如果在执行查询语句后并不需要返回所有的查询结果,而仅需要返回一个值,例如查询表中的记录行数,这时可以使用 ExecuteScalar 方法。具体的代码如下:

int returnvalue = SqlCommand 类的实例 .ExecuteScalar();

下面通过实例来演示 SqlCommand 类的使用:

  1. 先创建数据库School,再创建表Student:
CREATE TABLE [dbo].[Student] (
    [Id]             INT          IDENTITY (1, 1) NOT NULL,
    [Name]           VARCHAR (30) NOT NULL,
    [Age]            INT          NULL,
    [EnrollmentDate] DATE         NULL,
    PRIMARY KEY CLUSTERED ([Id] ASC)
);

这里如果使用visual studio localdb时,插入中文会出现乱码,解决方法可以参考这篇文章:

https://blog.csdn.net/xingkongtianyuzhao/article/details/103944280

  1. 下面是使用SqlCmd执行插入命令的示例:

这里使用了参数化查询SqlParameter,防止了sql注入

private void btnAddStudent_Click(object sender, EventArgs e)
{
    string stuName = txtUserName.Text.Trim();
    int stuAge = int.Parse(txtAge.Text.Trim());
    DateTime stuEnrollMentDate = dtpEnrollmentDate.Value;
    string strConn = Properties.Settings.Default.SchoolConn;
    using (SqlConnection conn = new SqlConnection(strConn))
    {
        try
        {
            conn.Open();
            string strSql = "insert into student(name,age,enrollmentdate) values(@name,@age,@enrollmentdate);";
            SqlCommand cmd = new SqlCommand(strSql, conn);
            cmd.Parameters.AddWithValue("@name", stuName);
            cmd.Parameters.AddWithValue("@age", stuAge);
            cmd.Parameters.AddWithValue("@enrollmentdate", stuEnrollMentDate);
            int result = cmd.ExecuteNonQuery();
            if (result != -1)
            {
            MessageBox.Show("注册成功!");
            }
            else
            {
            MessageBox.Show("注册失败!");
            }
        }
        catch (Exception ex)
        {
        	MessageBox.Show(ex.Message);
        }

}
  1. 下面是使用SqlCmd执行查询命令的示例:
private void btnSearchStudent_Click(object sender, EventArgs e)
{
    string strName = txtStudentName.Text.Trim();
    string strConn = Properties.Settings.Default.SchoolConn;
    using (SqlConnection conn = new SqlConnection(strConn))
    {
        try
        {
            string strSql = "select * from student where name=@name";
            SqlCommand cmd = new SqlCommand(strSql, conn);
            cmd.Parameters.AddWithValue("@name", strName);
            conn.Open();
            var reader = cmd.ExecuteReader();
            //两种方式查询
            while (reader.Read())
            {

                MessageBox.Show("Id: " + reader.GetInt32(0).ToString());
                MessageBox.Show("姓名: " + reader.GetString(1).ToString());
                MessageBox.Show("年龄: " + reader.GetInt32(2).ToString());
                MessageBox.Show("入学日期: " + reader.GetDateTime(3).ToString("yyyy-MM-dd"));

                string result = "Id: " + reader[0] + "姓名:" + reader[1];
                MessageBox.Show(result);
            }
            reader.Close();
        }
        catch (Exception ex)
        {
            MessageBox.Show(ex.Message);
        }
    }

** 注意ExecuteScalar,ExecuteNoQuery,ExecuteReader的区别 **

  • ExecuteNonQuery():执行命令对象的SQL语句,返回一个int类型变量,如果SQL语句是对数据库的记录进行操作(如记录的增加、删除和更新),那么方法将返回操作所影响的记录条数。
  • ExecuteScalar():执行命令对象的SQL语句,如果SQL语句是SELECT查询,则仅仅返回查询结果集中的第1行第1列,而忽略其他的行 和列。该方法所返回的结果为object类型,在使用之前必须强制转换为所需的类型。如果SQL语句不是SELECT查询,则返回结果没有任何作用。
  • ExecuteReader():执行命令对象的SQL语句,在ADO.NET中,就是DataReader 对象的ExecuteReader()方法来进行数据的列出,并且我们用这个ExecuteReader()方法来显示数据是最快的一种方法,只可以一条一条向前读,不能返回。数据连接关闭,reader数据消失。

** 记忆:**

ExecuteNonQuery:Query是查询的意思,NonQuery就是不用于查询,所以ExecuteNonQuery 除了查询,可以执行增删改语句;
ExecuteScalar: Scalar是游标意思,可以想象成钓鱼的浮标,是用来钓数据的,一般用于查询,而且钓鱼一般一条一条掉,所以只返回第一行第一列的数据;
ExecuteReader: 阅读数据,想象成图书,从前往后翻页,但是它翻脸不认人,不能从后往前翻页,而且翻脸速度特别快(查询快);
Command要记住防止SQL注入,最好用参数化查询,就像钓鱼的鱼饵,不同的鱼得用专用鱼饵,投其所好,防止调上水母啥的,鱼饵要放在SqlParameter里面。
上一节把Command比喻为指挥官,指挥官得知道武器库的地址,所以初始化的时候要给他,SqlConnection;还有指挥命令,Command指挥战斗的两种形式(执行命令):嘴喊(Text),简单直接;录音(StoredProcedure):步骤太多,嘴喊类,录下来,按个按钮就播放,所以任命指挥官需要两个要素:执行命令的形式和数据库地址。你记住了吗???

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

Ado.net总结-Command(指挥官) 的相关文章

随机推荐

  • TCP 连接管理机制(一)——TCP三次握手详解 + 为什么要有三次握手

    TCP是面向连接的协议 在通信之前需要先建立连接 其本质就是打开一个socket文件 这个文件有自己的缓冲区 如果要发送数据 上层把数据拷贝到发送缓冲区 如果是接收数据 OS直接把来自网络的数据拷贝到接收缓冲区里 那么三次握手期间 Serv
  • youversion.com的圣经无法使用、无法连接、无法下载离线版本的解决方法

    最近 youversion com的圣经无法使用 无法连接 无法下载离线版本了 这是一部很好用的圣经软件 以前一直用着 后来ipad越狱重新安装的时候就不能连接了 后来无意间发现原来是这个网站被和谐了 至于GCD为什么这么做 以咱的智商尚不
  • 接口自动化测试须知

    一 做接口测试需要哪些技能 做接口测试 需要的技能 基本就是以下几点 业务流 了解系统及内部各个组件之间的业务逻辑交互 数据流 了解接口的I O input output 输入输出 协议 包括http协议 TCP IP协议族 http协议
  • CMD查杀端口的两种方式

    第一种 netstat ano windows r输入cmd并打开 输入netstat ano 记住对应的6052 输入杀掉端口 taskkill pid 6052 f 第二种 netstat aon findstr 8080 直接输入ne
  • Win10 + VS2017 + Ceres配置

    前言 Ceres是google出品的一款基于C 的开源非线性优化库 官方文档 Ceres官方文档地址 依赖库 Eigen 官网 glog github gflags github Ceres github 配置过程 1 Eigen Eige
  • Python3 爬虫 requests+BeautifulSoup4(BS4) 爬取小说网站数据

    刚学Python爬虫不久 迫不及待的找了一个网站练手 新笔趣阁 一个小说网站 前提准备 安装Python以及必要的模块 requests bs4 不了解requests和bs4的同学可以去官网看个大概之后再回来看教程 爬虫思路 刚开始写爬虫
  • GPT专业应用:快速生成职位描述(JD)

    正文共 814 字 阅读大约需要 3 分钟 人力资源必备技巧 您将在3分钟后获得以下超能力 快速生成职位描述 Beezy评级 B级 经过简单的寻找 大部分人能立刻掌握 主要节省时间 推荐人 Kim 编辑者 Linda 图片由 Lexica
  • 数据中台与传统大数据平台有什么区别?_光点科技

    一 数据中台 数据中台是聚合和治理跨域数据 将数据抽象封装成服务 提供给前台以业务价值的逻辑概念 数据中台是在平台概念上的升级 不再单纯的将功能进行大杂烩 理念上 中台有几个特点 第一 更强调数据集中存储 统一管理 提供标准化的服务 第二
  • 【毕业设计】基于springboot + vue微信小程序商城

    目录 前言 创新点 亮点 毕设目录 一 视频展示 二 系统介绍 三 项目地址 四 运行环境 五 设计模块 前台 后台 六 系统功能模块结构图 数据库设计 七 准备阶段 使用真实支付 使用模拟支付 八 使用说明 九 登录后台 十 后台页面展示
  • 前端常用工具库方法整理

    欢迎点击领取 前端面试题进阶指南 前端登顶之巅 最全面的前端知识点梳理总结 前言 在闲余的时间整理一份我们可能用到的前端工具库方法 依赖库 名称 cropperjs 图片裁剪 exif js lrz 图片旋转问题 html2canvas d
  • React性能优化(完整版)

    我的博客 http wangxince site my demo markdown React 性能优化 1 减少 render 次数 shouldComponentUpdate PureComponent shouldComponentU
  • 计算机学习三宗罪——计算机达人成长之路(3)(转载自朱云翔老师笔记)

    以计算机学习不可浮躁 只有用心学习 深挖知识 才能基础扎实 才可以深入理解计算机专业知识 从而达到 他强由他强 清风拂山岗 他横由他横 明月照大江 的境界 万变不离其宗 编程程序具有三重境界 同样以VCD播放器为例 第一重境界就如同上面的同
  • 【译】用 `Wasmer` 进行插件开发 1

    译 用 Wasmer 进行插件开发 1 Using Wasmer for Plugins Part 1 译文 原文链接 https wiredforge com blog wasmer plugin pt 1 index html 原文 G
  • 05-BTC-网络

    目录 前言 比特币网络的工作原理 比特币网络 比特币网络中的每一个节点维护一个零度节点的集合 比特币系统中 每个节点要维护一个等待上链的交易的集合 比特币网络的传播属于best effort 前言 学习肖臻老师的 区块链技术与应用 公开课笔
  • vue-element-admin+flask实现数据查询项目

    本文分享一个使用vue element admin flask实现的一个数据查询项目 填写数据库连接信息和查询语句 即可展示查询到的数据 前提 已下载vue element admin并编译成功 前端 1 添加路由 src router i
  • 【Windows共享文件】Java读取Windows环境共享文件夹

    Java读取Windows环境共享文件夹 支持Win10 Win11等版本 1 JCIFS介绍 JCIFS是使用纯Java开发的一个开源框架 通过smb协议访问远程文件夹 该框架同时支持Windows共享文件夹和Linux共享文件夹 不过
  • Java漫谈(二)

    类名 Java编译器的设计与java源代码的语法结构是相辅相成的 先有语法 再有编译器 大家都知道 java是以类为单位进行组织的 类是java对世界的抽象描述 Java程序的运行其实就是多个类之间的相互调用 表现在源码上 java的语法规
  • 【动手学深度学习】关于数据预处理——2.2.5练习 2023.7.12

    创建包含更多行和列的原始数据集 import torch import os os makedirs os path join data exist ok True data file os path join data nba data
  • R-Modeling(step 4)

    I Regression OLSregression Description Function simple linear regression lm Y X1 data polynomial regression lm Y X1 I X
  • Ado.net总结-Command(指挥官)

    Command 概述 在 System Data SqlClient 命名空间下 对应的 Command 类为 SqlCommand 在创建 SqlCommand 实例前必须已经创建了与数据库的连接 SqlCommand 类中常用的构造方法