你好,欢迎访问我的博客!登录
当前位置:首页 - 技术 - 正文 君子好学,自强不息!

sqlparameter参数怎么传递,sqlparameter用法总结

2018-06-28 06:01:19技术admin47°c
A+ A-

关于Sql注入的基本概念,相信不需多说,大家都清楚,经典的注入语句是' or 1=1--
单引号而截断字符串,“or 1=1”的永真式的出现使得表的一些信息被暴露出来,如果sql语句是select * from 的话,可能你整个表的信息都会被读取到,更严重的是,如果恶意使用都使用drop命令,那么可能你的整个数据库得全线崩溃。

当然,现在重点不是讲sql注入的害处,而是说说如何最大限度的避免注入问题。

数据访问层

using的用法:

01.可以using System;导命名控空间

02.using 的语法结构

     using(变量类型  变量名 =new 变量类型())

     {

      }

案例:

03.using的原理

  为什么出了using所在的{},会自动回收对象。

 原因是当我们将要出{},系统自动调用了Dispose()方法。

 而在DISpose方法中是这么实现的

 2.哪些对象才可以使用Using回收!如:SqlConnection  Font 和File 也都可以使用using   因为他们实现了IDisposable接口

必须实现了IDisposable 接口的类型才可以使用using回收!  

 

  3.using回收的是托管还是非托管资源?

解析:什么是托管:所有的C#代码都是被CLR监管,

   结论是using回收的是 非托管资源

 

2.会实现参数化SQL

  解析:username: ' or 1=1 --    pwd:sb

1.使用using释放资源

Using释放的是托管资源还是非托管资源?

 

解析:非托管,C#应用托管到.NET Framework.但是他可以释放非托管资源。

1.using用法:

01.有人问,什么样的的语句可以使用using管理??

官方人士解析:稀缺的资源,才需要using管理。接着有人问:what is less resource ?例如:Connection对象,IO流。

02.Dispose方法会自动调用Close()

要想让一个类型可以通过using管理,该类型或者父类必须实现了IDisposable接口。

 

using(SqlConnection con=new SqlConnection)
{
   //本质上自动调用了Dispose方法
}

2.close()和dispose()区别?

解析:close()只是关闭连接,但是通道没有销毁,dispose()不仅把连接给关闭了,而且把通道也给销毁了。

2.会使用SqlParameter给SQL传递参数

 

1.又有人问,菜鸟写的程序,被SQL注入怎么办??

官方人士解析:

     01.要想避免,就通过参数的方式,来书写SQL语句

     02.通过存储过程,存储过程中使用参数

2.哪些年,童鞋们用过的@

解析:01.数据库中@@error:全局变量

                 @num:局部变量,程序员自己定义的变量

      02.路径转义:@"D:\"

      03.在SQL语句中进行参数化查询时,可以避免SQL注入

 

SqlParameter对象

在C#中获取存储过程的返回值

SqlParameter     para=new SqlParameter("@myresult",SqlDBType.Int);
para.Dirction=ParameterDirction.Output;
para.Value;

3.会使用ADO.NET调用存储过程,包括SqlHelper类的使用

无参的存储过程

带输入参数的存储过程

带输入和输出参数的存储过程

4.con.CrateCommand()的用法

5.SQL语句中参数化模糊查询写法

解析:like '%'+@name+'%'

private void btnOK_Click(object sender, EventArgs e)
        {            string str = "Data Source=.;initial catalog=MySchool;uid=sa;pwd=6375196";
            SqlConnection con = new SqlConnection(str);            string sql = "select * from student where studentname like '%'+@name+'%'";
            SqlCommand cmd = con.CreateCommand();
            cmd.CommandText = sql;
            cmd.Parameters.Add(new SqlParameter("@name", txtName.Text));
            SqlDataAdapter da=new SqlDataAdapter(cmd);
            DataSet ds=new DataSet();
            da.Fill(ds, "Info");
            dataGridView1.DataSource = ds.Tables[0];
        }

 

