MySqlParameter_防注入参数配置

本文详细介绍了在C#中使用MySqlParameter进行数据库操作时如何防止SQL注入,包括MySqlParameter的构造函数、参数传入方式以及ParameterDirection参数方向的使用。通过示例展示了Input、Output、InputOutput和ReturnValue四种模式的配置与应用,强调了在MySQL存储过程中的注意事项。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

目录

一、前提准备

二、MySqlParameter 构造函数使用

三、MySqlParameter 参数传入

四、ParameterDirection 参数方向的使用

1、 ParameterDirection.Input输入模式

2、 ParameterDirection.Output输出模式

3、 ParameterDirection.InputOutput输入和输出模式

4、 ParameterDirection.ReturnValue返回模式


涉及知识点:MySqlParamete -- MySQL的存储过程 -- MySQL的function

一、前提准备

1、配置App.config文件  -- 若文件未找到,则 Ctrl+Shift+A --> 添加 " 应用程序配置文件 " 

	<connectionStrings>
		<add name="connStr"
		     connectionString="server=localhost;database=mysql_student;uid=root;pwd=123456"
			 providerName="MySql.Data.MySqlClient"/>
	</connectionStrings>

2、导入Nuget包 

3、引入using

using MySql.Data.MySqlClient;
using System;
using System.Configuration;
using System.Data;

4、创建MySQL 数据表 

create table tb_student_information
(
    id int,
    name varchar(10),
    no int
);
insert into tb_student_information
values (1,'小白',20),
       (2,'小红',30),
       (3,'小兰',35);

二、MySqlParameter 构造函数使用

需要配置的参数:

MySqlParameter.ParameterName = "@Name"  ; //参数名称

MySqlParameter.Value = "小白";        //参数值 

MySqlParameter.MySqlDbTyoe = MySqlDbType.VarChar;        //参数类型

MySqlParameter.Size = 10;  //参数占10个字节 

MySqlParameter.Direction = ParameterDirection.Input; //默认输入状态

以下是MySqlParameter的五种构造方法:

    internal class Program
    {
        static void Main(string[] args)
        {
            //param1.Direction 默认输入模式
            //1.不带参数
            MySqlParameter param1 = new MySqlParameter();
            param1.ParameterName = "@Name";  //参数名称
            param1.Value = "小白";    //参数的值
            param1.MySqlDbType = MySqlDbType.VarChar;  //参数类型
            param1.Size = 10; //10个字节
            param1.Direction = System.Data.ParameterDirection.ReturnValue;
            //2.参数 值
            MySqlParameter param2 = new MySqlParameter("@Name", "小白");
            param2.MySqlDbType = MySqlDbType.VarChar;
            param2.Size = 10;
            //3.参数 类型
            MySqlParameter param3 = new MySqlParameter("@Name", MySqlDbType.VarChar);
            param3.Value = "小白";
            param3.Size = 10;
            //4.参数 类型 大小
            MySqlParameter param4 = new MySqlParameter("@Name", MySqlDbType.VarChar, 10);
            param4.Value = "小白";
            //5.参数 类型 大小 源列名(对应DataTable中的列名)
            MySqlParameter param5 = new MySqlParameter("@Name", MySqlDbType.VarChar, 10, "UName");

            Console.WriteLine("Hello World!");
        }
    }

三、MySqlParameter 参数传入

cmd.Parameters.Add();//添加单个

cmd.Parameters.AddWithValue(); //添加单个(推荐)

cmd.Parameters.AddRange(); //添加多个

以下是参数添加的4中方法:

 internal class Program
    {
        static void Main(string[] args)
        {
            //获取外部文件字符串
            string connStr = ConfigurationManager.ConnectionStrings["connStr"].ConnectionString;

            string sql = "select * from tb_student_information where name = @name";
            using (MySqlConnection connect = new MySqlConnection(connStr))
            {
                MySqlCommand cmd = new MySqlCommand(sql, connect);
                //1.普通传参数(单个)
                MySqlParameter param = new MySqlParameter("@name", "小白");
                cmd.Parameters.Add(param);
                //2.普通传参数(单个)
                cmd.Parameters.Add(new MySqlParameter("@name", "小白"));
                //3.快捷传参数(单个)(推荐)
                cmd.Parameters.AddWithValue("@name", "小白");
                //4.多个参数传入
                MySqlParameter[] parames = {
                    new MySqlParameter("@name","小白")
                };
                cmd.Parameters.AddRange(parames);
            }
            Console.WriteLine("Hello World!");
        }
    }

四、ParameterDirection 参数方向的使用

参数:

ParameterDirection.Input     -- 是默认的模式,应用于任何场合

ParameterDirection.Output  -- 应用于数据的"存储过程",  --- 获取输出的值

ParameterDirection. InputOutput  -- 应用于数据的"存储过程",   --- 值可以输入也可输出

ParameterDirection.ReturnValue -- 在SQL Sever 的"存储过程可用",但MySQL的"存储过程"不可以,只可以使用MySQL的function, ---- 获取返回值

应用“存储过程”时,需额外配置:

        cmd.CommandType = CommandType.StoredProcedure; //命令类型:存储过程

        param.Direction = ParameterDirection.InputOutput;    //参数方向

1、 ParameterDirection.Input输入模式

修改前数据库数据:

  C#对MySQL的操作: -- C#代码

