ADO.NET | 使用Command对象操作数据库

C#语言基础 同时被 2 个专栏收录
31 篇文章 16 订阅
5 篇文章 0 订阅


零、友情链接


一、常用属性及说明

在使用connection对象链接到数据库之后,就可以使用Command对象对数据库进行增删改查了,操作实现的方式使用的是SQL语句。Command对象可以分为四个不同的执行命令对象,分别是:SqlCommandOledeCommandOdbcCommdOracleCommand,这几个对象的常用的属性以及方法几乎相同,但是最配套asp.net使用的是SqlCommand,下面是SqlCommand对象常用属性以及说明:

属性说明
CommandType获取或设置SqlCommand对象要执行命令的类型
CommandText获取或设置要对数据源执行的SQL语句、存储过程或表名
CommandTimeOut获取或设置在终止对执行命令的尝试并生成错误之前的等待时间
Connection获取或设置SqlCommand对象所使用的Connection对象的名称
Parameters获取SqlCommand对象需要使用的参数集合

常用方法:

方法说明
ExecuteNonQuery对连接执行的SQL语句并返回受执行的行数
ExecuteReader对连接执行SQL语句并返回保持连接的数据读取器对象SqlDataReader
ExecuteScalar执行查询,并返回查询结果集中的第1行的第1列的值

二、查询数据指令

通过查询语句或调用存储过程将数据库中的数据检索出来,通过指定的接收方法来得到这些数据。

查询的结果可能是一行一列,也可能是多行多列

例子:查询数据库中的数据

先来看一下效果,这个图片是从数据库中读取出来然后利用Response.write写在页面上的:
在这里插入图片描述
ok,开始写代码,首先打开安装好的SQL Server 2014 Management Studio,连接好之后,点击新建查询,输入以下SQL语句,创建一个表:

Create Database School
go
use School
go
create table Student
(
	ID int primary key identity(1,1),
	Name varchar(60),
	Sex char(2),
	Age int,
	Class varchar(60)
)

写完这些之后,表就创建好了,接着手动输入一些数据:
在这里插入图片描述
然后打开VS,创建一个WEB窗体,再新建一个Default.aspx作为首页,打开Default.aspx,cs开始写代码:

首先引用需要使用的命名空间:

using System.Data;
using System.Data.SqlClient;
using System.Data.Text;

页面加载Load方法

protected void Page_Load(object sender, EventArgs e)
{
	string Result = GetSqlData();
    Response.Write(Result);
}

定义GetSqlData方法,实现SqlCommand对象执行SQL查询命令并返回数据:

private string GetSqlData()
{
    StringBuilder res = new StringBuilder();
    res.Append("<table>");           //手动创建表格列表并将字符串追加到StringBuilder类
    //定义表格头部
    res.Append("<tr><th>序号</th><th>姓名</th><th>性别</th><th>年龄</th><th>班级</th></tr>");
    //使用using指令创建SqlConnection对象
    using(SqlConnection conn = new SqlConnection("Server=DESKTOP-9FCSCD4;DataBase=School;Trusted_Connection=SSPI"))
    {
        conn.Open();
        SqlCommand comm = new SqlCommand();     //实例化一个执行数据库操作的命令类
        comm.CommandType = CommandType.Text;   //指定要执行数据库操作的的命令是SQL语句
        comm.CommandText = "select * from Student";         //要查询的SQL语句
        comm.Connection = conn;     //指定需要的数据库连接类
        //执行数据库查询并返回SqlDataReader类型数据接收器
        using(SqlDataReader DataReader = comm.ExecuteReader())
        {
            //使用数据接收器执行数据行的循环读取
            while (DataReader.Read())
            {
                int ID = (int)DataReader["ID"];
                string Name = (string)DataReader["Name"];
                string Sex = (string)DataReader["Sex"];
                int Age = (int)DataReader["Age"];
                string Class = (string)DataReader["Class"];
                //开始连接
                res.Append("<tr><td>" + ID + "</td>");
                res.Append("<td>" + Name + "</td>");
                res.Append("<td>" + Sex + "</td>");
                res.Append("<td>" + Age + "</td>");
                res.Append("<td>" + Class + "</td></tr>");
            }
        }
        conn.Dispose();     //数据库释放
    }
    res.Append("</table>");
    return res.ToString();
}

在以上代码中,利用了StringBuilderAppend方法,在定义的串中,加入了HTML元素,直接在页面中生成表格,在打开页面之后,检查一下页面元素:
在这里插入图片描述
可以很清楚的看到,StringBuilder已经帮我们写入表格的元素了。,最后用CSS代码对表格进行一下美化:

