最近在项目上遇到几个问题,关于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
BEGIN
SELECT * 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

ADO.NET中SQL绑定变量方式总结的更多相关文章

  1. Oracle 项目中 SQL 脚本更新方式

    DECLARE hasVersion ); dbVersion ); BEGIN ) INTO hasVersion FROM ELB_SETTINGS E WHERE E.KEY='dbVersio ...

  2. ADO.NET中SQL Server数据库连接池

    连接到数据库服务器通常由几个需要很长时间的步骤组成. 必须建立物理通道(例如套接字或命名管道),必须与服务器进行初次握手,必须分析连接字符串信息,必须由服务器对连接进行身份验证,必须运行检查以便在当前 ...

  3. [转]SQL注入漏洞及绑定变量浅谈

    1.一个问题引发的思考 大家在群里讨论了一个问题,奉文帅之命写篇作文,且看: String user_web = "user_web" String sql = "upd ...

  4. SQL优化 | Oracle 绑定变量

    之前整理过一篇有关绑定变量的文章,不太详细,重新补充一下. Oracle 绑定变量 http://www.cndba.cn/Dave/article/1275 一.绑定变量 bind variable ...

  5. Oracle SQL调优之绑定变量用法简介

    目录 一.SQL执行过程简介 二.绑定变量典型用法 2.1.在SQL中绑定变量 2.2.在PL/SQL中使用绑定变量 2.3.PL/SQL批量绑定变量 2.4.Java代码里使用绑定变量 最近在看&l ...

  6. PL/SQL之--变量

    一.PL/SQL 简介 PL/SQL也是一种程序语言,叫做过程化SQL语言(Procedural Language/SQL).PL/SQL是oracle对sql语句的一种扩展,在普通SQL语句的使用上 ...

  7. MySQL高级特性——绑定变量

    从MySQL 4.1 版本开始,就支持服务器端的绑定变量,这大大提高了客户端和服务器端数据传输的效率 介绍 当创建一个绑定变量 SQL 时,客户端会向服务器发送一个SQL语句的原型.服务器端收到这个S ...

  8. ORACLE获取SQL绑定变量值的方法总结

      本文总结一下ORACLE数据库中如何获取SQL绑定变量值的方法,在SQL优化调优过程中,经常会用到这方面的知识点.在此梳理.总结一下,方面日后查找.翻阅. 方法1:查询V$SQL V$SQL视图中 ...

  9. MSSQL2012中SQL调优(SQL TUNING)时CBO支持和常用的hints

    虽然当前各关系库CBO都已经非常先进和智能,但因为关系库理论和实现上的限制,CBO在特殊场景下也会给出次优甚至存在严重性能问题的执行计划,而这些场景中,有一部分只能或适合通过关系库提供的hints来进 ...

  10. OTL翻译(5) -- otl_stream流相关绑定变量

    声明绑定变量 本章节将详细的说明如何在otl_stream流里面声明绑定变量. SQL语句.SQL语句块或存储过程在程序里面使用的时候总是带有占位符.OTL里面带有一个小的解析器用来解析这些占位符,并 ...

随机推荐

  1. (default-compile) on project app: Fatal error compiling: 无效的标记: --release -> [Help 1]

    <plugins> <plugin> <artifactId>maven-compiler-plugin</artifactId> <versio ...

  2. Linux sudo 提权之软链接攻击

    软链接提权的原理 低权限用户能够以 root 用户的权限执行某个脚本,该脚本中又使用到了诸如 chown 等命令修改文件的权限,且该文件又能够被低权限的用户所修改.因此低权限的用户可以删除该文件,然后 ...

  3. Qt开发经验小技巧91-100

    数据库处理一般建议在主线程,如果非要在其他线程,务必记得打开数据库也要在那个线程,即在那个线程使用数据库就在那个线程打开,不能打开数据库在主线程,执行sql在子线程,很可能出问题. 新版的QTcpSe ...

  4. CF1763C Another Array Problem

    人类智慧题.harmis_yz 不会. 题意 \(\tt{Link}\) 给定一个序列 \(\{a_n\}\),可以进行若干次操作,每次可以选择 \(i,j(1 \le i < j \le n) ...

  5. 在已有的项目中使用vuiew ui库

    官方提供了三种方式,但是我觉得在已有的项目中使用是比较常见的 我在刚开始使用的时候不知道如何使用,我希望这个对大家有点帮助,特此来记录下! 我用的是创建了一个uview插件的项目,然后把里面uview ...

  6. BOF编写-修改时间戳

    模板配置 跟着网上的教程使用evilashz师傅的模板,下载模板解压至vs的模板目录: %UserProfile%\Documents\Visual Studio 2022\Templates\Pro ...

  7. (四).NET6.0程序部署到Docker上

    1.确保安装Docker 2.把需要部署到Docker上面的项目,咱们先添加Docker的支持,启动项目右键 -> 添加 -> Docker支持,选择 Linux 然后会自动生成Docke ...

  8. R语言系列—Rstudio简介和安装

    同学们,大家好,今天继续更新R语言系列.今天我们开始讲R语言的集成开发环境(IDE)-Rstudio,这里会对Rstudio及其安装进行介绍,感兴趣的同学可以重点关注一下. Rstudio简介 Rst ...

  9. java线程用法和区别

    从操作系统的角度讲,os会维护一个ready queue(就绪的线程队列).并且在某一时刻cpu只为ready queue中位于队列头部的线程服务.但是当前正在被服务的线程可能觉得cpu的服务质量不够 ...

  10. biancheng-Spring Cloud Alibaba Nacos

    参考http://c.biancheng.net/springcloud/what-is-alibaba.html http://c.biancheng.net/springcloud/nacos.h ...