SQL Server之 (四) ADO增删查改 登录demo 带参数的sql语句 插入自动返回行号

 2023-09-05 阅读 239 评论 0

摘要:SQL Server之 (四) ADO增删查改 登录demo 带参数的sql语句 插入自动返回行号 自己学习笔记,转载请注明出处,谢谢!---酸菜 1.什么是ADO.NET ADO.NET是一组类库,这组类库可以让我们通过程序的方式访问数据库,并以各种方式操作存储在其中的数据; ADO.NET是基于.NET FrameWork,

SQL Server之 (四) ADO增删查改  登录demo  带参数的sql语句  插入自动返回行号

自己学习笔记,转载请注明出处,谢谢!---酸菜

1.什么是ADO.NET

    ADO.NET是一组类库,这组类库可以让我们通过程序的方式访问数据库,并以各种方式操作存储在其中的数据;

    ADO.NET是基于.NET FrameWork,与.NET FrameWork类库的其余部分是高度集成的

2.连接数据库的步骤

    ①创建连接字符串

      Data Source=XXX-PC; Initial Catalog=MyDataBase; Integrated Security=True;

      连接服务器实例                连接数据库                            是否Windows验证登录

      Data Source=localhost/192.168.1.1;  Initial Catalog=MyDataBase; User ID=sa; Password=123;

                   连接服务器实例                          连接数据库                            数据库账户密码验证登录

      server=.;database=MyDataBase;uid=sa;pwd=123;----以前的老式写法,现在也在用;

      string conn="Data Source=XXX-PC; Initial Catalog=MyDataBase; Integrated Security=True";

    ②创建连接对象,并把连接字符串传进来;

       SqlConnection sqlCon=new SqlConnection(conn);   //SqlConnection  是SQL Server的类,其他数据库有对应的类;

    ③打开连接,测试连接/关闭连接,释放资源;

       sqlCon.Open();

       sqlCon.Close();

       sqlCon.Dispose();

       如果在连接时使用using 如:

                    using (SqlConnection sqlCon=new SqlConnection(conn))

                 {

                     sqlCon.Open();

                   //如果使用using 就不用sqlCon.Close();和sqlCon.Dispose();因为using内部已经写好了Dispose,而SQLConnection中的Dispose中写好了Close,所以两者都不用再写;

                  }

    ④创建一个可以执行Sql语句的命令对象

       string sql="insert into Users values()";

       using(SqlCommand cmd=new SqlCommand()/(sql,sqlCon))

        {

           //因为SQLCommand对象也需要释放,所以此处用了using.

          //如果使用无参的的构造函数,可   cmd.CommandText=sql; cmd.Connection=sqlCon;

        }

    ⑤执行语句

        无论执行什么SQL语句,调用以下三个方法都可以执行出来结果,但是通常有使用习惯:

       <1> cmd.ExecuteNonQuery();//执行 insert /delete/update 语句时使用;

              这个方法返回值是int类型,表示执行insert/delete/update 语句后影响的行数

              注意:ExecuteNonQuery()只有执行 insert/delete/update语句时会返回影响行数,执行其他的SQL语句时,永远返回的是-1;

        <2>cmd.ExecuteScalar();   //查询单行单列结果集时 使用;

              这个方法返回值是object类型,当查询语句是使用聚合函数,那么该方法返回不可能是null值,因为聚合函数返回没有null值;如果不是聚合函数可能返回null值,所以使用返回值之前先判断是否为null;

        <3>cmd.ExecuteReader();//查询多行多列结果集时使用;

              这个方法返回值是SqlDataReader类型,通过该方法将给定的SQL语句在数据库中执行,但是没有返回给程序,只给程序返回一个reader对象,就是用这个对象来获取数据的.

              using (SqlDataReader reader=cmd.ExecuteReader())

                {

                    //需要用reader对象一条一条获取数据

                   //在获取数据之前,先判断一下本次查询是否查到数据;

                   if(reader.HasRows)//如果有数据返回true,否则false

                    {

                        //有数据,需要用reader一条一条获取

                        //每次获取数据前,都先调用reader.Read()方法,向后移动一条数据,如果成功移动到一条数据上, 返回true;否则false

                        while(reader.Read())

                           {

                               //获取当前reader指向的数据

                               //reader.FieldCount 可以查出当前语句查询出来的列数;

                           for (int i =0;i<reader.fieldcount;i++)

                            {

                                Console.WriteLine(reader[i]);

                                //reader[i];reader.GetValue(i);  reader[""]列名称;

                               //当遇到数据为null值,通过reader.GetValue()或reader[]索引器获取列值,返回的是DBNull.Value 不是C#中的null值,而DBNull.Value.ToString()后是空字符串,所以并不报错;

                             }

                           }

 

                    }

                  else

                    {

                           Console.WriteLine("没有查到任何数据!");

                    }

                }

        <4>DataReader的特点:   

                   只读,只进.只能通过reader读取数据,不能修改.reader只能一条一条向前移动,不能向后,也不能跳跃;

                   使用reader时必须保证连接是否打开状态.当reader使用完毕后, 必须把reader关闭,释放.同时释放连接对象;

                   默认情况下, reader独占一个连接对象;

