C#中带参数的select语句写法

本文介绍了一种使用参数化查询的方法来从数据库中检索特定记录。通过示例代码展示了如何设置SQL参数并执行查询,这种方法有助于防止SQL注入攻击。

 select * from table where id=@id

sqlcom.Parameters.Add("@id",SqlDbType.bigint).Value = 值; 
<think>根据用户的问题,用户希望了解C#中查询和插入操作写法的对比。我将从以下几个方面进行对比: 1. 基本步骤:连接数据库、创建命令对象、执行命令、处理结果。 2. 代码示例:分别展示查询和插入的典型代码。 3. 注意事项:包括参数化查询(防止SQL注入)、资源释放等。 参考引用中提供了几种不同的代码片段,我将基于这些引用并结合最佳实践进行说明。 ### 1. 查询操作的基本步骤 - 建立数据库连接(SqlConnection) - 打开连接 - 创建SqlCommand对象(或使用SqlDataAdapter) - 执行查询(ExecuteReader或使用DataAdapter填充DataSet) - 处理查询结果(读取数据) - 关闭连接和释放资源 ### 2. 插入操作的基本步骤 - 建立数据库连接(SqlConnection) - 打开连接 - 创建SqlCommand对象 - 设置CommandText为INSERT语句 - 执行非查询命令(ExecuteNonQuery) - 关闭连接和释放资源 ### 3. 代码示例对比 #### 查询操作示例(使用SqlDataAdapter和DataSet): ```csharp string connectionString = "data source=.;database=MyTest; integrated security=True"; using (SqlConnection con = new SqlConnection(connectionString)) { con.Open(); string sql = "SELECT * FROM [User]"; SqlDataAdapter ad = new SqlDataAdapter(sql, con); DataSet set = new DataSet(); ad.Fill(set, "User"); // 获取第一行第一列的数据 var user = set.Tables["User"].Rows[0]["User"]; var pwd = set.Tables["User"].Rows[0]["Pwd"]; } ``` #### 查询操作示例(使用SqlDataReader): ```csharp string connectionString = "data source=.;database=MyTest; integrated security=True"; using (SqlConnection con = new SqlConnection(connectionString)) { con.Open(); string sql = "SELECT * FROM [User]"; using (SqlCommand cmd = new SqlCommand(sql, con)) { using (SqlDataReader reader = cmd.ExecuteReader()) { while (reader.Read()) { var user = reader["User"]; var pwd = reader["Pwd"]; } } } } ``` #### 插入操作示例(使用SqlCommand): ```csharp string connectionString = "server=机器名;database=数据库;uid=用户名;pwd=密码"; using (SqlConnection con = new SqlConnection(connectionString)) { con.Open(); string sql = "INSERT INTO 表名 (字段1, 字段2) VALUES (@value1, @value2)"; using (SqlCommand cmd = new SqlCommand(sql, con)) { // 使用参数化查询,避免SQL注入 cmd.Parameters.AddWithValue("@value1", textBox_name.Text); cmd.Parameters.AddWithValue("@value2", Convert.ToInt32(radioButton_boy.Checked)); int count = cmd.ExecuteNonQuery(); // 返回受影响的行数 } } ``` ### 4. 重要注意事项 - **参数化查询**:插入操作中应使用参数化查询(如`@value1`)来防止SQL注入,提高安全性。引用[2]中的示例使用了字符串拼接,这是不安全的做法,应避免。 - **资源释放**:使用`using`语句确保连接和命令对象被正确释放,避免资源泄漏。 - **异常处理**:在实际应用中,应使用try-catch块处理可能出现的异常。 - **连接字符串**:不同的数据库连接字符串格式可能不同,示例中给出了SQL Server和MySQL(引用[3]和[4])的连接字符串,但用户问题中主要是SQL Server。 ### 5. 查询与插入操作的主要区别 - **执行方法**:查询使用`ExecuteReader`或通过`DataAdapter`填充`DataSet`;插入使用`ExecuteNonQuery`(返回受影响的行数)。 - **结果处理**:查询需要读取返回的数据集;插入只需检查受影响的行数以确认操作是否成功。 - **SQL命令**:查询使用SELECT语句,插入使用INSERT语句。 ### 6. 性能考虑 引用[3]提到,使用Dapper等ORM工具可以提升性能,特别是批量操作时。但原生SQL操作在简单场景下性能也不错。 ### 总结 - 查询操作重点在于获取数据并处理结果集。 - 插入操作重点在于构建安全的SQL语句(参数化)并执行。 §§相关问题§§ 1. 在C#中如何防止SQL注入攻击? 2. 使用SqlDataReader和SqlDataAdapter有什么区别? 3. C#中如何执行批量插入操作以提高性能? 4. 连接数据库时集成安全(integrated security)和用户名密码方式有什么区别? 5. 如何优化C#中的数据库查询性能? </think> ### C#数据库查询与插入操作写法对比 #### 1. **基本结构对比** | 操作类型 | 核心对象 | 执行方法 | 结果处理方式 | |----------|----------------------|---------------------|---------------------------| | **查询** | `SqlDataAdapter` | `Fill(DataSet)` | 读取`DataSet/DataTable` | | | `SqlCommand` | `ExecuteReader()` | 遍历`SqlDataReader` | | **插入** | `SqlCommand` | `ExecuteNonQuery()` | 返回受影响行数(int类型) | #### 2. **代码实现对比** **查询操作示例**(使用DataAdapter): ```csharp // 连接数据库 string connStr = "data source=.;database=MyTest;integrated security=True"; using (SqlConnection con = new SqlConnection(connStr)) { con.Open(); // 执行查询 SqlDataAdapter ad = new SqlDataAdapter("SELECT * FROM [User]", con); DataSet set = new DataSet(); ad.Fill(set, "User"); // 填充DataSet // 读取结果 var user = set.Tables["User"].Rows[0]["User"]; var pwd = set.Tables["User"].Rows[0]["Pwd"]; } // 自动释放连接[^1] ``` **插入操作示例**(使用SqlCommand): ```csharp // 连接数据库 using (SqlConnection con = new SqlConnection("server=.;database=DB;uid=sa;pwd=123")) { con.Open(); // 构造插入命令(参数化防注入) string sql = @"INSERT INTO Users (Name, Age) VALUES (@name, @age)"; using (SqlCommand cmd = new SqlCommand(sql, con)) { cmd.Parameters.AddWithValue("@name", "张三"); // 参数化 cmd.Parameters.AddWithValue("@age", 25); int rows = cmd.ExecuteNonQuery(); // 返回受影响行数 Console.WriteLine($"插入了 {rows} 条记录"); } } // 自动释放连接[^2] ``` #### 3. **关键差异分析** | 特性 | 查询操作 | 插入操作 | |--------------|----------------------------------|-----------------------------------| | **SQL类型** | `SELECT`语句 | `INSERT`语句 | | **执行方法** | `Fill()`或`ExecuteReader()` | `ExecuteNonQuery()` | | **返回值** | 数据集(DataSet/DataReader) | 整数(受影响行数) | | **参数处理** | 可选参数化 | **必须参数化**(防SQL注入) | | **资源消耗** | 较高(需存储结果集) | 较低 | | **性能优化** | 分页查询、索引优化 | 批量插入、事务处理 | #### 4. **安全注意事项** - **插入操作必须参数化**:避免直接拼接SQL字符串(如`+ textBox.Text +`),否则会导致SQL注入风险[^2] - 查询操作若使用字符串拼接,同样建议参数化 - 使用`using`语句确保连接自动关闭(避免资源泄漏) #### 5. **性能优化建议** - 批量插入:使用`SqlBulkCopy`或ORM工具(如Dapper),速度比单条插入快10倍以上[^3] - 查询优化:通过`SELECT 字段名`替代`SELECT *`减少数据传输量 - 连接复用:单次操作中复用同一个连接对象 #### 6. **扩展方案对比** | 方案 | 查询示例 | 插入示例 | 适用场景 | |---------------|----------------------------------|-----------------------------------|----------------------| | **原生ADO.NET** | 上述示例代码 | 上述示例代码 | 精细控制SQL | | **Dapper** | `con.Query<User>("SELECT...")` | `con.Execute("INSERT...")` | 高性能轻量级ORM | | **Entity Framework** | `db.Users.Where(...)` | `db.Users.Add(user); db.SaveChanges()` | 复杂业务模型 | > 提示:对于简单操作,原生ADO.NET性能最优;复杂业务建议使用Dapper或EF[^3][^4]
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值