黑马程序员_Dispose()与Close()的区别和Using的用法

 

SqlCommand.ExecuteScalar()判断用户登录的另一种方法:

Dispose():直接销毁,不可再次利用;

Close():关闭连接(关闭后可再次利用)

Using在除了作用域以后调用dispose,SqlConnection、FileStream的内部都会作这样的判断:判断有没有close,若没有就先 close再dispose

 

下述代码将很容易被注入攻击(如何防注入呢?):

            

            string dataDir = AppDomain.CurrentDomain.BaseDirectory;

            if(dataDir.EndsWith(@"\bin\Debug\")||dataDir .EndsWith (@"\bin\Release"))

            {

                dataDir = System.IO.Directory.GetParent(dataDir).Parent.Parent.FullName;

                AppDomain.CurrentDomain.SetData("DataDirectory",dataDir );

            }

            Console.WriteLine ("请输入用户名:");

            string UserName = Console.ReadLine();

            Console.WriteLine("请输入密码:");

            string password = Console.ReadLine();
           

                using (SqlConnection conn = new SqlConnection(@"Data Source =.\SQLEXPRESS;AttachDBFilename = |DataDirectory|\Database1.mdf;Integrated Security= true ;User Instance=true"))   //该处用 using()的目的是释放内存,以下也一样

                {
                    conn.Open();

                    using (SqlCommand com = conn.CreateCommand())

                    {

                        com.CommandText = "select count(*) from Table4 where Admin = '"+UserName+"'and PassWord= '"+password +"'";

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

                            if(i>0)

                            {
                                Console.WriteLine ("登陆成功");
                            }

                        else

                            {

                                Console.WriteLine ("用户名或密码错误");

                            }

                    }

                }

            Console.ReadKey ();

参数化查询(不会被注入攻击):

            string dataDir = AppDomain.CurrentDomain.BaseDirectory;

            if(dataDir.EndsWith(@"\bin\Debug\")||dataDir .EndsWith (@"\bin\Release"))

            {

                dataDir = System.IO.Directory.GetParent(dataDir).Parent.Parent.FullName;

                AppDomain.CurrentDomain.SetData("DataDirectory",dataDir );

            }

            Console.WriteLine ("请输入用户名:");

            string UserName = Console.ReadLine();

            Console.WriteLine("请输入密码:");

            string password = Console.ReadLine();           

                using (SqlConnection conn = new SqlConnection(@"Data Source =.\SQLEXPRESS;AttachDBFilename = |DataDirectory|\Database1.mdf;Integrated Security= true ;User Instance=true"))   //该处用 using()的目的是释放内存,以下也一样

                { 

                    conn.Open();

                    using (SqlCommand com = conn.CreateCommand())

                    {

com.CommandText = "select count(*) from Table4 where Admin= @username and PassWord = @PassWord";

                        //注意该处的@username 和@PassWord不要和用户输入的变量同名,否则将发生未知错误

                            com.Parameters.Add(new SqlParameter ("username",UserName ));

                        com.Parameters.Add(new SqlParameter ("PassWord",password));

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

                        if (i > 0)

                        {

                            Console.WriteLine("登陆成功");
                        }

                        else

                        {

                            Console.WriteLine("用户名或密码错误");

                        }

                    }

                }

            Console.ReadKey ();



  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值