十五 C# 操作数据库(SqlServer技术)

1、Sql Server 基本操作

1.1Sql Server安装默认新建四个系统数据库

Sql Server安装默认新建四个系统数据库

 - Master数据库:Master数据库是Sql Server中最终要的数据库它记录Sql Server实例的所有系统及信息。包括实例范围的元数据、端点、链接服务器和系统配置设置
 - Tempdb数据库:tempdb是一个临时数据库,用于保存临时对象或中间结果集
 - Model数据库:用作SQLServer实例上创建的所有数据库的模板。对Model数据库进行的修改(如数据库大小、排序规则、恢复模式和其他数据库选项)将应用于以后创建的所有数据库
 - msdb库:用于SQL Server代理计划警报和作业

十五 C# 操作数据库(SqlServer技术)_第1张图片

1.2 数据库常用对象

  • 1、表:表是包含数据库中所有数据的数据库对象,由行和列组成,用于组织和存储数据。
  • 2、字段:表中每列称为一个字段,字段具有自己的属性,如字段类型、字段大小等。其中,字段类型时字段最重要的属性,它决定了字段能够存储哪种数据。SQL规范支持5中基本字段类型:字符型、文字性、数值型、逻辑性和日期/时间型。
  • 3、索引:索引是一个单独的、五路的数据结构。它是依赖于表建立的,在数据库中索引使数据库程序无需对整个表进行扫描就可以在其中找到所需的数据。
  • 4、视图:是是从一张或多张表中导出的表(也称为虚拟表),使用户查看数据表中数据的一种方式。表中包含几个被定义的数据列与数据行,其结构和数据建立在对表的查询基础上。
  • 5、存储过程:存储过程(Stroed Procedure)是一组为了完成特定功能的SQL语句几个(包括查询、插入、删除和更新等操作),经编译后一名称的的形式存储在SQL Server服务器端的数据库中。由用户通过指定存储过程的名字来执行。当这个存储过程被调用执行时,这些操作也会同时执行。
  • 6、主键:就是数据行的唯一标识。不会重复的列才能当主键。一个表可以没有主键,单会非常难以处理,因此没有特殊理由表都要设定主键。
    • 主键有两种选用策略:业务主键和逻辑主键
    • 业务主键使用有业务意义的字段做主键,比如设分正好,银行卡号等;
    • 逻辑主键是使用没有任何意义的字段做主键。因为很难保证业务主键不会重复(身份证号重复)不会编号(账号升为)因此推荐逻辑主键

1.3 创建与删除数据库

十五 C# 操作数据库(SqlServer技术)_第2张图片

十五 C# 操作数据库(SqlServer技术)_第3张图片

1.4 创建与删除数据表

十五 C# 操作数据库(SqlServer技术)_第4张图片

十五 C# 操作数据库(SqlServer技术)_第5张图片
十五 C# 操作数据库(SqlServer技术)_第6张图片

设为主键

十五 C# 操作数据库(SqlServer技术)_第7张图片
十五 C# 操作数据库(SqlServer技术)_第8张图片

1.5 数据库文件和文件组

  • 数据库由文件和文件组组成,所有数据和对象(如表,存储过程)都被存储在文件中。数据库文件存放位置:右击数据库——属性
    十五 C# 操作数据库(SqlServer技术)_第9张图片
    十五 C# 操作数据库(SqlServer技术)_第10张图片

  • 文件分为三种类型:

    • 主要数据文件*.mdf:每个数据库有且只有一个主数据文件,存放数据和数据库初始化信息

    • 次要数据文件*.ndf: 可以没有也可以有多个次要数据库文件
      十五 C# 操作数据库(SqlServer技术)_第11张图片

    • 事务日志文件*。ldf:用于存放恢复数据库的所有日志信息

1.6 char与Varchar区别

Varchar(size):保存可变长度的字符串(可包含字母、数字及特殊字符)在括号中指定字符串的最大长度。对多255个字符。注释:如果值的长度大于255,则被转换为Text类型。
char(10):标识固定长度为10个字符,如果不足,就以空格填充
varchar(10):标识长度最大为10的可变字符,不足不填充。(var——variable可变)

1.7 nvarchar与varchar区别

存储方式:navarchar——字符存储, varchar字节存储
存储量:varchar比较节省控件,因为存储大小为字节的世界长度,而nvarchar是双字节存储。
使用:如果存储内容都是英文字符而没有孩子等其他语言符号,建议使用varchar;含有汉字的使用nvarchar,因为nvarchar是使用Unicode变慢,既同一的字符编码标准,会较少乱码的出现几率;(如果你做的项目可能设计不同语言之间的转换,建议用nvarchar)