SQL注入


            //登录按钮 用户名和密码不对也可以成功登录            //1.1获取到用户名和密码
            string uname = txtName.Text;            string pwd = txtPwd.Text;            //1.2发送SQL指令,拼接SQL方式
            string str = "Data Source=.;Initial Catalog=MySchool;uid=sa;";            string sql = "select count(1) from student where studentName='" + uname + "' and Loginpwd='" + pwd + "'";
            SqlConnection con = new SqlConnection(str);
            SqlCommand cmd = new SqlCommand(sql, con);
            con.Open();            int count = Convert.ToInt32(cmd.ExecuteScalar());            if (count > 0)
            {
                MessageBox.Show("成功登录!");
            }            else
            {
                MessageBox.Show("失败!");
            } 


            //用户名输入 ' or 1=1 --  密码输入 :随便输            //SQL Server 查询的语句是  select count(1) from student where studentName='' or 1=1 --' and Loginpwd='sb

为防止SQL注入

            //1.1获取到用户名和密码
            string uname = txtName.Text;            string pwd = txtPwd.Text;            //1.2发送SQL指令,拼接SQL方式
            string str = "Data Source=.;Initial Catalog=MySchool;uid=sa;";            string sql = "select count(1) from student where studentName=@name and loginpwd=@pwd";
            SqlConnection con = new SqlConnection(str);
            SqlCommand cmd = new SqlCommand(sql, con);
            con.Open();
            SqlParameter p1 = new SqlParameter("@name", uname);
            SqlParameter p2 = new SqlParameter("@pwd", pwd);
            cmd.Parameters.Add(p1);
            cmd.Parameters.Add(p2);            try
            {                int count = Convert.ToInt32(cmd.ExecuteScalar());                if (count > 0)
                {
                    MessageBox.Show("成功登录!");
                }                else
                {
                    MessageBox.Show("失败!");
                }
            }            catch (Exception)
            {                // throw;
            }

 C#调用带输入参数的存储过程

数据库--->可编程性--->存储过程--->


//开始把Alter改成如下的createcreate procedure usp_selectInfoOutput
@sex nvarchar(32),
@count int outputasselect * from Student where gender=@sexselect @count=count(1) from studentwhere gender=@sexreturn 100

按性别加载数据

在Main窗体中写


//1.1  连接字符串
            string str = "data source=.;initial catalog=MySchool;uid=sa;";            //1.2 创建连接对象    呵呵
            SqlConnection con = new SqlConnection(str);            //创建SqlCommand 对象的第二种方式            //从Con出发            //1.3  从连接对象构建命令对象
            SqlCommand cmd = con.CreateCommand();            //1.4  给命令对象需要执行的SQL语句赋值
            cmd.CommandText = "usp_selectInfo";            //告诉SQL引擎我传递过来的是        存储过程的名称            //1.5  我们告诉SQL引擎   我通过网线送过去的字符串是  一个存储过程的名字啊
            cmd.CommandType = CommandType.StoredProcedure;            //1.6   构建存储过程的输入参数,并且给参数赋值,            //参数的名称必须和定义存储过程的输入参数名称完成相同
            SqlParameter para = new SqlParameter("@sex", "1");            //1.7   将参数和命令对象的参数集合绑定            cmd.Parameters.Add(para);            //1.8  打开数据库连接通道真正建立            con.Open();            //1.9   构建一个适配器 )卡车( 对象
            SqlDataAdapter da = new SqlDataAdapter();            //1.10  将已经初始化好的cmd对象和da绑定
            da.SelectCommand = cmd;            //1.11   构建内存中的数据集对象
            DataSet ds = new DataSet();            //1.12   从DB   拎    数据到DataSet 中的一张表
            da.Fill(ds, "StuInfo");            //1.13    将dgv的数据源指向表
            dgvList.DataSource = ds.Tables["StuInfo"];            //1.14    连接关闭
            con.Close();

