一、使用ADO.NET访问数据库、异常处理

1、.NET Framework 数据提供程序

【SQL Server .NET数据提供程序】SQL Server 数据源,System.Data.SqlClient 命名空间

【Oracle .NET数据提供程序】Oracle  数据源,System.Data.OracleClient 命名空间

【MySql .NET 在项目中添加MySQL.Data.dll 】SQL Server 数据源,MySql.Data.MySqlClient 命名空间

 

2、ADO.NET的两个主要组件

【Data Set (数据集)】 独立于数据源的数据访问

【.NET Framework 数据提供程序】用于连接到数据库、之心那个命令和检索结果 

 

3、.Net 数据提供程序的四个核心对象

【Connection】  用于访问数据库对象

【Command】 执行脚本的对象(执行脚本)

【DataReader】 通过游标方式进行查询

【DataAdapter】 (适配器)一般用于断开式连接

 

4、不同命名空间的Connection对象

命名空间

对应的 Connection 对象

System.Data.SqlClient

SqlConnection

MySql.Data.MySqlClient

MySqlConnection

System.Data.OracleClient

OracleConnection

 

5、案例:连接到本机的Stu数据库

【方式一】写代码

//1:引用访问sql server数据库的命名空间
using System.Data.SqlClient;

//2:创建一个用于访问数据库的对象Sql
//方式一:
//四个关键词:server服务器(本机地址)、uid登陆账号(sa)、pwd密码(自己的密码)、database数据库(Stu)
SqlConnection conn = new SqlConnection("server = . ; uid = sa ; pwd = 自己的密码 ; database = Stu ");
//也可以写成:server = 172.20.10.3,1433
//方式二:
conn.Connection = "server = . ; uid = sa ; pwd = 自己的密码 ; database = Stu ";
//方式三:
SqlConnection conn = new SqlConnection
   ("Data Source = . ; Initial Catalog = Stu ; User ID = sa ; Password = 自己的密码 ");

//3:连接数据库
conn.Open();
Console.WriteLine("成功打开数据库!");

//4:关闭数据库
conn.Close();
Console.WriteLine("关闭数据库!!");

Console.ReadLine(); 

【方式二】服务器资源管理器——添加链接

①数据源:选择Microsoft Sql Server (支持ADO.NET的数据连接方式)

②服务器名称:选择本地(.)

③选择数据库名称:Stu

④身份验证:选择sql server 身份验证

⑤输入用户名和密码

测试链接——确定

【续1】执行删除脚本(使用ExecuteNonQuery())

using System.Data.SqlClient;//1:引用访问sql server数据库的命名空间

namespace AdoNet_demo1
{
    class Program
    {
        static void Main(string[] args)
        {
            //2:创建一个用于访问数据库的对象Sql
            SqlConnection conn = new SqlConnection("server = . ; uid = sa ; pwd = 自己的密码 ; database = Stu ");

            //3:连接数据库
            conn.Open();
            Console.WriteLine("成功打开数据库!");


            //4:创建一个执行脚本的对象
            string sql = @"delete from ClassInfo 
                               where ClassId = 7";
            或者写成:
            //string sql = "delete from ClassInfo" +
            //    "where ClassId = 7";

            SqlCommand command = new SqlCommand(sql,conn);

            int result = command.ExecuteNonQuery();//【执行】,并返回受影响的行数
            if (result > 0)
            {
                Console.WriteLine("删除成功!");
            }
            else
            {
                Console.WriteLine("删除失败!");
            }


            //5:关闭数据库
            conn.Close();
            Console.WriteLine("关闭数据库!!");

            Console.ReadLine(); 

        }
    }
}

【续2】执行插入脚本(使用ExecuteNonQuery())

using System.Data.SqlClient;//1:引用访问sql server数据库的命名空间

namespace AdoNet_demo1
{
    class Program
    {
        static void Main(string[] args)
        {
            //2:创建一个访问数据库的对象
            SqlConnection conn = new SqlConnection("server = . ; uid = sa ; pwd = 自己的密码 ; database = Stu ");


            //3:连接数据库
            conn.Open();
            Console.WriteLine("成功打开数据库!");


            //4:创建一个执行脚本的对象
            Console.Write("请输入班级编号:");
            int classId = int.Parse(Console.ReadLine());
            Console.Write("请输入班级名称:");
            string className = Console.ReadLine();

            //string sql = @"insert into ClassInfo(ClassId,ClassName)
            //                values("+ classId +" , ' "+ className +" ')";
            //或者写成:
            string sql = $@"insert into ClassInfo(ClassId,ClassName)
                            values({classId}, '{className}')";


            SqlCommand command = new SqlCommand(sql,conn);

            int result = command.ExecuteNonQuery();//【执行】,并返回受影响的行数
            if (result > 0)
            {
                Console.WriteLine("插入成功!");
            }
            else
            {
                Console.WriteLine("插入失败!");
            }


            //5:关闭数据库
            conn.Close();
            Console.WriteLine("关闭数据库!!");

            Console.ReadLine(); 

        }
    }
}