2 简单SQL语句的应用

十五 C# 操作数据库(SqlServer技术)_第12张图片

新建表时,必须存放相应的数据才能新建表
十五 C# 操作数据库(SqlServer技术)_第13张图片

--SQL语句注释以(--)开头
--SQL创建数据库
create database mydarlydb001
create database mydarly002
--删除数据库
drop database mydarlydb001
--创建数据表(创建表示,必须同时创建字段)
create table darlytable
(
id int, --字段
name nvarchar(5),
pwd nvarchar(20)
)
--删除表
drop table darlytable

--在指定的数据库中创建表(默认将表创建在master数据库中,master是主表,sql默认进入主数据库)
--需要在特定数据库中创建表,首先要切换到相应数据库中
use mydarly002  --切换
create table darlytable --切换后再次新建表,就会在切换到的数据库下建表
(
id int, --字段
name nvarchar(5),
pwd nvarchar(20)
)
--指定主键
create table darlytable002
(
id int identity(1,1) primary key,
name nvarchar(5),
pwd nvarchar(20)
)
--创建数据表并插入数据
create table darlytable003
(
id int identity(1,1) primary key,
name nvarchar(5),
gender nvarchar(1),
age int,
jointime date,
department nvarchar(8)
)
--向表中添加对应的数据
insert darlytable003 
(name,gender,age,jointime,department)
values('张三','男',20,'2022-02-20','研发部')
insert darlytable003 
(name,gender,age,jointime,department)
values('李四','女',19,'2022-02-20','测试部')
--更改表中数据
update darlytable003 set department='销售部' where name='李四'
update darlytable003 set name='王五' where id=3
--更给表中数据,不添加where则是更改表中所有对应字段
update darlytable003 set jointime='1990-12-01'

--查询语句select 
--查询表中全部数据
select * from darlytable003
select * from darlytable003 where age>=20
select * from darlytable003 where gender='男'

create table darly004
(
u_id int,
name nvarchar(5),
username nvarchar(10)
)
insert darly004(u_id,name,username)values(1,'张三','zhsan908')
insert darly004(u_id,name,username)values(2,'王五','wangwu902')
insert darly004(u_id,name,username)values(3,'李四','lisi901')
--简化联合查询
select * from darly004,darlytable003 where darlytable003.id=darly004.u_id

--删除记录
delete darlytable003 where gender='男'

--清除所有内容
delete darlytable003

3、错误处理

3.1保存表报错

十五 C# 操作数据库(SqlServer技术)_第14张图片
解决方法

十五 C# 操作数据库(SqlServer技术)_第15张图片
十五 C# 操作数据库(SqlServer技术)_第16张图片

3.2 Windows防火墙阻止了远程调试

当调试数据库里的存储过程时提示”Windows防火墙当前阻止了远程调试”.
十五 C# 操作数据库(SqlServer技术)_第17张图片
解决方案:Windows防火墙阻止了远程调试
也可以直接选择第三项——确定然后执行sql语句

3.3 操作数类型冲突: int 与 date 不兼容

十五 C# 操作数据库(SqlServer技术)_第18张图片

3.4 将截断字符串或二进制数据。

十五 C# 操作数据库(SqlServer技术)_第19张图片

4、ADO.NET简介