同上


            string str = "Data Source=.;Initial Catalog=MySchool;uid=sa;";
            SqlConnection con = new SqlConnection(str);
            SqlCommand cmd = con.CreateCommand();
            cmd.CommandText = "usp_selectInfo";
            cmd.CommandType = CommandType.StoredProcedure;
            SqlParameter pare = new SqlParameter("@sex", "1");
            cmd.Parameters.Add(pare);
            con.Open();
            SqlDataAdapter da = new SqlDataAdapter();
            da.SelectCommand = cmd;
            DataSet ds = new DataSet();
            da.Fill(ds, "Info");
            dgvList.DataSource = ds.Tables["Info"];
            con.Close();

 C#调用带输出和返回值的存储过程

在boy's number 的输出:5 在返回值:100 在  学生框中支持模糊查询 在dgvList控件输出查询的结果

数据库--->可编程性--->存储过程--->


create procedure usp_selectInfoOutput
@sex nvarchar(32),
@count int outputasselect * from Student where gender=@sexselect @count=count(1) from studentwhere gender=@sexreturn 100

在<调用带输出和返回值的存储过程>窗体里写

 //1.1  连接字符串
            string str = "data source=.;initial catalog=MySchool;uid=sa;";            //1.2 创建连接对象    呵呵
            SqlConnection con = new SqlConnection(str);
            SqlCommand cmd = con.CreateCommand();
            cmd.CommandText = "usp_selectInfoOutput";
            cmd.CommandType = CommandType.StoredProcedure;
            SqlParameter[] paras =
            {                new SqlParameter("@sex","1"),                //凭什么    C#  @count  输出参数
                new SqlParameter("@count",SqlDbType.Int), 
                new SqlParameter("@myreturn",SqlDbType.Int) 
                //返回值            };            //为参数指定方向
            paras[1].Direction = ParameterDirection.Output;
            paras[2].Direction = ParameterDirection.ReturnValue;
            cmd.Parameters.AddRange(paras);
            SqlDataAdapter da = new SqlDataAdapter();
            da.SelectCommand = cmd;
            DataSet ds = new DataSet();
            da.Fill(ds, "StuInfo");
            dataGridView1.DataSource = ds.Tables["StuInfo"];            //填充总人数
            txtNum.Text = paras[1].Value.ToString();
            txtReturn.Text = paras[2].Value.ToString();

模糊查询  在Select控件中写

string name = '%' + "hhe" + '%';            //1.1  连接字符串
            string str = "data source=.;initial catalog=MySchool;uid=sa;";            //1.2 创建连接对象    呵呵
            SqlConnection con = new SqlConnection(str);
            SqlCommand cmd = con.CreateCommand();            //1.3  SQL脚本       like后直接跟@name            //cmd.CommandText = "select * from student where studentname like @name";            //cmd.CommandType = CommandType.Text;            //SqlParameter para = new SqlParameter("@name", '%' + txtName.Text + '%');            //同下三行代码效果一样
            cmd.CommandText = "select * from student where studentname like '%'+@name+'%'";
            cmd.CommandType = CommandType.Text;
            SqlParameter para = new SqlParameter("@name",  txtName.Text);
            cmd.Parameters.Add(para);
            SqlDataAdapter da = new SqlDataAdapter();
            da.SelectCommand = cmd;
            DataSet ds = new DataSet();
            da.Fill(ds, "StuInfo");
            dataGridView1.DataSource = ds.Tables["StuInfo"];


  选择打赏方式
微信赞助

打赏

QQ钱包

打赏

支付宝赞助

打赏

  选择分享方式
  移步手机端
sqlparameter参数怎么传递,sqlparameter用法总结

1、打开你手机的二维码扫描APP
2、扫描左则的二维码
3、点击扫描获得的网址
4、可以在手机端阅读此文章
标签:

发表评论

选填

必填

必填

选填

请拖动滑块解锁
>>


  用户登录