黑马程序员_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 ();



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

很多人都认为Close()方法内部会调用Dispose()方法,所以并没有本质的区别!实际上这个看法不是很准确,对有 些类来说,的确Close()和Dispose()没有本质区别,但是对有些类来...
  • daihongshu
  • daihongshu
  • 2014年05月12日 10:46
  • 1760

C# Form Dispose 和 Close的区别

上午想做个简单的单件设计模式(Singleton)的小例子,结果出现了一些意想不到的问题。我的本意是建立两个窗体类Form1和Form2,在Form2上放置一个名为Button1的按钮,单击Butto...
  • CNHK1225
  • CNHK1225
  • 2014年04月03日 15:18
  • 6878

ADO.NET学习:Close和Dispose、Using

Close:关闭以后还能打开。 Dispose:直接销毁,不能再次利用。 Using:在出了作用域以后调用Dispose,SqlConnection、FileStream等的Dispose内部做会...
  • lissdy
  • lissdy
  • 2012年05月18日 22:58
  • 841

C#中Dispose和Close的区别 今天面试遇到的

问题一:Close是关闭数据连接,但DataReader对象还在,可能要过较长时间才会被垃圾回收。Dispose是要求马上回收。 问题二:对每个浏览者分别创建不同的对象,即使Dispose也只是销毁...
  • linshichen
  • linshichen
  • 2016年08月11日 20:23
  • 310

C#中close和dispose区别

Close是停业整顿 Dispose是炸毁 通俗明了-----by metababy 停业了,可以通过公关,再重开。物还是原来的物 炸毁了,想再开张,就只有重头建起 C#...
  • woqin1990
  • woqin1990
  • 2013年10月21日 18:47
  • 1141

Close()和Dispose()

.net中的许多类都提供了Close()和Dispose()方法,但是这两个方法有什么却别呢? 看下边的例子   SqlConnection conn = new SqlConnection("连...
  • bemavery
  • bemavery
  • 2014年08月29日 23:31
  • 5208

JAVA 关闭窗口的设置 DISPOSE_ON_CLOSE和EXIT_ON_CLOSE 的区别

setDefaultCloseOperation()是用来设定窗口被关闭时候(比如点击了右上角的"x")的行为的。 DISPOSE_ON_CLOSE在窗口被关闭的时候会dispose这个窗口。 EXI...
  • caixiexin
  • caixiexin
  • 2011年07月22日 20:41
  • 7472

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

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

Java窗口关闭设置DISPOSE_ON_CLOSE和EXIT_ON_CLOSE 的区别

Java窗口关闭设置DISPOSE_ON_CLOSE和EXIT_ON_CLOSE 的区别 2012.11.06 / Java / 11,095 ViewsNo Reply ...
  • wq1967724
  • wq1967724
  • 2016年06月04日 20:45
  • 877

Dispose、Close、=null三者之间的区别

 上午想做个简单的单件设计模式(Singleton)的小例子,结果出现了一些意想不到的问题。我的本意是建立两个窗体类Form1和Form2,在Form2上放置一个名为Button1的按钮,单击Butt...
  • suinon
  • suinon
  • 2008年06月20日 14:13
  • 5622
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:黑马程序员_Dispose()与Close()的区别和Using的用法
举报原因:
原因补充:

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