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里面带有一个小的解析器用来解析这些占位符,并 ...
随机推荐
- Qt编写的项目作品14-智能安防集中管理平台
一.功能特点 同时集成了楼宇对讲.住户报警.门禁控制.公共报警.视频监控等模块. 系统管理部分包括系统配置.对讲配置.住户配置.公共配置.监控配置.地图管理.视频联动.用户管理.区域管理. 图形化的实 ...
- springboot~多节点应用里的雪花算法唯一性
雪花算法的唯一性,在单个节点中是可以保证的,对应kubernetes中的应用,如果是横向扩展后,进行多副本的情况下,可能出现重复的ID,这需要我们按着pod_name进行一个workId的生成,我还是 ...
- 意外之喜——黑夜 CrossFire!!!
在日常逛L站时,偶然发现了"友链"功能,机缘巧合下进入了specialhua的博客,又被吸引着点进了其中一篇博客,于是便通过specialhua的博客看到了黑夜的这篇文章,感觉就像 ...
- CDS标准视图:测量文档数据 I_MeasurementDocumentData
视图名称:测量文档数据 I_MeasurementDocumentData 视图类型:基础视图 视图代码: 点击查看代码 @AbapCatalog.sqlViewName: 'IMEASDOCDATA ...
- jwt-shiro-springsecurity-oauth2对比
1 实现token的方式概述 在cookie\session\token辨析一文已经知道了token这个概念,里面简单说明了token的组成就是数据+签名,给出了token实现身份验证的流程,并且详细 ...
- Golang-流程控制4
http://c.biancheng.net/golang/flow_control/ Go语言if else(分支结构) 在Go语言中,关键字 if 是用于测试某个条件(布尔型或逻辑型)的语句,如果 ...
- 将github个人访问令牌与TortoiseSVN一起使用
最近用TortoiseSVN提交到Github身份验证,总是提示无效的用户名密码,反复确认密码没输入错的.但是就是提交不了(能获取). 报错如下: 错误: No more credentials or ...
- Linux配置Golang 依赖包安装
Linux Golang安装 安装版本查看,可自行选择 https://studygolang.com/articles/13957?fr=sidebar 此次选择 go1.14.2.linux-am ...
- C-读写文件和输出输出
问题 一直对C操作文件(读写)很模糊,不是很清楚,现系统的梳理下,彻底弄明白 说明: 这下面的程序在VS中编写和调试 基本知识 -----打开文件----- fopen() 可以使用fopen()函数 ...
- Linux基础:从命令行管理文件系统权限