十五 C# 操作数据库(SqlServer技术)_第20张图片
十五 C# 操作数据库(SqlServer技术)_第21张图片

  • ADO.net的名称起源于ADO(ActiveX date Objects) 是一个COM组件库,也就是一个通用矿建类库,该类库将跨越所有存在WindowsApi函数。简单来说,他是在.NET编程环境中使用的数据访问接口
  • ADO.NET是与C#和.NET Framework一起使用的类集名称,用于以关系型的,面向表的格式访问数据
  • ADO.NET被集成到.NET Framework中,可用于任何.net语言,尤其是C#
  • ADO.NET技术五大对象
    • Connection: 链接
    • Command:命令
    • DataReader:
    • DataAdapter:数据适配器
    • DataSet:数据集
  • ADO.NET有两部分组成:
  • 数据提供程序(provider):它能和数据库保持链接并且执行SQL命令,操作数据集
  • 数据集(DataSet):能与数据库在断开链接的情况下进行数据操作。
    十五 C# 操作数据库(SqlServer技术)_第22张图片
  • 数据库比作水源,存储了大量的水(数据);
  • Connection好比深入水中的进水龙头,保持与水的解除,只有它与水进行了“链接”其他对象才可以抽水
  • Command则向抽水机,为抽水提供懂了和执行方法,通过“水龙头”,然后把水返给上面的水管。
  • DataAdapter、DataReader就想输水管,担任这水的传输任务,并起着桥梁作用。
  • DataAdapter象一个睡熟iguana,通过发动机,把水从水源输送到水库进行保存
  • DataReader也是一种输水管,起着同样的作用。和DataAdapter不同的是,DataReader不把水送到水库中,而是单向第直接把水送到需要水的用户哪里,所以要比在水库中转一下速度更快
  • DataSet则是一个大水库,把抽上来的水按一定关系的池子进行存放。即使撤掉“抽水装置”(断开链接,离线状态)也可以保持“水”的存在。这也正是ADO.NET的核心
  • DataTable则向水库中每个独立的水池子,分别存放不同种类的水。一个大水库有一个或多个这样的水池子组成。
    十五 C# 操作数据库(SqlServer技术)_第23张图片

5、Connectiong 链接和关闭数据库

为了方位数据库,就要提供数据库连接类,在C#中,是通过Connection类来实现的。它有四种类型的链接方式

  • SQLConnection
  • ADOConnection
  • OracleConnection
  • ODBCConnection

5.1连接设置

十五 C# 操作数据库(SqlServer技术)_第24张图片
十五 C# 操作数据库(SqlServer技术)_第25张图片

十五 C# 操作数据库(SqlServer技术)_第26张图片

5.2创建连接

创建连接SQL Server数据库的字符一般有两种

 - 一种以SQL验证登录
 - 另一种是以Windows身份验证
  • 步骤
    • 引用命名空间System.Data.SqlClient
    • 创建连接方法声明至字符串中
    • 创建Connection对象
    • 调用方法

5.3 关闭数据库

 - 为了节省系统资源,提高系统性能,最好使用完数据库后就要关闭连接。
 - 在C#语言由于GC(垃圾回收机制——garbage collection)的存在,会在未来某个时刻释放资源,它是非决定性的,并不能确定这个过程在什么时候发生当顽疾关闭数据时,可通过USING语句确保对象在退出时,立即被释放,从而达到关闭数据库的作用。
 - using语句不仅大提高了性能,而且还达到关闭数据库的功能。还有一种通过try。。。catch 。。。。finally语句控制链接数据库的关闭来提高性能
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Data.SqlClient;

namespace 链接和关闭数据库
{
    class Program
    {
        static void Main(string[] args)
        {
            //数据库(SQL Sever)的连接方式分为两种:SQL Server验证 windows身份验证
            // 1、windows身份验证登录并打开数据 Server
            string constr = "Server=.; integrated security=SSPI; Initial Catalog=csharpzx";
            //server=可以写计算机名称 ip地址、Localhost或.都可以
            //integrated security=SSPI; 安全声明
            //Intitial Catalog=csharpzx 初始化数据库
            SqlConnection mysqlCon = new SqlConnection(constr);
            mysqlCon.Open();
            Console.WriteLine("第一种方式成功打开数据库");


            //直接关闭数据库,但此种方式可能不是关闭数据库的最佳时间(后续有可能还会用到数据库,)
            mysqlCon.Close();
            Console.WriteLine("第一种方式打开的数据库被关闭");
            Console.ReadKey();

            //SQL验证登录
            string constr2 = "Server=.; user=sa;pwd=darly;database=csharpzx";
            SqlConnection mysqlCon2 = new SqlConnection(constr2);
            //mysqlCon2.Open();

            //Console.WriteLine("第二种方式成功打开数据库");
            //通过using语句实现数据库关闭
            using (mysqlCon2)  //使用完数据库后自动关闭数据库
            {
                mysqlCon2.Open();
                Console.WriteLine("第二种方式成功打开数据库");
            }
            //通过try。。。catch。。finally。。。实现数据库的实时关闭
            try
            {
                mysqlCon2.Open();
                Console.WriteLine("try catch finally 打开关闭数据库");
            }
            catch (Exception)
            {

                throw;
            }
            finally
            {
                mysqlCon2.Close();
                Console.WriteLine("数据库成功关闭");
            }
            //using与try...Catch finally
            try
            {
                using (mysqlCon2)
                {
                    mysqlCon2.Open();
                    Console.WriteLine("using与try...Catch finally打开数据库成功");

                }
            }
            catch (Exception)
            {

                throw;
            }
            finally
            {
                mysqlCon2.Close();
            }
            Console.ReadKey();


        }
    }
}