<style type="text/css">
    /*设置表格、表头、单元格的边框及颜色和样式*/
    table,table th,table td{
        border:1px;
        border-style:solid;
        border-color:#22bbad;
    }
    /*重写表头的边框颜色*/
    table th{
        border-color:white;
    }
    /*将表格中的边框合并*/
    table{
        border-collapse:collapse;
    }
    /*设置表头的大小及颜色*/
    table th{
        width:150px;
        height:30px;
        text-align:center;
        background-color:#22bbad;
        color:white;
    }
    /*设置单元格的高度与文本位置*/
    table td{
        height:30px;
        text-align:center;
    }
</style>

大功告成!!!

暂时不要删除这个代码!这个代码贯穿整个博客!!


三、添加数据指令

同样使用SqlCommand对象进行添加,添加记录不需要考虑选择用哪种方式接收。

使用ExecuteNonQuery方法执行插入数据时,所接收的结果也是被影响的行数。

下面是执行插入的语句:

comm.CommandText = "insert into Student([Name],[Sex],[Age],[Class]) values('" + Name + "','" + Sex + "','" + Age + "','" + Class +"')";

例子:基于上一个例子,进行添加数据操作

首先用表单设计好呈现在网页上的添加效果:

<form id="form1" runat="server">
    <div>
    </div>
    <div>
        <br /><hr />
        <table class="addtab" align="center">
            <tr><td width="60">姓名:</td>
                <td>
                    <asp:TextBox ID="Txt_Name" runat="server"></asp:TextBox></td>
            </tr>
            <tr><td>性别:</td>
                <td>
                    <asp:DropDownList ID="DDL_Sex" runat="server">
                        <asp:ListItem Text="男" Value="男"></asp:ListItem>
                        <asp:ListItem Text="女" Value="女"></asp:ListItem>
                    </asp:DropDownList>
                </td>
            </tr>
            <tr><td>年龄:</td>
                <td><asp:TextBox ID="Txt_Age" runat="server"></asp:TextBox></td>
            </tr>
            <tr><td>班级</td>
                <td>
                    <asp:TextBox ID="Txt_Class" runat="server"></asp:TextBox></td>
            </tr>
            <tr><td colspan="2">
                <asp:Button ID="Btn_Add" runat="server" Text="添加" OnClick="Btn_Add_Click" /></td></tr>
        </table>
    </div>
</form>

设计出来是这样的:
在这里插入图片描述
紧接着,给添加Button按钮加一个Click事件:

protected void Btn_Add_Click(object sender, EventArgs e)
{
    string Name = this.Txt_Name.Text.ToString().Trim();
    string Sex = this.DDL_Sex.SelectedValue;
    string Age = this.Txt_Age.Text.ToString().Trim();
    string Class = this.Txt_Class.Text.ToString().Trim();
    //这里为什么使用using,因为使用using可以自动释放新建的对象
    using(SqlConnection conn = new SqlConnection("Server=DESKTOP-9FCSCD4;DataBase=School;Trusted_Connection=SSPI"))
    {
        conn.Open();
        SqlCommand comm = new SqlCommand();     //实例化执行数据库操作的命令类
        comm.CommandType = CommandType.Text;    //指定发送到数据库的执行命令为Sql语句
        //定义插入数据库的SQL语句
        comm.CommandText = "insert into Student([Name],[Sex],[Age],[Class]) values ('" + Name + "','" + Sex + "','" + Age + "','" + Class + "')";
        comm.Connection = conn;     //指定SqlCommand类所需要的数据库连接类
        int AddRows = comm.ExecuteNonQuery();
        conn.Dispose();
        if (AddRows > 0)
        {
            Response.Redirect("Default.aspx");
        }
    }
}

注意:sql语句中后面的 values 每项需要加单引号 '

看一下效果:

在这里插入图片描述
这时候添加数据已经能成功,但是在实际运行的时候会产生多余的数据读取过程,并且在单击添加按钮时发生了页面回发,所以需要添加IsPostBack来验证回发:

if (!IsPostBack)
{
	string Result = GetSqlData();
	Response.Write(Result);
}

四、修改数据指令

修改数据指令的实现方式与插入数据相同,但编写的SQL语句不同,同样,修改成功后SqlCommand将会得到所影响的行数。

例子:实现数据的修改

先简单说一下这个例子的思路:

在原来的表单后面新增一个编辑列,点击这个编辑就会重定向到一个新建的EditData.aspx页面,并且传送一个ID参数。新建的EditData页面只包含修改的内容,为了让之前表单里面的内容显示到新页的控件上,在EditData.aspx.cs中定义一个GetData方法绑定值,紧接着修改完控件上的值了再添加到数据库中,重定向到最开始的页面。

