zoukankan      html  css  js  c++  java
  • SQL Server之 (四) ADO增删查改 登录demo 带参数的sql语句 插入自动返回行号

    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事件探查器)→连接→运行.

                

  • 相关阅读:
    在C++里while语句的一个妙用
    看书——我和村上作品
    Linux下使用QQ和查看QQ空间
    Redflag 6.0 Linux下装 nvidia fx5200显卡驱动
    唇伤
    看书——我和村上作品
    Firefox 3 查看QQ空间的问题——只能开8位以下QQ的空间
    codeforces 315 B.Sereja and Array
    codeforces 285C Building Permutation
    省赛总结
  • 原文地址:https://www.cnblogs.com/sauerkraut/p/6665939.html
Copyright © 2011-2022 走看看