6、Command操作数据

6.1 Command常用属性

 - CommandText:要下大值数据源的命令
 - CommandTimeout:出错时等待时间
using System;
using System.Data.SqlClient;
namespace Command操作数句
{
    class Program
    {
        static void Main(string[] args)
        {
            string myconstr = "Server=.; user=sa; pwd=darly; database=csharpzx";
            SqlConnection myCon = new SqlConnection(myconstr);
            try
            {
                myCon.Open();
                string sql = "select * from mytable";
                SqlCommand mycom = new SqlCommand(sql, myCon);        //创建Command对象,第一个参数就是sql语句,第二个对象是Connection对象
                mycom.CommandTimeout = 2;  //设置的时间(2秒)内没有链接成功,则判定失败
                Console.WriteLine("创建对象成功");
            }
            catch (Exception ex)
            {
                Console.WriteLine(ex.ToString());
            }
            finally
            {
                myCon.Close();
            }
            Console.ReadKey();
            
        }
    }
}

6.2 Command三种方法

  • ExecuteNonQuery()不返回任何值,一般应用于insert update delecte语句中
  • ExecuteScalar()返回一个值,一般用于值返回一个值的语句,如求数据统计的count,最大数Max语句,求最小数Min语句
  • ExecuteReader() 返回一个IDataReader,可用于迭代返回记录
using System;
using System.Data.SqlClient;
namespace Command操作数句
{
    class Program
    {
        static void Main(string[] args)
        {
            string myconstr = "Server=.; user=sa; pwd=darly; database=csharpzx";
            SqlConnection myCon = new SqlConnection(myconstr);
            try
            {
                //创建Command对象过程
                //myCon.Open();
                //string sql = "select * from mytable";
                //SqlCommand mycom = new SqlCommand(sql, myCon);        //创建Command对象,第一个参数就是sql语句,第二个对象是Connection对象
                //mycom.CommandTimeout = 2;  //设置的时间(2秒)内没有链接成功,则判定失败
                //Console.WriteLine("创建对象成功");

                //更改数据,ExecuteNonQuery()
                //myCon.Open();
                string sql2 = "insert mytalbe(id,name,gender,age,department)Values('7','小六子','男','6','天才部') ";
                //string sql2 = "insert mytable(id,name,gender,age,department)Values(8,'店小二','男',6,'餐饮部') ";
                //SqlCommand mycom2 = new SqlCommand(sql2, myCon);
                //mycom2.ExecuteNonQuery();
                //Console.WriteLine("完成插入");

                //ExecuteScalar
                myCon.Open();
                string sql = "select max(age) from mytable";
                SqlCommand myCom = new SqlCommand(sql, myCon);
                int t = 0;
                t = (int)myCom.ExecuteScalar();
                Console.WriteLine("年龄最大的是"+t+"岁");

            }
            catch (Exception ex)
            {
                Console.WriteLine(ex.Message.ToString());
            }
            finally
            {
                myCon.Close();
            }
            Console.ReadKey();
            
        }
    }
}

6.2.1DataReader

  • DataReader对象提供了用顺序的、只读的方式读取Command对象的数据结果集。正是因为DaaReader是以DataReader是以顺序的方式连续读取数据,所以DataReader会以独占的方式打开数据库链接。
  • 由于DataReader只执行读操作,并且每次只在内存缓冲区里存储结果集中的一条数据,所以使用DataREader对象的效率比较高,如果要查询大量数据,同时不需要随机访问和修改数据,DataReader是有限的选择。
  • DataReader属性
    • FieldCount:标识记录中有多少字段
    • HasRows:用来标识DataREader是否包含数据
    • IsClosed:标识DataReader是否关闭
      实例:判断表中是否有数据(通过查询表中返回DataRedaer对象,经HasRows属性判断表中是否有数据)
using System;
using System.Data.SqlClient;