3.获取插入数据的自增列

    ① insert into Table output inserted.ID(自增列或者要取值的列)  values('Hello','英语课');

    ②insert into Table values('Hello','语文课')   select @@identity;   这个相对上面那个 因为@@identity是全局变量 所以可能会出错,取到别人执行的最新的自增列;

4.防SQL注入

    ①SQL注入:使用SQL拼接的方式不安全,会出现SQL注入的问题;解决方法:使用带参数的SQL语句或者使用存储过程.(带参数的SQL 在SQL执行过程中内部会转为存储过程执行)

    ②使用带参数的SQL语句;如果SQL语句中有参数(以@符号开头),那么必须给Command对象提供参数和参数的值;

               using (SqlCommand cmd=new SqlCommand(sql,con))

                 {

                              SqlParameter paramUserID=new SqlParameter("@UserID",SqlDbType.varchar,50){Value=txtUserId.Text.Trim()};  //使用对象初始化器

                              SqlParameter parampwd=new SqlParameter("@pwd",SqlDbType.varchar,50){Value=txtpwd.Text.Trim()};  //使用对象初始化器

                              cmd.Parameters.Add(paramUserID);

                              cmd.Parameters.Add(parampwd);

                              con.Open();

                              int t=(int) cmd.ExecuteScalar();

                              if(t>0){}

                 }

      推荐简化版:

                              SqlParamerter [] params=new SqlParameter[]{

                                    new SqlParameter ("@UserID",SqlDbType.Varchar,50){Value=txtUserID.Text}),

                                    new SqlParameter("@pwd",SqlDbType.Varchar,50){Value=txtpwd.Text})      }

                              cmd.Parameters.AddRange(params);

      另一种不推荐方法:

                              cmd.Parameters.AddWithValue("@UserID",txtUserId.Text);

                              cmd.Parameters.AddWithValue("@pwd",txtpwd.Text);

     注:所有对数据库引擎的操作在这里都可以监视到  工具→SQL Server Profiler(SQL Server事件探查器)→连接→运行.

 

 

 

            

 

转载于:https://www.cnblogs.com/sauerkraut/p/6665939.html

版权声明:本站所有资料均为网友推荐收集整理而来,仅供学习和研究交流使用。

原文链接:https://hbdhgg.com/1/759.html

发表评论:

本站为非赢利网站,部分文章来源或改编自互联网及其他公众平台,主要目的在于分享信息,版权归原作者所有,内容仅供读者参考,如有侵权请联系我们删除!

Copyright © 2022 匯編語言學習筆記 Inc. 保留所有权利。

底部版权信息