Default.aspx.cs页面增加编辑单列:

res.Append("<tr><th>序号</th><th>姓名</th><th>性别</th><th>年龄</th><th>班级</th><th>操作</th></tr>");
……省略,大部分和上面的相似
res.Append("<td><a href=\"EditData.aspx?ID=" + ID + "\">编辑</a></td></tr>");

EditData.aspx页面新建一个像添加选项一样的表单,只是多了一个HiddenField隐藏域存储传过来的ID

/*这句话在EditData.aspx 的 < / table>之下*/
<asp:HiddenField ID="EditID" runat="server" />

EditData.aspx.csGetData方法:

private void GetData(string ID)
{
    using(SqlConnection conn = new SqlConnection("Server=DESKTOP-9FCSCD4;DataBase=School;Trusted_Connection=SSPI"))
    {
        conn.Open();
        SqlCommand comm = new SqlCommand();
        comm.CommandType = CommandType.Text;
        //定义查询语句
        comm.CommandText = "select Name,Sex,Age,Class from Student where ID=" + ID;
        comm.Connection = conn;
        using(SqlDataReader datareader = comm.ExecuteReader())
        {
            datareader.Read();
            string Name = (string)datareader["Name"];
            int Age = (int)datareader["Age"];
            string Class = (string)datareader["Class"];
            string Sex = (string)datareader["Sex"];
            //绑定到控件上
            this.Txt_Name.Text = Name;
            this.Txt_Age.Text = Age.ToString();
            this.Txt_Class.Text = Class;
            foreach(ListItem item in this.DDL_Sex.Items)
            {
                if (item.Value == Sex)
                {
                    item.Selected = true;
                    break;
                }
            }
        }
        comm.Dispose();
    }
}

EditData.aspx.cs中按钮的点击方法:

protected void Btn_Edit_Click(object sender, EventArgs e)
{
    string ID = this.EditID.Value;
    string Name = this.Txt_Name.Text.Trim();
    string Age = this.Txt_Age.Text.Trim();
    string Sex = this.DDL_Sex.SelectedValue;
    string Class = this.Txt_Class.Text.Trim();
    using(SqlConnection conn = new SqlConnection("Server=DESKTOP-9FCSCD4;DataBase=School;Trusted_Connection=SSPI"))
    {
        conn.Open();
        SqlCommand comm = new SqlCommand();
        comm.CommandType = CommandType.Text;
        comm.CommandText = "update Student set Name='" + Name + "',Sex='" + Sex + "',Age='" + Age + "',Class='" + Class + "' where ID=" + ID;
        comm.Connection = conn;
        int AddRows = comm.ExecuteNonQuery();
        if (AddRows > 0)
        {
            Response.Redirect("Default.aspx");
        }
    }
}

另外,在EditData.aspx.csPage_Load方法中,判断一下是否回发,并且把传过来的ID赋值给隐藏域,最后执行GetData方法。

protected void Page_Load(object sender, EventArgs e)
{
    if (!IsPostBack)
    {
        string ID = Request.QueryString["ID"];
        //将值绑定到隐藏域控件上
        this.EditID.Value = ID;
        GetData(ID);
    }
}

大功告成,效果如下:
在这里插入图片描述

五、删除数据指令

删除数据与前面的实现过程相同,编写一条删除SQL语句即可通过SqlCommand对象进行删除操作,当数据删除成功后同样会接收到所影响的行数。

例子:删除操作

同样的,在原有表单后面增加一个列名字是删除操作,只要点击这个删除就转向一个新页,删除完之后再重定向到起始页。

新页DeleteData.aspx.csPage_Load 代码:

string ID = Request.QueryString["ID"];
DelData(ID);

DeletData.aspx.cs中的DelData方法:

private void DelData(string ID)
{
    using(SqlConnection conn = new SqlConnection("Server=DESKTOP-9FCSCD4;DataBase=School;Trusted_Connection=SSPI"))
    {
        conn.Open();
        SqlCommand comm = new SqlCommand();
        comm.CommandType = CommandType.Text;
        comm.CommandText = "delete Student where ID=" + ID;
        comm.Connection = conn;
        int DelCount = comm.ExecuteNonQuery();
        if (DelCount > 0)
        {
            Response.Redirect("Default.aspx");
        }
        comm.Dispose();
    }
}

完成!

整个最后的效果展示

在这里插入图片描述

  • 6
    点赞
  • 0
    评论
  • 5
    收藏
  • 一键三连
    一键三连
  • 扫一扫,分享海报

©️2021 CSDN 皮肤主题: 黑客帝国 设计师:白松林 返回首页
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值