namespace DAtaReader
{
    class Program
    {
        static void Main(string[] args)
        {
            string constr = "server=.;user=sa;pwd=darly;database=csharpzx";
            SqlConnection mycon = new SqlConnection(constr);
            try
            {
                mycon.Open();
                string sql = "select * from mytable";
                SqlCommand mycom = new SqlCommand(sql, mycon);
                //声明dataReader对象
                SqlDataReader mydr = mycom.ExecuteReader();
                if (mydr.HasRows)               //判断表中是否有数据 hasRows为true表示表中有数据,false为无数据
                {
                    Console.WriteLine("表中存在数据");
                }
                else
                {
                    Console.WriteLine("表中不存在任何数据");
                }
                Console.WriteLine(mydr.FieldCount);   //检查表中共有几个字段
                Console.WriteLine(mydr.IsClosed);     //输出数据库是否开启,true为打开状态,false为关闭状态
                
                mydr.Close();
                Console.WriteLine(mydr.IsClosed);
                
            }
            catch (Exception ex)
            {

                Console.WriteLine(ex.Message.ToString());
            }
            finally
            {
                mycon.Close();
                
            }
            Console.ReadKey();
        }
    }
}

  • DataReader常用方法
  • close:将DataReader对象关闭
  • GetDataRypeName取得指定字段的数据形态
  • GetName方法:区指定字段的字段名成
  • GetOrdinal: 取得指定字段名称在记录中的顺序
  • GetValue:取得指定字段的数据
  • GetValues:取得全部字段的数据
  • Read:读取下一条记录
using System;
using System.Data.SqlClient;

namespace DAtaReader
{
    class Program
    {
        static void Main(string[] args)
        {
            string constr = "server=.;user=sa;pwd=darly;database=csharpzx";
            SqlConnection mycon = new SqlConnection(constr);
            try
            {
                mycon.Open();
                //string sql = "select * from mytable";
                //SqlCommand mycom = new SqlCommand(sql, mycon);
                声明dataReader对象
                //SqlDataReader mydr = mycom.ExecuteReader();
                //if (mydr.HasRows)               //判断表中是否有数据 hasRows为true表示表中有数据,false为无数据
                //{
                //    Console.WriteLine("表中存在数据");
                //}
                //else
                //{
                //    Console.WriteLine("表中不存在任何数据");
                //}
                //Console.WriteLine("表中共有"+mydr.FieldCount+"字段");   //检查表中共有几个字段
                //Console.WriteLine("第四列字段的类型:"+mydr.GetDataTypeName(3));  //获取指定列的名称类型,
                //Console.WriteLine("第三列字段名称:"+mydr.GetName(2));          //获取指定字段的字段名称
                //string mystr1 = "age";
                //Console.WriteLine("字段age处于第"+(mydr.GetOrdinal(mystr1)+1)+"列");    //获取指定字段名称在记录中的顺序
                //Console.WriteLine(mydr.GetOrdinal("age")+1);

                GetValue
                //string sql2 = "select * from mytable where id=2";
                //SqlCommand mycom2 = new SqlCommand(sql2, mycon);
                //SqlDataReader mydr2 = mycom2.ExecuteReader();
                //if(mydr2.Read())  //首先判断是否读取到数据,否则直接用GetValue无法获取到值
                //    Console.WriteLine(mydr2.GetValue(1));  //通过sql语句查询到了一条记录是一个一维数组

                //GetValues
                string sql3 = "select * from mytable";
                SqlCommand mycom3 = new SqlCommand(sql3, mycon);
                SqlDataReader mydr3 = mycom3.ExecuteReader();                
                object[] myobj = new object[mydr3.FieldCount];

                //while (mydr3.Read())
                //{
                //    mydr3.GetValues(myobj);
                //    foreach (object outobect in myobj) Console.Write(outobect + "\t");
                //    Console.WriteLine(mydr3.Read());
                //}

                //Read()
                Console.WriteLine("Read读取下一条数据,循环一次后,read自动移到下一条");
                while (mydr3.Read())                    
                {
                    Console.Write(mydr3[0].ToString()+",");
                    Console.Write(mydr3[1].ToString() + ",");
                    Console.Write(mydr3["gender"].ToString() + ",");    //访问DataReader对象时,使用索引比使用字段访问速度要快
                    Console.WriteLine();
                }
               


                //IsClosed
                Console.WriteLine(mydr3.IsClosed);     //输出数据库是否开启,true为打开状态,false为关闭状态
                mycon.Close();
                Console.WriteLine(mydr3.IsClosed);
            }
            catch (Exception ex)
            {

                Console.WriteLine(ex.Message.ToString());
            }
            finally
            {
                mycon.Close();
                
            }
            Console.ReadKey();
        }
    }
}

