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

原创 2011年12月11日 22:23:40
 

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 ();



相关文章推荐

SqlConnection中 Close()、Dispose()、Using()

如果 SqlConnection 超出范围,则不会将其关闭。因此,除非将代码放在 using 语句内,否则必须调用 Close 或 Dispose 来显式关闭连接。它们在功能上是等效的。区别:Clos...

黑马程序员学习日记----Close和Dispose区别

---------------------- Windows Phone 7手机开发、.Net培训、期待与您交流! ---------------------- 简单的说:     clo...

黑马程序员 关闭和释放连接 Close方法与Dispose方法

---------------------- Windows Phone 7手机开发  .Net培训 期待与您交流! ---------------------- 《关闭和释放连接 Close...

【黑马程序员】关于const的一些用法及区别

下面分别用const限定不可变的内容是什么? 1)const在前面 const int nValue; //nValue是const const char *pContent; //...

C#中Dispose和Close的区别

  • 2008年05月17日 07:31
  • 3KB
  • 下载

黑马程序员-equals和==的用法以及区别

==和equals都是比较的,而前者是运算符,后者则是一个方法,基本数据类型和引用数据类型都可以使用运算符==,而只有引用类型数据才可以使用equals,下面具体介绍一下两者的用法以及区别.    ...
  • xx12222
  • xx12222
  • 2014年06月26日 11:44
  • 343

C#中Dispose和Close的区别

http://topic.csdn.net/u/20100510/17/a451cc68-0b0b-465b-9ce4-9f050038ee33.html首先,Dispose和Close基本上应该是一...

C#中Dispose和Close的区别!

当我们开发C#代码的时候,经常碰到一个问题,有些class提供Close(),有些class提供Dispose(),那么Dispose和Close到底有什么区别? 首先,Dispose和Clos...

C#中Dispose、析构函数、close的区别

析构函数不能显示调用,而对于Dispose、close方法来说,都需要进行显示调用才能被执行。 一、Close与Dispose这两种方法的区别 调用完了对象的Close方法后,此对象有可能...

深入解析Close()和Dispose()的区别

很多人都认为Close()方法内部会调用Dispose()方法,所以并没有本质的区别!实际上这个看法不是很准确,对有 些类来说,的确Close()和Dispose()没有本质区别,但是对有些类...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:黑马程序员_Dispose()与Close()的区别和Using的用法
举报原因:
原因补充:

(最多只允许输入30个字)