ADO.NET中SQL绑定变量方式总结
最近在项目上遇到几个问题,关于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绑定变量方式总结的更多相关文章
- Oracle 项目中 SQL 脚本更新方式
DECLARE hasVersion ); dbVersion ); BEGIN ) INTO hasVersion FROM ELB_SETTINGS E WHERE E.KEY='dbVersio ...
- ADO.NET中SQL Server数据库连接池
连接到数据库服务器通常由几个需要很长时间的步骤组成. 必须建立物理通道(例如套接字或命名管道),必须与服务器进行初次握手,必须分析连接字符串信息,必须由服务器对连接进行身份验证,必须运行检查以便在当前 ...
- [转]SQL注入漏洞及绑定变量浅谈
1.一个问题引发的思考 大家在群里讨论了一个问题,奉文帅之命写篇作文,且看: String user_web = "user_web" String sql = "upd ...
- SQL优化 | Oracle 绑定变量
之前整理过一篇有关绑定变量的文章,不太详细,重新补充一下. Oracle 绑定变量 http://www.cndba.cn/Dave/article/1275 一.绑定变量 bind variable ...
- Oracle SQL调优之绑定变量用法简介
目录 一.SQL执行过程简介 二.绑定变量典型用法 2.1.在SQL中绑定变量 2.2.在PL/SQL中使用绑定变量 2.3.PL/SQL批量绑定变量 2.4.Java代码里使用绑定变量 最近在看&l ...
- PL/SQL之--变量
一.PL/SQL 简介 PL/SQL也是一种程序语言,叫做过程化SQL语言(Procedural Language/SQL).PL/SQL是oracle对sql语句的一种扩展,在普通SQL语句的使用上 ...
- MySQL高级特性——绑定变量
从MySQL 4.1 版本开始,就支持服务器端的绑定变量,这大大提高了客户端和服务器端数据传输的效率 介绍 当创建一个绑定变量 SQL 时,客户端会向服务器发送一个SQL语句的原型.服务器端收到这个S ...
- ORACLE获取SQL绑定变量值的方法总结
本文总结一下ORACLE数据库中如何获取SQL绑定变量值的方法,在SQL优化调优过程中,经常会用到这方面的知识点.在此梳理.总结一下,方面日后查找.翻阅. 方法1:查询V$SQL V$SQL视图中 ...
- MSSQL2012中SQL调优(SQL TUNING)时CBO支持和常用的hints
虽然当前各关系库CBO都已经非常先进和智能,但因为关系库理论和实现上的限制,CBO在特殊场景下也会给出次优甚至存在严重性能问题的执行计划,而这些场景中,有一部分只能或适合通过关系库提供的hints来进 ...
- OTL翻译(5) -- otl_stream流相关绑定变量
声明绑定变量 本章节将详细的说明如何在otl_stream流里面声明绑定变量. SQL语句.SQL语句块或存储过程在程序里面使用的时候总是带有占位符.OTL里面带有一个小的解析器用来解析这些占位符,并 ...
随机推荐
- 基于开源IM即时通讯框架MobileIMSDK:RainbowChat v10.0版已发布
关于MobileIMSDK MobileIMSDK 是一套专门为移动端开发的开源IM即时通讯框架,超轻量级.高度提炼,一套API优雅支持UDP .TCP .WebSocket 三种协议,支持iOS.A ...
- .NET Core + Kafka 开发指南
什么是Kafka Apache Kafka是一个分布式流处理平台,由LinkedIn开发并开源,后来成为Apache软件基金会的顶级项目.Kafka主要用于构建实时数据管道和流式应用程序. Kafka ...
- 查看Android是否开机启动进入桌面
adb 或者 串口终端 getprop sys.boot_completed 返回空代表没有进入桌面返回1代表已进入桌面
- Quartz调度框架详解、运用场景、与集群部署实践
以下将分别从Quartz架构简介.集群部署实践.Quartz监控.集群原理分析详解Quartz任务调度框架. Quartz简介 Quartz是Java领域最著名的开源任务调度工具,是一个任务调度框架, ...
- 开源搜索引擎Lucene、Solr、Sphinx等优劣势比较
以下重点介绍最常用的开源搜素引擎: 1.Lucene 2.Solr 3.Elasticsearch 4.Sphinx 5.各自的特点和优劣势选型比较 开源搜索引擎分类 主要分为两类:Java开发和C+ ...
- linux:安装php7.x
参考:链接 更新yum源 CentOS/RHEL 7.x: rpm -Uvh https://dl.fedoraproject.org/pub/epel/epel-release-latest-7.n ...
- 【译】轻松评估 AI 应用程序的质量
原文 | Wendy Breiding 翻译 | 郑子铭 在构建利用 AI 的应用程序时,能够有效地评估 SLM(小型语言模型)或 LLM(大型语言模型)的响应从未如此重要. 评估是指评估 AI 模型 ...
- 分布式事务之2PC两阶段提交
1. 分布式事务概述 1.1 问题背景 在分布式系统中,业务操作可能跨越多个服务或数据库(如订单服务.库存服务.支付服务),传统单机事务(ACID)无法满足跨网络节点的数据一致性需求. 网络不可靠:服 ...
- 使用C# 调用deepseek api接口,来实现正常访问
先上图,结果如图 先去官方网站充值api费用,默认 对应的C#代码封装 1 public class DeepSeekHelper 2 { 3 private static readonly Http ...
- DeepSeek 不再卡顿,从此告别服务器繁忙,请稍后再试(建议收藏!)
大家好,我是六哥. 由于DeepSeek真的太火了,也许你也跟我一样,常会遇到这样的情况: 真的让人抓狂,10条回复里常常有9条是"服务器blabla,请稍后重试",看到这话,就问 ...