7、DataSet数据集

  • ADO.NET数据访问技术的一个突出特点就是支持离线访问,而实现这种离线访问技术的核心就是DataSet对象,该对象通过将数据主流在内存来实现离线访问。
  • DataSet对象由一组DataTable对象组成,这些对象与DataRelation对象互相关联。这些Data Table对象又包含Rows(行)集合、Columns(列)集合,Rows集合是由多个DataRow对象组成,Columns集合是由多个DataColumns对象组成
  • 步骤:
    • 引入命名空间System.Data
    • 创建DataSet对象
    • 创建DataTable对象
    • 将DataTable对象加入DataSet对象中。
    • 定义列,并向DAtaTable中添加已经定义好的列
    • 插入行数据
    • 进行相关操作
using System;
using System.Data;

namespace DataSet数据集
{
    class Program
    {
        static void Main(string[] args)
        {
            DataSet mydataset = new DataSet("数据集练习");    //参数为自定义的数据集名称
            DataTable mytable = new DataTable("mytable001"); // 参数为自定义DataTable名称
            mydataset.Tables.Add(mytable);                   // 将DataTable添加到DataSet中
            DataColumn mycol1 = new DataColumn("id", Type.GetType("System.INt32"));   //第一个参数为字段名称,第二个参数为字段类型(通过获取系统中数据类型设置)
            DataColumn mycol2 = new DataColumn("name", Type.GetType("System.String"));
            DataColumn mycol3 = new DataColumn("department", Type.GetType("System.String"));
            DataColumn mycol4 = new DataColumn("gender", Type.GetType("System.Char"));
            DataColumn mycol5 = new DataColumn("age", Type.GetType("System.Int32"));
            mytable.Columns.Add(mycol1);
            mytable.Columns.Add(mycol2);
            mytable.Columns.Add(mycol3);
            mytable.Columns.Add(mycol4);
            mytable.Columns.Add(mycol5);
            string[,] mydata = { { "张三", "测试部", "男", "18" }, { "李四", "公关部", "女", "18" }, { "王五", "研发部", "男", "28" } };
            for (int i = 0; i < mydata.Length/4; i++)
            {
                DataRow myRow = mytable.NewRow();   //声明一个新行
                //向新行中添加数据
                myRow[0] = i;
                myRow["name"] = mydata[i, 0];       //行中添加数据用字段名或索引值都可以
                myRow[2] = mydata[i, 1];
                myRow[3] = mydata[i, 2];
                myRow["age"] = mydata[i, 3];
                mytable.Rows.Add(myRow);              //将行添加到表中
            }
            mydataset.AcceptChanges();              //数据集接受更改,相当于将修改数据保存

           
        }
    }
}

  • 方法
    • clear:移除表中所有行来清除任何数据的DataSet(清空数据集中所有数据)
    • Clone:复制该DataSet的机构,但不复制数据
    • Copy:复制DataSet的结构和数据
    • Dispose: 释放DataSet对象
    • Equals:确定两个DataSet对象是否仙童
    • Merge: 将指定的DataSet DataTable或DataRow对象的数组合并到当前的DAtaSet或DataTAble中
    • Reset:将DataSet重置为初始化状态
using System;
using System.Data;

