ado.net中SqlDataReader

注意防sql注入知识点,数据库很简单,这里不提供代码。

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Data;
using System.Windows.Documents;
using System.Windows.Input;
using System.Windows.Media;
using System.Windows.Media.Imaging;
using System.Windows.Shapes;
using System.Data.SqlClient;

namespace WPFDemo01
{
    /// <summary>
    /// ADOBasic.xaml 的交互逻辑
    /// </summary>
    public partial class ADOBasic : Window
    {
        public ADOBasic()
        {
            InitializeComponent();
        }

        private void btnLink_Click(object sender, RoutedEventArgs e)
        {
             //对实现了IDisposible接口的,使用using关键字,它能控制对资源的释放,具体的自行百度。语法是
            //using(类型d = new (这里面指的是创建对象)......){.................}他可以自动回收资源,不用自己关闭数据库
            //以后都这么写,conn.close();的方法前面程序挂掉了,那么数据库就没有关,这样时间久了会造成数据库泄露

            //SqlConnection建立和数据库的连接



            //1.第一种,
            //ExecuteNonQuery()通常用来执行Update,Delete,Insert语句,就如单词所示NonQuery,非查询!
            //using (SqlConnection conn = new SqlConnection("Data Source=.;Initial Catalog=DemoDB;User ID=sa;Password=540469505")) 
            //{
            //    conn.Open();
            //    MessageBox.Show("数据库连接成功!");
            //    //通过连接创建一个向数据库发命令(command)的对象
            //    using(SqlCommand cmd = conn.CreateCommand())
            //    {
            //        //CommandText为要执行的sql语句
            //        cmd.CommandText = "insert into T_Students(id,name,age,aihao,height) values (101,'刘亦菲',23,'北京吧',170);";
            //        cmd.ExecuteNonQuery();  //开始执行
            //    }
            //}





            //2.第二种,
            //查询用ExecuteScalar()返回的是一行一列的值
            //using (SqlConnection conn = new SqlConnection("Data Source=.;Initial Catalog=DemoDB;User ID=sa;Password=540469505")) 
            //{
            //    conn.Open();
            //    using(SqlCommand cmd = conn.CreateCommand())
            //    {
            //        //例1:
            //        //cmd.CommandText="select count(*) from T_Students";
            //        //ExecuteScalar()返回的是一行一列的值使用该类型,意思就是查询的结果只有一个,
            //        //因为其返回的是object类型,所以根据我们返回的实际类型可以进行强制类型转换,
            //        //这里一定要写对对应类型,比如数据库中的varchar类型对应C#中的是string,
            //        //bigint类型对应的是long类型
            //        //int i =(int)cmd.ExecuteScalar(); 
            //        //MessageBox.Show("查询到结果数为:"+i+"条");

            //        //例2:
            //        //cmd.CommandText = "select 'dafa'";
            //        //string s = (string)cmd.ExecuteScalar();
            //        //MessageBox.Show(s);


            //        //例3:
            //        //本数据库中自增长字段为addId,其值是数据库自动分配的,
            //        //那么我们如何得知本数据的addId是多少呢?
            //        cmd.CommandText = "insert into T_Students(id,name,age,aihao,height) output inserted.addId values (10000,'离死',102,'',80)";
            //        int i = (int)cmd.ExecuteScalar();
            //        MessageBox.Show("当前addId为:"+i);
            //    }
            //}

           
            
            
            
            //3.第三种,
            //执行有多行结果的结果集用ExecuteReader,同样是实现IDisposible接口的
            //SqlDataReader reader = cmd.ExecuteReader();.....
            //while(reader.Reader())
            //{
            //Console.writeLine(reader.GetString(1));
            //}这里要和注意,该查询结果是放在数据库中的,没有放到
            //客户端,初始指针指向第一条数据之前,每调用一次Reader指针
            //下移一条,只要没有移到最后一条之后,就一直返回true
            //reader的GetString、GetInt32的方法只接受整数参数,
            //也就是序号,用GetOrdinal方法根据列名动态得到序号
            using(SqlConnection conn = new SqlConnection("Data Source=.;Initial Catalog=DemoDB;User ID=sa;Password=540469505"))
            {
                conn.Open();
                using (SqlCommand cmd = conn.CreateCommand()) 
                {
                    cmd.CommandText = "select * from T_Students;";
                    using (SqlDataReader reader = cmd.ExecuteReader()) 
                    {
                        while(reader.Read())
                        {
                            string name = reader.GetString(1);  //根据数据库返回值类型写C#对应类型,这里面的参数表示返回该行的第几列
                            int age = reader.GetInt32(2);   //这里的类型对应有点麻烦,要注意
                            MessageBox.Show("名字是:"+name+"   "+"年龄是:"+age);
                        }
                    }
                }
            }

            MessageBox.Show("执行完成~!");
        }




        private void btnSearch_Click(object sender, RoutedEventArgs e)
        {
            using(SqlConnection conn = new SqlConnection("Data Source=.;Initial Catalog=DemoDB;User ID=sa;Password=540469505"))
            {
                conn.Open();
                using(SqlCommand cmd = conn.CreateCommand())
                {
                    //此字符串拼接方法,如果这里输入“1' or '1'='1”,则会查出所有的结果,造成了SQL注入漏洞
                    //cmd.CommandText = "select * from T_Students where name = '"+txtPerson.Text+"'";

                    //@Name是占位符,表示我这里需要一个Name的值,这样看起来更有意义,但是name这个词可以换成其他的任意词
                    cmd.CommandText = "select * from T_Students where Name=@Name or Age=@Age";
                    //用法1:
                    //cmd.Parameters.AddWithValue("@Name",txtPerson.Text);
                    //用法2:推荐使用
                    cmd.Parameters.Add(new SqlParameter("@Name",txtPerson.Text));
                    //注意如果是别的类型的注意转换类型
                    cmd.Parameters.Add(new SqlParameter("@Age", Convert.ToInt32(txtPerson.Text)));
                    //此语句也可以用在如下语句等
                    //insert into......values(@Name,@Age...)
                    //delete ...... where ID=@idAdd

                    //注意"@参数"不能用在替换表名、字段名、select之类的关键字等。
                    //如下都是不可以的!
                    //select age from @TableName..
                    //select @AgeName from table...



                    using(SqlDataReader reader = cmd.ExecuteReader())
                    {
                        while(reader.Read())
                        {
                            //GetInt32获得的是int类型
                            //GetInt64获得的是long类型(数据库中是bigint)
                            int id = reader.GetInt32(0);
                            string name = reader.GetString(1);
                            int age = reader.GetInt32(2);
                            string address = reader.GetString(3);
                            int addId = reader.GetInt32(4);
                            MessageBox.Show(id.ToString()+"   "+name+"   "+age.ToString()+"   "+address+"   "+addId.ToString());
                        }
                    }
                }
            }
        }
    }
}



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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值