黑马程序员(12)--执行多条查询结果ExecuteReader()、参数化查询以便防止SQL注入漏洞攻击、DataSet离线数据集、连接字符串放到配置文件中、自己编写Sqlhelper以及改进

Windows Phone 7手机开发.Net培训



01执行多条查询结果ExecuteReader()

 
private void button1_Click(object sender, RoutedEventArgs e)
        {


            using (SqlConnection conn = new 


SqlConnection("Data Source=.;Initial 


Catalog=mydb2;User ID=sa;Password=123456"))
            {
                conn.Open();
                using (SqlCommand cmd = conn.CreateCommand())
                {
                    cmd.CommandText = "select * from T_employee where FAge<100";
                    using (SqlDataReader reader = cmd.ExecuteReader())//查询结果只放到数据库中,而不占用客户端。查询完成之后,有一个相当于指针的指针放到最开始之前的一格,每调用reader一次指针下一条,当移到最后一条之后时,就返回true。
                    { 
                    while(reader.Read())
                    {
                        string name=reader.GetString(1);//1是指的在查询结果中的第1列
                        MessageBox.Show(name);
                    }
                   
                    }
                }
                MessageBox.Show("execute accomplish");
            }
        }






02参数化查询以便防止SQL注入漏洞攻击


 using (SqlConnection conn = new SqlConnection("Data Source=.;Initial Catalog=mydb2;User ID=sa;Password=123456"))
            {
                
                conn.Open();
                using (SqlCommand cmd = conn.CreateCommand())
                {
                    
                    //cmd.CommandText = "select FAge from T_employee where FName='"+txtName.Text+"'";//这种方式输入1'or'1'='1会造成SQL注入漏洞。
                    cmd.CommandText = "select FAge from T_employee where FName=@Name or FAge>@age";//@Name是占位符,表示待会要往这里填
                    //cmd.Parameters.AddWithValue("@Name", txtName.Text);//可以,但是推荐下面的方法
                    cmd.Parameters.Add(new SqlParameter("@Name", txtName.Text));//给@Name的值设置为文本框的值。
                    cmd.Parameters.Add(new SqlParameter("@age", txtAge.Text));
                    
                    //只能用在刚才、inset into……value(@name.@Age)或者delect……where id=@ID,总之@参数不能用来替换表名、字段名、select之类的关键字。
                    using (SqlDataReader reader = cmd.ExecuteReader())
                    { 
                        while(reader.Read())
                         {
                             int age=reader.GetInt32(0);
                             MessageBox.Show(age.ToString());
                          }
                   
                    }
                }
                MessageBox.Show("execute accomplish");
                
            }








03DataSet离线数据集
SQLDataReader是连接相关的,SqlDataReader中的查询结果并不是放到程序中的,而是放在数据库服务器中,SqlDataReader只是相当于放了一个指针(游标),只能读取当前游标指向的行,一旦连接断开就不能再读取。这样做大的好处是无论查询结果有多少条,对程序占用的内存都几乎没有影响。但是如果数据量如果不是很大,就可以将数据拿到客户端。DataSet离线数据集可以减小数据区的压力。


private void button2_Click(object sender, RoutedEventArgs e)
        {
             using (SqlConnection conn = new SqlConnection("Data Source=.;Initial Catalog=mydb2;User ID=sa;Password=123456"))
            {
                conn.Open();
                using (SqlCommand cmd = conn.CreateCommand())
                {
                    cmd.CommandText = "select * from T_employee where FAge<@age";
                    cmd.Parameters.Add(new SqlParameter("@age", 30));
                    SqlDataAdapter adaper = new SqlDataAdapter(cmd);//SqlDataAdapter是帮我们把SqlCommand查询结果填充到DataSet中的类
                    DataSet dataset = new DataSet();//相当于本地的一个负载集合(List<int>)
                    adaper.Fill(dataset);//Fill把查询结果填充到DataSet中


                    DataTable table = dataset.Tables[0];
                    DataRowCollection rows = table.Rows;
                    for (int i = 0; i < rows.Count; i++)
                    {
                        DataRow row = rows[i];
                        int age = (int)row["FAge"];
                        string name = (string)row["FName"];
                        MessageBox.Show(name + "," + age);
                    }
                 }
             }


        }










04连接字符串放到配置文件中


1将连接字符串添加到应用程序配置文件。添加》新建项》应用程序配置文件(默认文件名值App1.config,但是这样运行的时候会报错“连接字符串未将对象引用设置到对象的实例”,要把名字改成App.config切放到最上层)》添加节点
<configuration>
  <connectionStrings>
    <add name="dbConnStr" 
connectionString="Data Source=.;Initial Catalog=mydb2;User ID=sa;Password=12346"/>
  </connectionStrings>
</configuration>

2添加引用

解决方案管理器-引用》添加》.net》System.configuration


3编写语句

 string cinnStr = ConfigurationManager.ConnectionStrings["dbConnStr"].ConnectionString;


给用户的时候要给a.exe和相应的a.exe.config。连接变了之后改config文件就行了。asp.net里是web.config






05自己编写Sqlhelper以及改进
      


class SqlHelper
{        private static string connStr = ConfigurationManager.ConnectionStrings["dbConnStr"].ConnectionString;//static程序初始化时运行。
          只用来查询执行结果比较小的sql
        //public static DataSet ExecuteDataSet(string sql)
        //{
        //    using (SqlConnection conn = new SqlConnection(connStr))
        //    {
        //        conn.Open();
        //        using (SqlCommand cmd = conn.CreateCommand())
        //        {
        //            cmd.CommandText = sql;
        //            SqlDataAdapter adapter = new SqlDataAdapter(cmd);
        //            DataSet dataset = new DataSet();
        //            adapter.Fill(dataset);
        //            return dataset;
        //        }
        //    }
        //}


        public static DataSet ExecuteDataSet(string sql,SqlParameter[] parameters)
        {
            using (SqlConnection conn = new SqlConnection(connStr))
            {
                conn.Open();
                using (SqlCommand cmd = conn.CreateCommand())
                {
                    cmd.CommandText = sql;
                    cmd.Parameters.AddRange(parameters);
                    SqlDataAdapter adapter = new SqlDataAdapter(cmd);
                    DataSet dataset = new DataSet();
                    adapter.Fill(dataset);
                    return dataset;
                }
            }
        }    
}




使用时:


private void btSql_Click(object sender, RoutedEventArgs e)
        {
            //SqlHelper.ExecuteNonQuery("insert into T_employee(Name,Age) values('lily',26)");
            
            
            DataSet ds=SqlHelper.ExecuteDataSet("select * from T_employee where Age>@age ",new SqlParameter[]{new SqlParameter("@age",26)});
            foreach (DataRow row in ds.Tables[0].Rows)
            {
                string name = (string)row["Name"];
                MessageBox.Show(name);
            }
        
        }






06长度可变参数


 class Program
    {
        static void Main(string[] args)
        {
            int i = Sum(new int[] { 3, 5, 4, 2, 7 });
            Console.WriteLine(i);


            int j = Sum(3, 5, 74, 65, 3);
            Console.WriteLine(j);
            Console.ReadKey();


        }
        static int Sum(params int[] sums)//params把最后的所有参数拼到一个数组里。所有必须放到所有参数的最后一个。
        {
            int result = 0;
            foreach (int i in sums)
            {
                result += i;
            }
            return result;
        }
    }




更改后的ExecuteDataTable:
 public static DataTable ExecuteDataTable(string sql,params SqlParameter[] parameters)
        {
            using (SqlConnection conn = new SqlConnection(connStr))
            {
                conn.Open();
                using (SqlCommand cmd = conn.CreateCommand())
                {
                    cmd.CommandText = sql;
                    cmd.Parameters.AddRange(parameters);
                    SqlDataAdapter adapter = new SqlDataAdapter(cmd);
                    DataSet dataset = new DataSet();
                    adapter.Fill(dataset);
                    return dataset.Tables[0];
                }
            }
        }


使用:
private void btSql_Click(object sender, RoutedEventArgs e)
        {
            //SqlHelper.ExecuteNonQuery("insert into T_employee(Name,Age) values('lily',26)");
            
            
            //DataTable table=SqlHelper.ExecuteDataTable("select * from T_employee where Age>@age ",new SqlParameter[]{new SqlParameter("@age",26)});
            DataTable table=SqlHelper.ExecuteDataTable("select * from T_employee where Age>@age or Name=@name",new SqlParameter("@age",30),new SqlParameter("@name","lily"));
            foreach (DataRow row in table.Rows)
            {
                string name = (string)row["Name"];
                MessageBox.Show(name);
            }
            MessageBox.Show("accomplesh");
        }









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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值