namespace DataSet数据集
{
    class Program
    {
        static void Main(string[] args)
        {
            DataSet mydataset = new DataSet("数据集练习");    //参数为自定义的数据集名称
            DataTable mytable = new DataTable("mytable001"); // 参数为自定义DataTable名称
            mydataset.Tables.Add(mytable);                   // 将DataTable添加到DataSet中
            DataColumn mycol1 = new DataColumn("id", Type.GetType("System.Int32"));   //第一个参数为字段名称,第二个参数为字段类型(通过获取系统中数据类型设置)
            DataColumn mycol2 = new DataColumn("name", Type.GetType("System.String"));
            DataColumn mycol3 = new DataColumn("department", Type.GetType("System.String"));
            DataColumn mycol4 = new DataColumn("gender", Type.GetType("System.Char"));
            DataColumn mycol5 = new DataColumn("age", Type.GetType("System.Int32"));
            mytable.Columns.Add(mycol1);
            mytable.Columns.Add(mycol2);
            mytable.Columns.Add(mycol3);
            mytable.Columns.Add(mycol4);
            mytable.Columns.Add(mycol5);
            string[,] mydata = { { "张三", "测试部", "男", "18" }, { "李四", "公关部", "女", "18" }, { "王五", "研发部", "男", "28" } };
            for (int i = 0; i < mydata.Length/4; i++)
            {
                DataRow myRow = mytable.NewRow();   //声明一个新行
                //向新行中添加数据
                myRow[0] = i+1;
                myRow["name"] = mydata[i, 0];       //行中添加数据用字段名或索引值都可以
                myRow[2] = mydata[i, 1];
                myRow[3] = mydata[i, 2];
                myRow["age"] = mydata[i, 3];
                mytable.Rows.Add(myRow);              //将行添加到表中
            }
            mydataset.AcceptChanges();              //数据集接受更改,相当于将修改数据保存
            Console.WriteLine("更改前的数据");
            outValues(mydataset);

            //clon及Merge
            DataTable mydt002 = mytable.Clone();
            DataRow mydataRow2 = mydt002.NewRow();
            mydt002.Rows.Add(new object[] { 5, "赵六", "研发部", "男", "38" });
            mydt002.Rows.Add(new object[] { 6, "王二", "研发部", "男", "38" });
            mydataset.Merge(mydt002);    //将mydt002及其架构合并到数据集中
            Console.WriteLine("\n合并好的数据集");
            outValues(mydataset);

            //复制
            DataSet myds001 = mydataset.Copy();
            DataSet myds002 = mydataset.Clone();
            Console.WriteLine("copy结果");
            outValues(myds001);
            Console.WriteLine("Clone结果");
            outValues(myds002);


            Console.Read();
        }

        public static void outValues(DataSet ds)  //遍历dataSet
        {
            foreach (DataTable outtable in ds.Tables)   //遍历数据集中的表
            {
                Console.WriteLine("表的名称"+outtable.TableName); //获取表的名称并输出
                foreach (DataRow  outdrow in outtable.Rows)       //遍历行
                {
                    foreach (DataColumn outcolum in outtable.Columns) //遍历列,相当于字段
                    {
                        Console.Write(outdrow[outcolum]+"\t");

                    }
                    Console.WriteLine();
                }
            }

        }
    }
}

8、数据适配器DataAdapter

  • DataAdapter对象是DataSet和数据源之间的桥梁,可以建立并初始化表(即DataTable),对数据源执行SQL指令,与DataSet对象结合提供DataSet对象存取数据,可视为DataSet对象的操作核心
  • 在使用DataAdapter对象时,只需要设置SQL命令和数据库链接两个参数,就可以通过Fill方法把查询结果放置在一个DataSet对象中。
  • 实例:填充DAtaSet数据集:利用DAtaAdapter的Fill方法实现。
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Data;
using System.Data.SqlClient;

namespace DataAdapter数据适配
{
    class Program
    {
        public static void outvalue(DataSet ds)
        {
            foreach (DataTable dt in ds.Tables)
            {
                Console.WriteLine("表名" + dt.TableName);
                foreach (DataRow drow in dt.Rows)
                {
                    foreach (DataColumn dcolumn in dt.Columns)
                        Console.WriteLine(dcolumn + "\t");
                    Console.WriteLine();

                }
            }
        }
        static void Main(string[] args)
        {

            string constr = "Server=.;user=sa;pwd=darly;database=csharpzx";
            SqlConnection mycon = new SqlConnection(constr);
            try
            {
                mycon.Open();
                string sql = "Select * from mytable";
                SqlDataAdapter myda = new SqlDataAdapter(sql, mycon);
                DataSet myds = new DataSet();
                myda.Fill(myds, "mytable");  //第一个参数是数据集名称,第二个参数是原表明
                outvalue(myds);

                Console.WriteLine("填充成功");
                Console.Read();

            }
            catch (Exception ex)
            {

                Console.WriteLine(ex.Message.ToString());
            }
            finally
            {
                mycon.Close();
            }
        }
    }
}

  • DataAdapter对象可用于执行数据库的命令操作,含有四个不同的操作命令:
    • SelectCommand:用来需求数据源中的记录
    • InsertCommand:用来向数据源中新插入一条记录
    • UpdateCommand:用来更新数据中的数据;
    • DeleteCommand:用来输出数据源中的记录
      实例2:更新数据域DataAdapter的Update方法可用来将DataSet中的更改解析会数据源
using System;
using System.Data;
using System.Data.SqlClient;

namespace DataAdapter数据适配
{
    class Program
    {
     
