• ado.net(class0503)


    ado.net组成
        数据提供程序
            connection        //连接对象
            command
                executeNonQuery    //执行增删改
                executeScalar    //执行查询返回首行首列
                executeReader    //执行查询返回只读只进的结果集datareader
            datareader
                hasRow        //是否有行
                fieldCount      //列的个数
                dr["列名"]
                dr.GetString(序号)
                close()
            dataadapter
        数据集
            dataset
    作业:
    1
    、用户界面中进行登录判断。输错三次禁止登陆,用数据库记录ErrorTimes。 如果用户名输入正确 密码输入错误 则错误次数+1 如果登陆错误次数==3 这时候不能登陆 2、数据导入:从文本文件导入用户信息。 3、数据导出:将用户信息导出到文本文件。 4、添加学生窗体 5、复习下树控件 把资料管理器的树形结构做出来

    ADO.NET

    为什么要学ADO.NET

    之前我们所学只能在查询分析器里查看数据,操作数据,我们不能让普通用户去学sql,所以我们搭建一个界面(Web Winform)让用户方便的操作数据库中的数据

    什么是ADO.NET

    ADO.NET就是一组类库,这组类库可以让我们通过程序的方式访问数据库,就像System.IO下的类用类操作文件一样, System.Data.这组类是用来操作数据库(不光是MSSql Server),它提供了统一的编程接口让操作其它数据库(Access、Oracle等)的方式和操作MSSql Server一致

    ADO.NET组成

    数据提供程序

    Connection

    Command

    DataReader只读只进的结果集

    DataAdapter

    程序集(DataSet) 断开时连接的数据库操作

    第一个对象Connection

    读取数据库数据之前先要创建一条路

    读取Sql Server数据库使用

    创建SqlConnection对象

    获取连接字符串

    VS视图-服务器资源管理器-数据库连接上点右键-添加连接 在新添的数据库上点右键 属性 里有连接字符串

    string connStr = "Data Source=.\sqlexpress;Initial Catalog=MySchool;Integrated Security=True";
                SqlConnection conn = new SqlConnection(connStr);
                conn.Open();
                MessageBox.Show("数据库连接打开");
    
                conn.Close();
                MessageBox.Show("数据库连接关闭");

    连接SQLServer

    连接字符串:程序通过连接字符串 指定要连哪台服务器上的、哪个实例的哪个数据库、用什么用户名密码等。

    ADO.Net中通过SqlConnection类创建到SQLServer的连接,SqlConnection代表一个数据库连接,ADO.Net中的连接等资源都实现了IDisposable接口,可以使用using进行资源管理。执行备注中的代码如果成功了就ok。

    using (SqlConnection conn = new SqlConnection(@"Data Source=.\sqlexpress;Initial Catalog=MySchool;Integrated Security=True"))
                {
                    conn.Open();
                    Console.WriteLine("连接成功!");
                }

    第二个对象Command

    操作Sql Server数据库使用SqlCommand对象

    SqlCommand表示向服务器提交的一个命令(SQL语句等) , CommandText属性为要执行的SQL语句,ExecuteNonQuery方法执行一个非查询语句(Update、Insert、Delete等)

    常用的三个方法

    ExecuteNonQuery() 执行对数据库的增删改,返回受影响的行数

    ExecuteScalar() 执行查询,返回首行首列

    ExecuteReader() 执行查询,返回DataReader对象

    执行简单的增删改语句

    SqlCommand的ExecuteNonQuery执行增删改操作

    ExecuteNonQuery返回值是执行的影响行数

    //执行数据库操作 3步

    //打开连接 conn.Open();

    //执行操作 result = cmd.ExecuteNonQuery();

    //关闭连接 conn.Close();

    使用using语句即使释放连接资源,不用再考虑是否关闭连接,推荐使用

    练习

    添加学生 编辑学生 删除学生

    异常处理

    在执行数据库操作时,如果数据库服务器未打开,或者sql语句写错了会怎么样?

    可以使用try…catch…finally来捕获异常

    使用异常处理可以保证一个功能出错不影响另一个功能,比如添加操作失败,不影响查询的操作

    ExecuteScalar

    SqlCommand的ExecuteScalar方法用于执行查询,并返回查询所返回的结果集中第一行的第一列,因为不能确定返回值的类型,所以返回值是object类型。 cmd.CommandText = "select count(*) from student";

    int i = Convert.ToInt32(cmd.ExecuteScalar())

    cmd.CommandText = "select getdate()";

    DateTime dt = Convert.ToDateTime(cmd.ExecuteScalar());

    得到自动增长字段的主键值,在values关键词前加上output inserted.Id,其中Id为主键字段名。执行结果就试插入的主键值,用ExecuteScalar执行最方便。 cmd.CommandText =“insert into class(cName,cDescription) output inserted.Id values(‘高三一班’,‘描述’)”;

    int i = Convert.ToInt32(cmd.ExecuteScalar());

    练习:添加学生窗体

    执行查询

    执行有多行结果集的用ExecuteReader

    HasRow属性返回是否有行

    HasRow属性返回是否有行
    SqlDataReader reader = cmd.ExecuteReader();...
    while (reader.Read())
    {      Console.WriteLine(reader.GetString(1));
    }

     reader的GetString、GetInt32等方法只接受整数参数,也就是序号,

    用GetOrdinal方法根据列名动态得到序号

    更简单的方法reader[‘uUserName’]

    为什么用using。Close:关闭以后还能打开。Dispose:直接销毁,不能再次使用。using在出了作用域以后调用Dispose,SqlConnection、 SqlDataReader等的Dispose内部都会做这样的判断:判断有没有close,如果没有Close就先Close再Dispose。

    DataReader 必须独享一个Connection

    案例:登陆练习

    SQL注入漏洞攻击

    登录判断:select * from T_Users where UserName=... and Password=...,将参数拼到SQL语句中。
    构造恶意的Password:' or '1'='1
                          if (dataReader.Read())
                            {
                                MessageBox.Show("登陆成功");
                            }
                            else
                            {
                                MessageBox.Show("登陆失败");
                            }
    防范注入漏洞攻击的方法:不使用SQL语句拼接,通过参数赋值

    查询参数

    SQL语句使用@UserName表示“此处用参数代替”,向SqlCommand的Parameters中添加参数

    cmd.CommandText = "select * from [user] where uUserName=@UserName and uPwd=@Password";

    cmd.Parameters.Add(new SqlParameter(“@ UserName ","admin"));

    cmd.Parameters.Add(new SqlParameter(“@ Password ",password));

    参数在SQLServer内部不是简单的字符串替换,SQLServer直接用添加的值进行数据比较,因此不会有注入漏洞攻击。

    案例

    用户界面中进行登录判断。输错三次禁止登陆,用数据库记录ErrorTimes。

    数据导入:从文本文件导入用户信息。

    数据导出:将用户信息导出到文本文件。

    练习

    案例

    省市选择程序,数据全部来自于数据库:http://www.programfan.com/blog/article.asp?id=28128把createtable中的varchar改为nvarchar,在Insert语句的汉字前面加上N(查找“,'”替换为“,N'”) ComboBox的显示值:Items.Add的参数是Object类型,也就是可以放任意数据类型的数据,可以设置DisplayMember属性设定显示的属性,通过SelectedItem属性取得到就是选择的条目对应的对象。例子。疑问:取出来的是Object,怎么能转换为对应的类型?变量名只是“标签”。显示的值和实际的对象不一样,在ASP.Net中也有相同的东西 创建一个ProvinceItem类,将数据填充在这个对象中添加到ComboBox中。 将连接字符串写在代码中的缺点:多次重复,违反了DRY(Don't Repeat Yourself)原则;如果要修改连接字符串就要修改代码。将连接字符串写在App.Config中: 添加App.config文件(文件名不能改):添加→新建项→常规→应用程序配置文件。App.config是.Net的通用配置文件,在ASP.Net中也能同样使用。 在App.config中添加connectionStrings段,添加一个add项,用name属性起一个名字(比如DbConnStr),connectionString属性指定连接字符串。 在“引用”节点上点右键“添加引用”,找到System.configuration。不是所有.Net中的类都能直接调用,类所在的Assembly要被添加到项目的引用中才可以。 ConfigurationManager.ConnectionStrings[" DbConnStr "].ConnectionString得到连接字符串。 如何在部署的程序中修改配置。

    private void Form1_Load(object sender, EventArgs e)
            {
                string connStr = ConfigurationManager.ConnectionStrings["DbConn"].ConnectionString;
                using (SqlConnection conn = new SqlConnection(connStr))
                {
                    conn.Open();
                    using (SqlCommand cmd = conn.CreateCommand())
                    {
                        cmd.CommandText = "select * from promary";
                        using (SqlDataReader dataReader = cmd.ExecuteReader())
                        {
                            while (dataReader.Read())
                            {
                                ProvinceItem item = new ProvinceItem();
                                item.Id = dataReader.GetInt32(dataReader.GetOrdinal("proID"));
                                item.Name = dataReader.GetString(dataReader.GetOrdinal("proName"));
                                cmbProvince.Items.Add(item);
                            }
                        }
                    }
                }
            }
    
       private void cmbProvince_SelectedIndexChanged(object sender, EventArgs e)
            {
                cmbCity.Items.Clear();
                ProvinceItem item = (ProvinceItem)cmbProvince.SelectedItem;
                string connStr = ConfigurationManager.ConnectionStrings["DbConn"].ConnectionString;
                using (SqlConnection conn = new SqlConnection(connStr))
                {
                    conn.Open();
                    using (SqlCommand cmd = conn.CreateCommand())
                    {
                        cmd.CommandText = "select * from city where proID=@proID";
                        cmd.Parameters.Add(new SqlParameter("proID",item.Id));
                        using (SqlDataReader reader = cmd.ExecuteReader())
                        {
                            while (reader.Read())
                            {
                                string cityName = reader.GetString(reader.GetOrdinal("cityName"));
                                cmbCity.Items.Add(cityName);
                            }
                        }
                    }
                }
            }
     }
    
        public class ProvinceItem
        {
            public int Id { get; set; }
            public string Name { get; set; }
        }
    View Code
  • 相关阅读:
    iOS 自动化测试踩坑(二):Appium 架构原理、环境命令、定位方式
    干货 | 掌握 Selenium 元素定位,解决 Web 自动化测试痛点
    代理技术哪家强?接口 Mock 测试首选 Charles
    浅谈MVC缓存
    PetaPoco 快速上手
    解释器模式(26)
    享元模式(25)
    中介者模式(24)
    职责链模式(23)
    命令模式(22)
  • 原文地址:https://www.cnblogs.com/fanhongshuo/p/3827280.html
Copyright © 2020-2023  润新知