【黑马程序员】ADO.net

---------------------- Windows Phone 7手机开发.Net培训、期待与您交流! ----------------------

一、ADO.NET连接SQLServer

ADO.NET基础:

程序员要和数据库交互要通过ADO.NET进行,通过ADO.NET就能在程序中执行SQL了,ADO.NET中提供了各种不同数据库的统一操作接口

直接在项目中内嵌mdf文件的方式使用SQL(基于服务的数据库)。Mdf文件随项目走用起来方便,和在数据库服务器上的创建数据库没有什么区别,运行时会自动附加(Attach)。

双击mdf文件会在“服务器资源管理器中打开,管理方式和在Mangement Studio没有什么本质不同。要拷贝mdf文件需要关闭指向mdf文件的连接

正式生产运行的时候附加到SQLServer上、修改连接字符串即可,除此之外没有任何区别,在数据库“节点上点击右键“附加”;在数据库节点上->任务->分离就可以得到可以拷来拷去的mdf文件了

用的时候要在控制台=winform项目中的Main函数最开始位置加入备连中的代码ASP.net项目中不需要

         连接SQLServer:

连接字符串:程序通过连接字符串指定要连接哪台服务器上的、那个实例的哪个数据库、用什么用户名密码的等

项目内嵌mdf文件形式的连接字符串:

         DataSource=.\SQLEXPRESS;//实例名

AttachDBFilename=|DataDirectory|Database1.mdf;//要附加的mdf

IntergratedSecurity=True;

Userinstance=true;