        static void Main(string[] args)
        {

            string constr = "Server=.;user=sa;pwd=darly;database=csharpzx";
            SqlConnection mycon = new SqlConnection(constr);
            try
            {
                //mycon.Open();
                //string sql = "Select * from mytable";
                //SqlDataAdapter myda = new SqlDataAdapter(sql, mycon);
                //DataSet myds = new DataSet();
                //myda.Fill(myds, "mytable");  //第一个参数是数据集名称,第二个参数是原表明
                //outvalue(myds);

                //Console.WriteLine("填充成功");
                //Console.Read();

                //更改数据源文件
                mycon.Open();
                string updatesql = "updtae mytable set gender='女' where name='张三'";
                SqlDataAdapter myda = new SqlDataAdapter("select * from mytable", mycon);
                myda.UpdateCommand = new SqlCommand(updatesql, mycon);
                DataSet myds = new DataSet();
                myda.Fill(myds, "mytable");                  //acceptchange处于true状态
                Console.WriteLine("原dataSet对象内容");
                outvalue(myds);
                DataRow myrow = myds.Tables[0].Rows[0];
                myrow["gender"] = "女";
                myda.Update(myds, "mytable");
                Console.WriteLine("更改后DataSet内容");
                outvalue(myds);
                


            }
            catch (Exception ex)
            {

                Console.WriteLine(ex.Message.ToString());
            }
            finally
            {
                mycon.Close();
            }
            Console.Read();
            Console.ReadLine();
        }
        public static void outvalue(DataSet ds)
        {
            foreach (DataTable dt in ds.Tables)
            {
                Console.WriteLine("表名" + dt.TableName);
                foreach (DataRow drow in dt.Rows)
                {
                    foreach (DataColumn dcolumn in dt.Columns)
                    {
                        Console.Write(drow[dcolumn] + "\t");
                    }
                        
                    Console.WriteLine();

                }
            }
        }
    }
}

实例

利用SQL语句创建数据库Company,在其中创建一个clerk表,表中存放员工姓名,性别,年龄,入职时间,部门,然后向表中添加几条数据
通过DataReader打印所创建表的信息
通过DateSet打印所创建表的信息

--创建数据库
create database company
use company
create table clerk
(
id int identity(1,1) primary key,
name nvarchar(5),
gender nvarchar(1),
age int,
department nvarchar(10),
jointime date
)
--添加数据
insert Clerk(name,gender,age,department,jointime)Values('张三','男',35,'市场部','2022.02.26')
insert Clerk(name,gender,age,department,jointime)Values('李四','女',30,'测试部','2022.02.26')
insert Clerk(name,gender,age,department,jointime)Values('王五','男',34,'研发部','2022.02.26')
insert Clerk(name,gender,age,department,jointime)Values('赵六','女',20,'公关部','2022.02.26')
select * from clerk
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Data;
using System.Data.SqlClient;

namespace 实例
{
    class Program
    {
        static void Main(string[] args)
        {
            string constr = "Server=.;user=sa;pwd=darly;database=company";
            SqlConnection mycon = new SqlConnection(constr);
            try
            {
                mycon.Open();
                string sql = "select * from clerk";
                SqlCommand mycom = new SqlCommand(sql, mycon);
                SqlDataReader mydr = mycom.ExecuteReader();
                Console.WriteLine("使用DataReader打印输出");
                for (int i = 0; i < mydr.FieldCount; i++)
                {
                    Console.Write(mydr.GetName(i) + "\t");
                }
                Console.WriteLine();
                while (mydr.Read())
                {
                    for (int i = 0; i < mydr.FieldCount; i++)
                    {
                        Console.Write(mydr[i].ToString() + "\t");
                    }
                    Console.WriteLine();
                }
                mydr.Close();
                Console.WriteLine("使用DataSet打印输出");
                SqlDataAdapter myda = new SqlDataAdapter(sql, mycon);
                DataSet myds = new DataSet();
                myda.Fill(myds, "Clerk");
                foreach (DataTable mytable in myds.Tables)
                {
                    foreach (DataColumn col in mytable.Columns) Console.Write(col.ColumnName + "\t");
                    Console.WriteLine();
                   
                }
                foreach (DataTable mytable in myds.Tables)
                {
                    foreach (DataRow row in mytable.Rows)
                    {
                        foreach (DataColumn col in mytable.Columns) Console.Write(row[col] + "\t");
                        Console.WriteLine();
                    }
                }
            }
            catch (Exception ex)
            {
                Console.WriteLine(ex.Message.ToString());
            }
            finally
            {
                mycon.Close();
            }

            Console.Read();
        }
    }
}

你可能感兴趣的:(C#,数据库,sqlserver,c#)