【注】在sql server数据库中直接修改表中的数据,可能会报错;

解决方法:工具——选项——设计器——取消“阻止保存要求重新创建表的更改”

 

6.异常处理

【使用顶层父类的异常报错】

namespace AdoNet_demo2
{
    class Program
    {
        static void Main(string[] args)
        {
            
            try//被检测的代码块
            {
                Console.Write("请输入班级编号:");
                int classId = int.Parse(Console.ReadLine());
                Console.WriteLine("输入没有问题!");
            }
            //异常处理
            catch (Exception ex)//Exception 是顶层父类;ex 表示实例化
            {
                //捕获异常
                Console.WriteLine("错误信息:" + ex.Message);
            }

            Console.Read();
        }
    }
}

【针对性异常报错】

namespace AdoNet_demo2
{
    class Program
    {
        static void Main(string[] args)
        {

            try//被检测的代码块
            {
                //Student stu = null;//加入对象为空
                //stu.Name = "张三";
                //Console.WriteLine(stu.Name);

                int[] nums = { 2, 3, 4 };
                Console.WriteLine(nums[5]);

                Console.WriteLine("输入没有问题!");
            }

            //针对性单独做一些提示,或者处理
            catch (NullReferenceException ex)//空指针异常
            {
                Console.WriteLine("空指针异常:" + ex.Message);
            }

            catch (IndexOutOfRangeException ex)//索引越界异常
            {
                Console.WriteLine("您的索引越界啦!");//更友好
                //Console.WriteLine("索引越界:" + ex.Message);
            }

            Console.Read();
        }
    }
}

【注1】try-catch  若同时写父类、子类的异常捕获,父类要写到最后面

【注2】

try 从报错开始,以后的代码块不再执行

catch  必须出现异常之后才会进入

finally  无论任何情况下都会进入

try
{
    //代码块    
}
catch(NullReferenceException)
{
    //代码块
}
catch(IndexOutOfRangeException)
{
    //代码块
}
catch(Exception)
{
    //代码块  
    return;//当前方法结束,结束后会进入finally方法
}
finally
{
    //代码块
}

【使用异常处理后的代码】

public static void Method()
{
    SqlConnection conn = new SqlConnection("server = . ; uid = sa ; pwd = 自己的密码 ; database = Stu ");
    
    try
    {
        conn.Open();

        Console.Write("请输入班级编号:");
        int classId = int.Parse(Console.ReadLine());
        Console.Write("请输入班级名称:");
        string className = Console.ReadLine();

        string sql = $@"insert into ClassInfo(ClassId,ClassName) values({classId}, '{className}')";

        SqlCommand command = new SqlCommand(sql, conn);
        int result = command.ExecuteNonQuery();

        if (result > 0)
        {
             Console.WriteLine("插入成功!");
        }
        else
        {
            Console.WriteLine("插入失败!");
        }

    }
    catch (Exception ex)
    {
        Console.WriteLine("错误异常:" + ex.Message);
    }
    finally 
    {
        conn.Close();//即使执行脚本时报错,数据库也能够关闭
    }
}

【注3】关闭整个应用程序:Environment.Exit(0);

 

7.执行查询脚本(使用ExecuteScalar())

public static void Method3()
        {
            //1:创建访问数据库的对象
            SqlConnection conn = new SqlConnection("server = . ; uid = sa ; pwd = 0558655asdf ; database = Stu ");

            try
            {
                //2:打开数据库
                conn.Open();
                //3:创建执行脚本的对象(数据卡车)
                string sql = @"select count(userid) from userinfo
                            where account='admin' and pwd ='123456'";
                SqlCommand command = new SqlCommand(sql, conn);
                int result = (int)command.ExecuteScalar();
            }
            catch (Exception)
            {

            }
            finally 
            {
                //4:关闭数据库
                conn.Close();
            }
        }

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值