ADO.NET中通过SqlConnction类创建到SQLServer的连接,SqlConnction代表一个数据库连接:SqlConnection conn = new SqlConnection(@"DataSource=.\SQLEXPRESS;

                               AttachDBFilename=|DataDirectory|Database1.mdf;

                                IntegratedSecurity=True;User instance=true;");

            conn.Open();

            Console.WriteLine("打开数据库连接成功|");

         ADO.NET中的连接等资源都实现了IDisposable接口,可以使用using进行资源管理

 

         由于启动用户实例的进程时出错,导无法生成SQServer实例                             

二、ADO.NET详解

         在实现了Dispose接口的在使用完之后要使用using将资源释放

           Using(SqlConnection conn =newSqlConnection(@"DataSource=.\SQLEXPRESS;

                               AttachDBFilename=|DataDirectory|Database1.mdf;

                                IntegratedSecurity=True;User instance=true;"))

          { conn.Open();}//using管的范围到}这里

            Console.WriteLine("打开数据库连接成功|");

         执行简单的insert语句:

         SqlCommand表示向服务器提交的一个命令(SQL语句等)

         CommandText属性为要执行的SQL语句,ExcuteNonQuery方法执行一个非查询语句(update、insert、delete等):

using (SqlConnectionconn = new SqlConnection(@"Data Source=.\SQLEXPRESS;

                                AttachDBFilename=|DataDirectory|Database1.mdf;

                                 IntegratedSecurity=True;User instance=true;"))

             {

                 conn.Open();

                 using (SqlCommand cmd=conn.CreateCommand ())

                 {

                     cmd.CommandText ="insert into MyTable1(Name) values ('abc')";CommandText属性为要执行的SQL语句

                     cmd.ExecuteNonQuery();//执行一个非查询语句

                     Console.WriteLine("插入成功");

                 }

             }

         ExecuteNonQuery()返回值是执行影响的行数

         执行查询:

         执行多行结果集用ExecuteReader

           /*

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

            string username =Console.ReadLine();

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

            string password =Console.ReadLine();

            using (SqlConnection conn = newSqlConnection(@"Data Source=.\SQLEXPRESS;

                               AttachDBFilename=|DataDirectory|Database1.mdf;

                                IntegratedSecurity=True;User instance=true;"))

            {

                conn.Open();

                using (SqlCommand cmd =conn.CreateCommand())

                {

                    cmd.CommandText ="select *from T_Users where UserName='" + username + "'" // cmd.CommandText =string.format("insert into T_Users1(UserName,Password)values('{0}','{1}');",username,password);

                    //先到表中查用户输入的用户名对应的信息

                    using (SqlDataReader reader= cmd.ExecuteReader())

                    {

                        if (reader.Read())

                        {

                            //用户名存在

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

                            //string password =Console.ReadLine();

                            string dbpassword =reader.GetString(reader.GetOrdinal("password"));//数据库中的密码

                            if (password==dbpassword )//比较数据库中的密码和用户输入的密码是否一致

                            {

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

                            }

                            else//Read返回false,就是没有查找到这个用户

                            {

                               Console.WriteLine("密码错误登陆失败");

                            }

                           

                        }

                        else

                        {

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

                        }

                    }

 

                }

            }*/

         User在SQL中是关键字,加[ ]可消除,表名一般以T_开头,字段一般以F_开头

         ExcuteScalar:

         SqlCommand的ExecuteScalar方法用于执行查询,并且返回查询所返回的结果集中第一行的第一列,因为不能确定返回值类型所以返回值是object类型

          using (SqlConnection conn = new SqlConnection(@"DataSource=.\SQLEXPRESS;

                               AttachDBFilename=|DataDirectory|Database1.mdf;

                                IntegratedSecurity=True;User instance=true;"))

            {

                conn.Open();

                using (SqlCommand cmd =conn.CreateCommand())

                {

                    cmd.CommandText ="select count(*) from T_Users1";

                    Console.WriteLine(cmd.ExecuteScalar());//返回第一行的 第一列的数据

                }

 

             }

         得到自动增长字段的主键值,在values关键词 前加output ,

          using (SqlConnection conn = new SqlConnection(@"DataSource=.\SQLEXPRESS;

                               AttachDBFilename=|DataDirectory|Database1.mdf;

                                IntegratedSecurity=True;User instance=true;"))

            {

                conn.Open();

                using (SqlCommand cmd =conn.CreateCommand())

                {

                    cmd.CommandText="Insert into T_Users1(UserName,Password) Output inserted.IdValues('admin','888888')";

                   //得到新增字段的值

                    int id=Convert.ToInt32(cmd.ExecuteScalar());

                    Console.WriteLine("新增的主键:{0}",id);

 

                }

            }

         返回多行多列时用:ExecuteReader();

          using (SqlConnection conn = new SqlConnection(@"DataSource=.\SQLEXPRESS;

                               AttachDBFilename=|DataDirectory|Database1.mdf;

                                IntegratedSecurity=True;User instance=true;"))

            {

                conn.Open();

                using (SqlCommand cmd =conn.CreateCommand())

                {

                    cmd.CommandText ="select *from T_Users1";

                    using (SqlDataReaderreader=cmd.ExecuteReader())

                    {

                        while (reader.Read ())

                        {

                           //Console.WriteLine(reader.GetString(1));//将当前行的第一列打印出来

                           //Console.WriteLine(reader.GetString (reader.GetOrdinal ("UserName")));

                            //  reader.GetOrdinal("UserName");ADO中用GetOrdinal()方法动态获取列数

                            //显示多行多列

                            stringusername=reader .GetString (reader .GetOrdinal ("UserName"));

                           int id=reader.GetInt32(reader.GetOrdinal("Id"));

                            string password =reader.GetString(reader.GetOrdinal("Password"));

                           Console.WriteLine("Id={0},UserName={1},Password={2}",id,username,password );

                        }

                    }

                }

            }

         Close:关闭以后还能打开

         Dispose:直接销毁,不能在使用

Using:在出了作用域之后调用disposeSqlConnection、FileStream等的Dispose内部都会做这样 的判断:判断有没有close,如果没有close就先close再dispose。用using内部会自动close

SQL注入漏洞攻击:

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

            stringusername = Console.ReadLine();

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

            stringpassword = Console.ReadLine();

            using(SqlConnection conn = new SqlConnection(@"Data Source=.\SQLEXPRESS;

                               AttachDBFilename=|DataDirectory|Database1.mdf;

                                IntegratedSecurity=True;User instance=true;"))

            {

               conn.Open();

                using (SqlCommand cmd = conn.CreateCommand())

                {

                   cmd.CommandText = "select count(*) from T_Users1 where UserName=@UNand Passwor=@p";//不要用字符串拼接,当password输入’or‘1’=‘1时,会造成数据漏洞

                   cmd.Parameters.Add(new SqlParameter("UN", username));

                   cmd.Parameters.Add(new SqlParameter("P",password ));

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

                   if (i>0)

                   {

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

                   }

                   else

                   {

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

                   }

                }

            }

         防止注入漏洞攻击的方法:不适用SQL语句拼接,通过参数赋值

三、读取配置中的连接字符串        

    ComBox的显示值:Items.Add的参数时Object类型,可以设置DisplayMember属性设定显示的属性,通过SelectItem属性取得到就是选择的条目对应的对象。例如:取出的Object,怎么转换成对应的类型?变量名只是“标签”。显示的值和实际的对象不一样,在asp中也有相同的东西

        创建一个ProvinceItem类,将数据填充在这个对象中添加到ComBox

        将连接字符串写在代码中的缺点:多次重复,违反了DRYDon’t Repeat Yourself)原则;如果要修改连接字符串就要修改代码。将连接字符串写在APP.Config中:

        添加App.config文件:添加 新建项 常规应用程序配置文件。App.Config.net的通用配置文件,在asp中也同样适用、

        App.Config中添加connectionString段,添加一个add项,用name属性起一个名字比如DBConnstr connectionString属性指定连接字符串

        在“引用”节点上点击右键“添加引用”,找到System.configuration。不是所有.net中的类都能直接调用,类所在的Assembly要被添加到项目中才可以

        ConfigurationManager.ConnectionString[“DBConnStr”].ConnectionString得到连接字符串

        如何在部署的程序中修改配置:打开.exe文件目录下的config文件就可以了

---------------------- Windows Phone 7手机开发.Net培训、期待与您交流! ---------------------- 详细请查看: http://edu.csdn.net/heima/
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值