操作ex_【自学C#】|| 笔记 40 Command:操作数据库
一、首先是再次总结一下数据库的创建和连接。
这里首先是下载SQL server数据库,并且在下载一个管理工具,以图形化的方式进行创建数据库,并且存储数据。
然后就是在VS中,在菜单栏中找到“工具”-》“连接到数据库”。
输入“服务器名”、“身份验证方式”、再选择数据表后进行连接。
然后就是通过“SqlConnection 类”进行数据库连接。
//编写数据库连接串string connStr = "Data source=.;Initial Catalog=test;User ID=sa;Password=pwdpwd";//创建SqlConnection的实例SqlConnection conn = null;try{ conn = new SqlConnection(connStr); //打开数据库连接 conn.Open(); MessageBox.Show("数据库连接成功!");}catch(Exception ex){ MessageBox.Show("数据库连接失败!" + ex.Message);}finally{ if (conn != null) { //关闭数据库连接 conn.Close(); }}
connStr = "Data source=.;Initial Catalog=test;User ID=sa;Password=pwdpwd";
server = 服务器名称 / 数据库的实例名 ;
Data Source:与第1种连接串写法中的 server 属性的写法一样,用于指定数据库所在的服务器名称和数据库实例名,如果连接的是本机的默认数据库实例,则写成“Data Source=. ”的形式。
uid = 登录名 ;
Initial Catalog:与第 1 种连接串写法中的 database 属性的写法一样,用于指定在 Data Source 中数据库实例下的数据库名。
pwd = 密码 ;
User ID:与第 1 种连接串写法中的 uid 属性的写法一样,用于指定登录数据库的用户名。
database = 数据库名称。
Password:与第 1 种连接串写法中的 pwd 属性的写法一样,用于指定 User ID 用户名所对应的密码。
也就是先确定“服务器的名字”,然后是“账号”和“密码”,最后是“数据库的名称”。
有了这四个参数,就能进入指定的数据库的名字。
二、Command:操作数据库
在 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() | 方法,执行对数据表的增加、删除、修改操作 |
使用 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( 存储过程名称 , 数据库连接类的实例 );
在这里,参数名与存储过程中定义的参数名要一致。
2) 执行对数据表的操作
在执行对数据表的操作时通常分为两种情况,一种是执行非查询 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.例
制作一个用户注册界面,使用 SqlCommand 类向用户信息表中添加一条记录。
根据题目要求,先在 SQL Server 创建用户信息表 userinfo,SQL 语句如下。
create table userinfo( id int identity(1,1) primary key, name varchar(20), password varchar(20))
总之,在管理中就是这个。
设置主键的方法,只要右键,弹出的菜单里选中就行。
具体步骤如下:
先进行一下布局,这里需要2个Label控件、2个TextBox控件、1个Button控件。
然后对“注册”按钮进行双击,生成单击事件。
并且使用 SqlCommand 类向表中添加数据的语句如下。
private void button1_Click(object sender, EventArgs e) { //编写数据库连接串 string connStr = "Data Source=.;Initial Catalog=text;User ID=sa;Password=123"; //创建 SqlConnection的实例 SqlConnection conn = null; try { conn = new SqlConnection(connStr); //打开数据库连接 conn.Open(); string sql = "insert into userinfo(name,password) values('{0}','{1}')"; //填充SQL语句 sql = string.Format(sql, textBox1.Text, textBox2.Text); //创建SqlCommand对象 SqlCommand cmd = new SqlCommand(sql, conn); //执行SQL语句 int returnvalue = cmd.ExecuteNonQuery(); //判断SQL语句是否执行成功 if (returnvalue != -1) { MessageBox.Show("注册成功!"); } } catch (Exception ex) { MessageBox.Show("注册失败!" + ex.Message); } finally { if (conn != null) { //关闭数据库连接 conn.Close(); } } }
分析:
首先是确定服务器名称、账号、密码、以及数据库名称。
然后打开数据库,conn.Open();
再编辑SQL server数据库输入语句,以字符串的方式存储。
这里注意到“单引号和双引号”
然后填充SQL语句。
也就是将表单的参数存放进去。依旧还是字符串类型。
创建SqlCommand对象,
new SqlCommand(sql, conn);
第一个参数是,数据库语句,添加一条数据的SQL语句。
第二个参数是,数据库的连接。
执行SQL语句
cmd.ExecuteNonQuery();
如果返回的是-1,就是什么也没有添加,也就是添加失败。
所以只要不是-1,就添加成功。
而没有添加成功会报错,所以也就使用catch 语句进行提示。
最后再通过finally语句来关闭数据库。
而这里会出现报错!是因为没有给id字段设置自增。
所以首先先将系统禁止的“表的再编辑”给取消。
找到下面的地方,取消“阻止保存要求重新创建表的更改”。
然后找到自己的表,并选中id的项
在下面中找到“标准规范”,默认是“否”,改成“是”就行了。
然后再vs中进行运行,就会发现成功了。
从上面的运行效果可以看出,通过 SqlCommand 对象已经将用户信息添加到数据表 userinfo 中。
下图是添加的内容。
2.例
制作一个登录界面,使用 SqlCommand 类判断用户是否登录成功。
根据题目要求,登录功能通过查询语句来实现,即将界面上输入的用户名和密码与数据表中存储的用户信息相比较,如果有与之匹配的用户信息则弹出消息框提示登录成功, 否则提示登录失败。
实现登录功能的界面如下图所示。
在登录界面中的“登录”按钮的单击事件中实现用户登录功能,并在“取消”按钮的单击事件中实现关闭登录窗体的功能。
using System;using System.Collections.Generic;using System.ComponentModel;using System.Data;using System.Data.SqlClient;using System.Drawing;using System.Linq;using System.Text;using System.Threading.Tasks;using System.Windows.Forms;namespace WindowsFormsApp12{ public partial class Form1 : Form { public Form1() { InitializeComponent(); } //登录按钮 private void button1_Click(object sender, EventArgs e) { //编写数据库连接串 string connStr = "Data Source=.;Initial Catalog=text;User ID=sa;Password=123"; //创建SQLConnection的实例 SqlConnection conn = null; try { conn = new SqlConnection(connStr); //打开数据库连接 conn.Open(); string sql = "Select count(*) from userinfo where name='{0}' and password='{1}'"; //填充SQL语句 sql = string.Format(sql, textBox1.Text, textBox2.Text); //创建SqlCommand对象 SqlCommand cmd = new SqlCommand(sql, conn); //执行SQL语句 int returnvalue = (int)cmd.ExecuteScalar(); //判断SQL语句是否执行成功 if (returnvalue != 0) { MessageBox.Show("登录成功!"); } else { MessageBox.Show("登录失败!"); } } catch (Exception ex) { MessageBox.Show("注册失败!" + ex.Message); } finally { if (conn != null) { //关闭数据库连接 conn.Close(); } } } private void button2_Click(object sender, EventArgs e) { this.Close(); } }}
分析:
主要是“登录”按钮和“取消”按钮的编辑。
基本上就是“登录”按钮,毕竟“取消”按钮就一个关闭窗体的操作。
21~62行
首先是编写数据库连接串,也是值得注意的地方。
因为我这里的数据库是text,不是test。密码是123,不是root,所以需要跟自己的设置要匹配。
然后依旧是打开数据库,然后进行sql语句的编辑,并执行。
而这里需要注意的是:sql语句不是之前的输入语句,而是搜索查找语句。
"Select count(*) from userinfo where name='{0}' and password='{1}'";
再通过(int)cmd.ExecuteScalar();这个来确定是否存在数据库的表格中,存在输入的内容。
如果不等于0,就证明存在,也就算登录成功。
而不存在,也就是失败。
为了避免报错,也就使用try语句将其包起来,catch语句报错。
finally语句关闭数据库。
从上面的运行效果可以看出,通过使用 SqlCommand 类中的 ExecuteScalar 方法即可判断是否存在界面中输入的用户名和密码。
3.例
改进用户注册功能,使用户在注册时用户名唯一。
(也就是1例中的那个注册功能,并且防止用户名重复。)
在上一实例的登录功能中有可能出现不同的人注册时的用户名和密码相同的情况,因此很难判断究竟是哪个用户登录。
在很多软件中,用户注册功能都会判断用户名是否唯一,或者直接使用邮箱或手机号作为登录名。
下面在实例 1 的注册功能中添加判断用户名是否唯一的功能,实现的代码如下。
private void button1_Click(object sender, EventArgs e) { //编写数据库连接串 string connStr = "Data Source=.;Initial Catalog=text;User ID=sa;Password=123"; //创建 SqlConnection的实例 SqlConnection conn = null; try { conn = new SqlConnection(connStr); //打开数据库连接 conn.Open(); //判断用户名是否重复 string checkNameSql = "select count(*) from userinfo where name='{0}'"; checkNameSql = string.Format(checkNameSql, textBox1.Text); //创建SqlCommand对象 SqlCommand cmdCheckName = new SqlCommand(checkNameSql, conn); //执行SQL语句 int isRepeatName = (int)cmdCheckName.ExecuteScalar(); if (isRepeatName != 0) { //用户名重复,则不执行注册操作 MessageBox.Show("用户名已存在!"); return; } string sql = "insert into userinfo(name,password) values('{0}','{1}')"; //填充SQL语句 sql = string.Format(sql, textBox1.Text, textBox2.Text); //创建SqlCommand对象 SqlCommand cmd = new SqlCommand(sql, conn); //执行SQL语句 int returnvalue = cmd.ExecuteNonQuery(); //判断SQL语句是否执行成功 if (returnvalue != -1) { MessageBox.Show("注册成功!"); } } catch (Exception ex) { MessageBox.Show("注册失败!" + ex.Message); } finally { if (conn != null) { //关闭数据库连接 conn.Close(); } } }
分析:
同样是编写数据库连接串,然后放进SqlConnection(connStr)中。
而在追加前,先进行一下输入的内容是否重复的判断。
也就是这个select count(*) from userinfo where name='{0}'。
查找已有的数据,如果重复,也就是不等于0,所以输出提示,并且用return语句结束运行。
如果不存在,就使用输入语句往里面输入。
也就是这个insert into userinfo(name,password) values('{0}','{1}')
运行结果:
从上面的运行效果可以看出,由于“11”用户在表中已经存在,所以在注册时会弹出“用户名已存在!”的提示。
4.例
创建一个存储过程实现用户注册功能,并使用 SqlCommand 类调用存储过程。
用户注册功能的存储过程比较简单,只需要写一个带参数的存储过程将用户名和密码传递给存储过程,并使用 insert 语句将用户名和密码添加到用户信息表中。
在存储过程中暂不考虑判断用户名是否重复。创建存储过程的语句如下。
create procedure AddUser(@name varchar(20), @password varchar(20))asbegininsert into userinfo (name, password) values (@name, @password);end
分析:
创建一个名叫AddUser的存储过程。
然后往userinfo表中存储。
如果使用管理工具进行创建的话,首先点击“新建查询”。
然后输入代码
在表下,找到这个就是存储过程。
可以理解成,以另一种方式往之前的[dbo].[userinfo]表单中存储。
编写“注册”按钮的代码
private void button1_Click(object sender, EventArgs e) { //编写数据库连接串 string connStr = "Data Source=.;Initial Catalog=text;User ID=sa;Password=123"; //创建 SqlConnection的实例 SqlConnection conn = null; try { conn = new SqlConnection(connStr); //打开数据库连接 conn.Open(); //创建SqlCommand对象 SqlCommand cmd = new SqlCommand("AddUser", conn); //设置SQLCommand对象的命令类型(CommandType)是存储过程 cmd.CommandType = CommandType.StoredProcedure; //设置存储过程需要的参数 cmd.Parameters.AddWithValue("name", textBox1.Text); cmd.Parameters.AddWithValue("password", textBox2.Text); //执行存储过程 int returnvalue = cmd.ExecuteNonQuery(); Console.WriteLine(returnvalue); //判断SQL语句是否执行成功 if (returnvalue != -1) { MessageBox.Show("注册成功!"); } } catch (Exception ex) { MessageBox.Show("注册失败!" + ex.Message); } finally { if (conn != null) { //关闭数据库连接 conn.Close(); } } }
分析:
首先依旧是编写编写数据库连接串。
然后打开数据库连接,并且创建SqlCommand对象。
再设置SQLCommand对象的命令类型(CommandType)是存储过程。
cmd.CommandType = CommandType.StoredProcedure;
这里通过下面的方式,设置存储过程需要的参数。
cmd.Parameters.AddWithValue("name", textBox1.Text);
通过下面的方式,进行执行操作。
cmd.ExecuteNonQuery();
再通过返回值进行判断是否存储成功。
最后就是关闭数据库。
运行结果:
然后再userinfo表中就可以看到了。
这里需要刷新才行,否则会看不到。
而从上面的代码可以看出,调用存储过程并不复杂,只需要在 SqlCommand 对象中将 CommandType 属性的值改成 StoredProcedure,并添加存储过程中所需要的参数即可。
操作ex_【自学C#】|| 笔记 40 Command:操作数据库相关推荐
- python解包操作_python基础篇笔记02 文件操作 序列解包**星号语法
文件的数据是存放于硬盘上的,因而只存在覆盖.不存在修改这么一说,我们平时看到的修改文件, 都是模拟出来的效果,具体的说有两种实现方式: 方式一:将硬盘存放的该文件的内容全部加载到内存,在内存中是可以修 ...
- tensorflow学习笔记——使用TensorFlow操作MNIST数据(1)
续集请点击我:tensorflow学习笔记--使用TensorFlow操作MNIST数据(2) 本节开始学习使用tensorflow教程,当然从最简单的MNIST开始.这怎么说呢,就好比编程入门有He ...
- Axure RP9 自学之路2-基础操作篇
关注头条@路飞写代码,获取更多内容 上期回顾 前一篇文章我们主要是介绍了软件的安装,以及学习该软件的一些初衷,以及对软件的一些区域功能进行了相应的说明. 主要知识点 添加元件.设置元件名称.位置尺寸. ...
- MySQL 笔记7 -- 权限操作与视图
MySQL 笔记7 – 权限操作与视图 MySQL 系列笔记是笔者学习.实践MySQL数据库的笔记 课程链接: MySQL 数据库基础入门教程 参考文档: MySQL 官方文档 SQL 教程 一.权限 ...
- Python-OpenCV 笔记4 -- 形态学操作(Morphological Operations)
Python-OpenCV 笔记4 – 形态学操作(Morphological Operations) 1.腐蚀(Erosion) # 函数原型 erode(src, kernel[, dst[, a ...
- jQuery学习笔记之DOM操作、事件绑定(2)
jQuery学习笔记之DOM操作.事件绑定(2) --------------------学习目录------------------------ 4.DOM操作 5.事件绑定 源码地址: https ...
- 【原】无脑操作:ElasticSearch学习笔记(01)
开篇来自于经典的"保安的哲学三问"(你是谁,在哪儿,要干嘛) 问题一.ElasticSearch是什么?有什么用处? 答:截至2018年12月28日,从ElasticSearch官 ...
- Teradata使用笔记(2)--数据库操作
资料来源:http://blog.csdn.net/thy822/article/details/49423765 数据库客户端:DbVisualizer 数据库用户:dbc 三 数据库操作 3.1 ...
- 将文件指针复位C语言,C语言学习笔记之 文件操作
文件操作 文件指针 操作系统通过 函数(API) 操作文件,而函数通过文件指针识别不同文件 函数 --> 文件指针 --> 文件 打开和关闭文件 fopen打开文件 #include FI ...
最新文章
- 不同版本浏览器前端标准兼容性对照表以及CORS解决跨域和CSRF安全问题解决方案
- 即学即用的 30 段 Python 非常实用的代码
- GIS数据里的4D数据
- reveal end of document
- python判断手机号码是否正确_Python实现随机生成手机号及正则验证手机号的方法...
- Spring Cloud Zuul--服务网关
- 35. Element title 属性
- 【java】 drool规则引擎背后的Rete算法
- 高通工具QXDM,QCAT和QPST
- 4位先行进位加法器_第4章 C语言基础以及流水灯的实现
- 《互联网周刊》:移动学习在路上
- 优秀网页设计:20个国外大学网站设计欣赏
- 画圆形头像的简单画法
- 公众号附件链接怎么放?
- 0基础学前端开发,CSS盒子模型居中方法
- uboot配置,编译,移植
- 三菱fx2n64mr说明书_FX2N-64MR-DS手册三菱可编程控制器FX2N-64MR-DS使用说明书 - 广州凌控...
- BINARY和VARBINARY类型的区别
- Java继承(什么是继承)
- [原创]硬盘主引导记录详解