最近在项目上遇到几个问题,关于ADO.NET中SQL绑定变量
总结一下,分享给大家。
1. 使用 SqlParameter
(推荐方式,防止 SQL 注入)
ADO.NET 提供 SqlParameter
来绑定变量,从而提高安全性和性能。
- 防止 SQL 注入攻击。
- 支持各种数据类型,避免 SQL 解析器重新编译。
using System; using System.Data; using System.Data.SqlClient;class Program {static void Main(){string connectionString = "your_connection_string";string query = "SELECT * FROM Users WHERE Username = @Username";using (SqlConnection conn = new SqlConnection(connectionString))using (SqlCommand cmd = new SqlCommand(query, conn)){cmd.Parameters.Add(new SqlParameter("@Username", SqlDbType.NVarChar) { Value = "test_user" });conn.Open();using (SqlDataReader reader = cmd.ExecuteReader()){while (reader.Read()){Console.WriteLine(reader["Username"]);}}}} }
2. 使用 AddWithValue
方法
如果不需要显式指定参数类型,可以用 AddWithValue
直接传值:
cmd.Parameters.AddWithValue("@Username", "test_user");
需要注意以下2个问题:
AddWithValue
可能导致隐式转换,影响性能(比如int
传nvarchar
)。- 适用于简单情况,但不推荐用于复杂查询。
3. 存储过程(Stored Procedure)+ 绑定变量
绑定变量也可以用于存储过程,提高安全性和代码复用性。
- 提高 SQL 复用性和执行效率(缓存执行计划)。
- 更安全,避免 SQL 注入。
SQL Server 端(创建存储过程):
CREATE PROCEDURE GetUserByUsername@Username NVARCHAR(50) AS BEGINSELECT * FROM Users WHERE Username = @Username END
C#调用代码
cmd.CommandType = CommandType.StoredProcedure; cmd.CommandText = "GetUserByUsername"; cmd.Parameters.Add(new SqlParameter("@Username", SqlDbType.NVarChar) { Value = "test_user" });
4. 批量绑定变量(Table-Valued Parameter,TVP)
如果需要传递多个值给 SQL 查询,可以使用 TVP 绑定变量,提高批量操作的性能。
- 适用于批量查询或批量插入,提高性能。
- 避免循环执行 SQL 语句的开销。
SQL Server 端(创建 TVP 类型):
CREATE TYPE UserTableType AS TABLE (UserId INT )
C# 代码(传递多个 UserId):
DataTable userTable = new DataTable(); userTable.Columns.Add("UserId", typeof(int)); userTable.Rows.Add(1); userTable.Rows.Add(2);using (SqlCommand cmd = new SqlCommand("SELECT * FROM Users WHERE UserId IN (SELECT UserId FROM @UserTable)", conn)) {cmd.Parameters.Add(new SqlParameter("@UserTable", SqlDbType.Structured) { TypeName = "UserTableType", Value = userTable }); }
以上是C# ADO.NET 绑定变量的几种常见模式和示例代码。
周国庆
2025/3/16