源栈培训:C#进阶:ADO.NET

更多
2019年08月11日 23点18分 作者:叶飞 修改

在 Linq to SQL 面世之前,连接数据库的办法。

是 Entity Framework 的底层实现工具。


Connection对象

数据库连接

using (SqlConnection connection = new SqlConnection(connectionString))  
{  
    connection.Open();  //需要显式的Open()
    //进行其他操作
}  

理解:数据库连接

  • 字符串
  • 显式的Open()
  • 使用using:Dispose() => Close()
  • 池(pool)

性能策略:尽可能晚的打开,尽可能早的关闭


Command对象

依赖于connection对象,封装sql语句:

SqlCommand command = new SqlCommand();

可传入SQL语句:

                SqlCommand getUserByName = new SqlCommand(
                    $"SELECT Count([Id]) FROM [User] WHERE [Name] = N'{UserName}'",
                    connection);

也可以传入存储过程

        SqlCommand command = new SqlCommand();
        command.Connection = connection;
        command.CommandText = "SalesByCategory";
        command.CommandType = CommandType.StoredProcedure;


运行Command,分为查询和非查询两种

ExecuteNonQuery()

非查询语句,执行增删改时使用。

                saveUser.ExecuteNonQuery();

ExecuteScalar()

执行查询语句时使用,返回结果集中第一行第一列的值。常用于select count(*)/Max()等

                count = Convert.ToInt32(getUserByName.ExecuteScalar());

ExecuteReader()

执行查询语句时使用,会返回一个SqlDataReader对象。

调用SqlDataReader对象的Read()方法,可以读取查询结果集中的一行数据。通常我们通过循环调用Read()方法,读取全部结果集。

可以使用索引([],int下标或string 列名)来获取行中每一列中的值。

            if (reader.HasRows)
            {
                while (reader.Read())
                {
                    Console.WriteLine("{0}: {1:C}", reader[0], reader[1]);
                }
            }


SQL注入

使用拼接字符串,会造成SQL注入的问题:

INSERT [USER]([Name],[Password]) 
VALUES('1234','1234',4567) UPDATE [User] SET [Password]='8888'--');

恶意输入内容:-- 1234',4567) UPDATE [User] SET [Password]='8888'--

(演示:略)

所以,我们总是使用参数化查询

                SqlCommand saveUser = new SqlCommand(
                    "INSERT [USER]([Name],[Password],[AntiForgeryToken]) " +
                    "VALUES(@UserName,@Password,5436);",
                    connection);

                SqlParameter pUserName = new SqlParameter("@UserName", model.UserName);
                SqlParameter pPassword = new SqlParameter("@Password", model.Password);

                saveUser.Parameters.Add(pUserName);
                saveUser.Parameters.Add(pPassword);


以DataReader为基础,ADO.NET还引入了:

DataAdapter和DataSet

DataAdapter:封装SQL语句,通过

  • Fill()方法
    查询得到的结果存储到“内存数据库”DataSet中
    string queryString =   
      "SELECT CustomerID, CompanyName FROM dbo.Customers";  
    SqlDataAdapter adapter = new SqlDataAdapter(queryString, connection);  
      
    DataSet customers = new DataSet();  
    adapter.Fill(customers, "Customers");  
    理解:
    1. 自动处理connection的开关
    2. DataSet的“非连接”存储

  • Update()方法
    将DataSet上的更改同步到数据库
            dataAdpater.UpdateCommand = new SqlCommand(
               "UPDATE Categories SET CategoryName = @CategoryName " +
               "WHERE CategoryID = @CategoryID", connection);
    
            dataAdpater.UpdateCommand.Parameters.Add(
               "@CategoryName", SqlDbType.NVarChar, 15, "CategoryName");
            SqlParameter parameter = dataAdpater.UpdateCommand.Parameters.Add(
              "@CategoryID", SqlDbType.Int);
            parameter.SourceColumn = "CategoryID";
    
            DataTable categoryTable = new DataTable();
            dataAdpater.Fill(categoryTable);
    
            DataRow categoryRow = categoryTable.Rows[0];
            categoryRow["CategoryName"] = "New Beverages";
    
            dataAdpater.Update(categoryTable);
    理解:DataAdapter会自动根据DataTable中数据的变动,调用合适的Command完成DataSet和数据库的同步。

事务Transaction

建立在connnection之内

                using (IDbTransaction transaction = connection.BeginTransaction())
                {
                    try
                    {
                        transaction.Commit();
                    }
                    catch (Exception)
                    {
                        transaction.Rollback();
                        throw;
                    }
                }


作业:

使用ADO.NET完成以下操作:


源栈培训 C# ADO.NET
赞: 172 踩: 0

打赏
已收到打赏的 帮帮币

你的 打赏 非常重要!
为了保证文章的质量,每一篇文章的发布,都已经消耗了作者 1 枚 帮帮币
没有“帮帮币”,作者无法发布新的文章。

全系列阅读
评论 / 0
叶飞的系列文章

源栈培训:ASP.NET全栈开发

飞哥的源栈培训:线上全程直播,免费收看;线下拎包入住,按周计费。本系列收录所有讲义(含视频录播地址)

编程那些事:菜鸟入门

大飞哥倾力之作,面向有意入行IT/开发/编程的初学者,欢迎任何形式的留言建议……

从包工头到程序猿

真实故事,讲述我在家装公司关门之后,如何转行成为一个程序猿的故事。(《折腾》第三卷)

《折腾》(卷一)青涩

时间段:从大学毕业到开始创业。离开青葱校园,涉世之初的那些往事……

《折腾》(卷二)风雨 之(1)工地

我一个完全的门外汉(无论装修还是管理),开始给黎叔装修房子。从踌躅满志,到四处碰壁;从一往直前,到左右为难……

《折腾》(卷二)风雨 之(2)胸怀

作为一个律师,接工程没签合同,被狠狠的坑了一把!年轻人暴烈的想要复仇,黎叔教他一个企业家的胸怀……

《折腾》(卷二)风雨 之(3)渠道

成立了公司,招聘了员工,开始大力的拓展业务,一个接一个的坑,摔倒了又爬起来……

《折腾》(卷二)风雨 之(4)视野

经历残酷现实的磨砺,终于明白:干啥事,都不能闭门造车,人要走出去,开阔视野……

未分类

系统自动生成的未分类系列

一锅大杂烩

从律师到包工头,从码农到写手,读书交友生活创业,各种零零碎碎,乱七八糟……

人人都是程序猿

计算机编程普及课程,视频:https://space.bilibili.com/55410301/#/channel/detail?cid=49491

全部
关键字



帮助

反馈