知识问答

C# 中用 Sqlparameter 的两种用法

C#中使用SqlParameter是避免SQL注入攻击的重要手段之一,SqlParameter可以在传递参数的时候对参数值进行格式化和安全验证,保证代码的安全性和稳定性。下面将分别介绍SqlParameter的两种用法。

用法一:SqlParameter构造函数传参

SqlParameter类构造函数可以通过直接传递参数的形式,将参数名和参数类型传递给SqlParameter对象。示例如下:

string sql = "SELECT * FROM Users WHERE UserName = @UserName AND Age > @Age";using (SqlConnection connection = new SqlConnection(connectionString)){    connection.Open();    using (SqlCommand command = new SqlCommand(sql, connection))    {        command.Parameters.Add(new SqlParameter("@UserName", SqlDbType.NVarChar, 50) { Value = "Tom" });        command.Parameters.Add(new SqlParameter("@Age", SqlDbType.Int) { Value = 18 });        using (SqlDataReader reader = command.ExecuteReader())        {            while (reader.Read())            {                Console.WriteLine($"{reader["UserName"]}, Age:{reader["Age"]}");            }        }    }}

首先建立一个SqlCommand对象来执行查询,并将查询结果保存在SqlDataReader对象中,其中使用到了SqlParameter对象对参数进行了验证。

在此示例中,在SqlCommand对象查询语句的@UserName变量前加上了@符号,该符号是SqlCommand对象中参数名的前缀符,用于区分普通SQL语句中的变量名和参数名,其中SqlDbType.VarChar表示该参数为字符串类型,第二个参数50为该SqlParameter对象的长度,第三个参数Value是该SqlParameter对象的值。

用法二:SqlParameter的属性传参

在执行CommandExecuteXXX方法前,可以将SqlParameter对象作为Command的参数,并使用SqlParameter对象的属性对参数进行设置。示例如下:

string sql = "INSERT INTO Users(UserName, Age) VALUES (@UserName, @Age)";using (SqlConnection connection = new SqlConnection(connectionString)){    connection.Open();    using (SqlCommand command = new SqlCommand(sql, connection))    {        command.Parameters.Add("@UserName", SqlDbType.NVarChar, 50);        command.Parameters.Add("@Age", SqlDbType.Int);        command.Parameters["@UserName"].Value = "Tom";        command.Parameters["@Age"].Value = 18;        int rows = command.ExecuteNonQuery();        Console.WriteLine($"Inserted Rows: {rows}");    }}

第一步、创建一个SqlCommand对象,该对象包含了插入语句,并定义了两个参数。

第二步、为SqlCommand对象添加SqlParameter对象,分别为@UserName@Age。后面的SqlDbType、长度等属性都在添加时直接一并定义。

第三步、为SqlParameter对象赋值,并在SqlCommand对象执行ExecuteNonQuery方法时将SqlParameter对象传递为参数。

这种方法是SqlParameter的可空类型(Null)和默认值(DefaultValue)都能设置。通过SqlParameter的属性传参方式可以结合其他信息实现更多需求。

综上,在编写C#代码过程中,使用SqlParameter进行参数传递可以有效防止SQL注入攻击,在SqlCommand对象的查询语句和参数值中都采用SqlParameter对象时,SQL语句执行效率也有所提升,建议大家掌握SqlParameter的正确用法。