C#SQL连接数据库

       三层代码敲完了,于是乎就信心满满的来找师父验收了,其实自己在敲D层时,代码不是很了解,就像机房数据库连接的代码自己理解的也不是很透彻,于是这次也没太理解这块代码,但师父就是问的这块代码,答的过程那叫一个心惊胆跳,其实还好。下面该段代码是有关数据库连接的,下文也是对该段代码的解释,里面可有好多知识点哟:

            using(SqlConnection conn = new SqlConnection(DBUtil.ConnString))//创建一个数据库连接
            {
                SqlCommand cmd = conn.CreateCommand();//创建一个与connection对象关联的SqlCommand对象,来执行命令文本
                cmd.CommandText = @"select ID,UserName,Password,Email from Users where UserName=@UserName And Password=@Password";
                cmd.CommandType = CommandType.Text;
                
                //因为连接字符串中有两个参数,所以要声明两个参数
                cmd.Parameters.Add(new SqlParameter("@UserName",userName));
                cmd.Parameters.Add(new SqlParameter("@Password",password));

                conn.Open();//因为使用using,默认数据库关闭,所以在使用前要打开

                SqlDataReader reader = cmd.ExecuteReader();
                Login.Model.UserInfo user = null;
                while (reader.Read())
                {
                    if (user == null)
                    {
                        user = new Login.Model.UserInfo();//延迟加载
                    }
                    user.ID = reader.GetInt32(0);
                    user.UserName = reader.GetString(1);
                    user.Password = reader.GetString(2);
                    if (!reader.IsDBNull(3))
                    {
                        user.Email = reader.GetString(3);
                    }                    
                }
                return user;

Command.Text

它的内容通常是SQL语句,SQL存储过程

Command.Type

作用:设置CommandText的内容类型,有三种重载

1>StoredProcedure:类型为存储过程名称

2>TableDirect:类型为表的名称

3>Text:类型为SQL文本命令

ExecuteReader()方法

作用: 尽可能快的对数据库进行查询并得到结

返回值:是一个DataReader对象,如果在SqlCommand对象中调用,则返回SqlDataReader;如果在OleDbCommand对象 中调用,则返回OleDataReader.以上代码就是在SqlCommand对象中调用的。每次调用SqlDataReader只会返回结果集中的一条记录。所以要想把符合条件的结果都读出来,以上代码用到了while循环。

方法: Read()是ExcuteReader()是DataReader的方法,每次调用SqlDataReader的Read()方法只会返回结果集中的一条记 录。所以要想把符合条件的结果都读出来,以上代码用到了while循环;返回类型为bool类型,在执行方法之前,指针指向第一  条记录的前面,每执行 一次指针向前移动一条,知道指针指向最后一条记录的后面,返回false

ExecuteNonQuery()

          作用:返回符合查询条件的受影响的记录总行数

 返回值:返回类型为int,如果是其它查询,则返回-1(如果用cmd.ExecuteNonQuery()代替cmd.ExecuteReader(),则返回值就是-1);如果是该 查询没有受影响的行,则返回0,否则返回受影响总条数


         两者区别:

ExecuteReader()方法针对Select语句

ExecuteNonQuery()方法针对的是inset、delete、update语句

using()

         为什么要使用using()那,因为当声明一个对象后,会占用很多紧缺资源,使用using可以自动关闭SqlConnection数据库连接,如果想使用数据库,用open()方法打开就行了

Parameters.add()

  为什么要用给命 令对象添加参数的形式那,而不用直接写入法???目的是防sql注入,其实在机房中就听说了防sql注入,但没究其原因,只知道限制了特殊符号,此处用参数的形式就是防特殊符号,如果我的SQL语句是select ID,UserName,Password,Email from Users where UserName=@UserName And Password=@Password;而我设置UserName =1',Password=1',即我输入的用户名和密码是1',注意有个特殊符,这时该条语句就会报错,因为此时数据库默认语句形式是select ID,UserName,Password,Email from Users where UserName=1' And Password=1’;系统会把输入的1'中的'默认是sql语句的符号,即此时该语句一结束,后面的内容是多余的,所以会报错。sqlparameter就解决此问题的,它保证了外接参数能被正确转换,单引号这些特殊符也会被转义,不会对数据库造成威胁了。
   为什么参数化查询能防止sql注入???
   主要做了两件事:
   1>参数过滤
   2>执行计划重用
     为什么会发生注入那,是因为没有重用以前的执行计划,对注入后的sql重新进行了编译,即重新执行了语法解析。所以要保证sql语义不变,即我想表达的sql就是我想表达的意思,不是注入后的意思,就应该重用执行计划。(任何exec动态的执行ql语句都有注入的危险,防止注入主要是执行计划重用起了作用

【总结】

   在解决问题时,通常只是找到了解决办法,而没有究其原因,这是自己以后要改进的地方。还有起初看到数据库代码时自己对此是方案的,可能在机房时就留下了这样一个错觉,数据库代码难,不用太了解,导致三层也认为它是难得,还无知地认为不用了解,其实这样一来,也不就是那么一回事嘛,所以往往打败自己的不是别人,而是自己。

  • 3
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 28
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 28
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值