internal class Program
    {
        static void Main(string[] args)
        {
            //获取外部文件字符串
            string connStr = ConfigurationManager.ConnectionStrings["connStr"].ConnectionString;

            string sql = "select * from tb_student_information where name = @name";

            using (MySqlConnection connect = new MySqlConnection(connStr))
            {
                MySqlCommand cmd = new MySqlCommand(sql, connect);

                MySqlParameter param = new MySqlParameter("@name", MySqlDbType.VarChar, 10);
                param.Value = "小白";
                param.Direction = ParameterDirection.Input;  //参数方向传入

                cmd.Parameters.Add(param);

                connect.Open();
                object obj = cmd.ExecuteScalar();
                connect.Close();

                Console.WriteLine(obj.ToString());
            }
            Console.WriteLine("Hello World!");
        }
    }

 结果: 

2、 ParameterDirection.Output输出模式

修改前数据库数据:

 MySQL数据库中的数据过程配置:  -- MySQL 代码

delimiter $$
create procedure GetName(id int, out name varchar(10))
begin
    select tb_student_information.name into name
    from tb_student_information
    where tb_student_information.id = id;
end $$

 C#对MySQL的操作: -- C#代码

 internal class Program
    {
        static void Main(string[] args)
        {
            //获取外部文件字符串
            string connStr = ConfigurationManager.ConnectionStrings["connStr"].ConnectionString;

            using (MySqlConnection connect = new MySqlConnection(connStr))
            {
                MySqlCommand cmd = new MySqlCommand("GetName", connect);
                cmd.CommandType = CommandType.StoredProcedure; //命令类型:存储过程

                cmd.Parameters.AddWithValue("id", 2);

                MySqlParameter param = new MySqlParameter("name", MySqlDbType.VarChar, 10);
                param.Direction = ParameterDirection.Output; //参数方向:输出

                cmd.Parameters.Add(param);

                connect.Open();
                cmd.ExecuteScalar();
                connect.Close();

                Console.WriteLine(param.Value.ToString());
            }
            Console.WriteLine("Hello World!");
        }
    }

结果显示:

3、 ParameterDirection.InputOutput输入和输出模式

修改前数据库数据:

 MySQL数据库中的数据过程配置:  -- MySQL 代码

delimiter $$
create procedure GetName1(id int,inout name varchar(10))
begin
    declare sname varchar(10) default 'no';
    select tb_student_information.name into sname
    from tb_student_information
    where tb_student_information.id = id;
    set name = concat(sname,name);  #拼接字符串
end $$

 C#对MySQL的操作: -- C#代码

    internal class Program
    {
        static void Main(string[] args)
        {
            //获取外部文件字符串
            string connStr = ConfigurationManager.ConnectionStrings["connStr"].ConnectionString;

            using (MySqlConnection connect = new MySqlConnection(connStr))
            {
                MySqlCommand cmd = new MySqlCommand("GetName1", connect);
                cmd.CommandType = CommandType.StoredProcedure; //命令类型:存储过程

                cmd.Parameters.AddWithValue("id", 2);

                MySqlParameter param = new MySqlParameter("name", MySqlDbType.VarChar, 10);
                param.Value = "同学";
                param.Direction = ParameterDirection.InputOutput;

                cmd.Parameters.Add(param);

                connect.Open();
                cmd.ExecuteScalar();
                connect.Close();

                Console.WriteLine(param.Value.ToString());
            }
            Console.WriteLine("Hello World!");
        }
    }

结果显示:

4、 ParameterDirection.ReturnValue返回模式

注要事项: 

        1、SQL sever 的"存储过程" 只可以返回int类型 
        2、MySQL 的"存储过程",没有return,只能用function, 但他可以获取所有类型                      3、(第一次使用function可能会出现)这里创建函数时可能会遇到错误:ERROR 1418 (HY000):
This function has none of DETERMINISTIC, NO SQL, or READS SQL DATA in its declaration and binary logging is enabled(you* might* want to use the less safe log_bin_trust_function_creators variable)

          解决方式: set global log_bin_trust_function_creators=TRUE;

 修改前数据库数据:

 MySQL数据库中的数据过程配置:  -- MySQL 代码

create function returnId( sid int) returns varchar(10)
begin
declare sname varchar(10);
select tb.name into sname
from tb_student_information as tb
where tb.id = sid;
return sname;
end $$

 C#对MySQL的操作: -- C#代码

    internal class Program
    {
        static void Main(string[] args)
        {
            //获取外部文件字符串
            string connStr = ConfigurationManager.ConnectionStrings["connStr"].ConnectionString;

            using (MySqlConnection connect = new MySqlConnection(connStr))
            {
                MySqlCommand cmd = new MySqlCommand("returnId", connect);
                cmd.CommandType = CommandType.StoredProcedure; //命令类型:存储过程

                MySqlParameter[] parames = {
                    new MySqlParameter("sid",1),
                    new MySqlParameter("sname",MySqlDbType.VarChar,10)
                };
                parames[1].Direction = ParameterDirection.ReturnValue; //参数方向:返回值

                cmd.Parameters.AddRange(parames);

                connect.Open();
                cmd.ExecuteScalar();
                connect.Close();

                Console.WriteLine(parames[1].Value.ToString());
            }
            Console.WriteLine("Hello World!");
        }
    }

结果显示:


如有错误,烦请批评指正

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值