1. 项目概述
作为一名有10年.NET开发经验的工程师,我经常遇到新手开发者对C#和SQL Server的基础操作感到困惑。这个"常用命令大全"项目,就是把我多年来积累的实用代码片段和数据库操作命令整理成一份清晰易懂的参考手册。
不同于官方文档的复杂晦涩,这份指南特别注重:
- 真实开发场景中的高频需求
- 每个命令的典型应用场景
- 新手容易踩坑的注意事项
- 配套的简明示例代码
2. 开发环境准备
2.1 基础工具安装
首先确保你的开发环境已经配置好:
- Visual Studio 2022(社区版即可)
- SQL Server Express(免费版本)
- SQL Server Management Studio (SSMS)
提示:安装时建议选择".NET桌面开发"和"数据存储和处理"工作负载
2.2 测试数据库创建
-- 创建测试数据库 CREATE DATABASE TestDB; GO USE TestDB; GO -- 创建示例表 CREATE TABLE Users ( UserID INT PRIMARY KEY IDENTITY(1,1), UserName NVARCHAR(50) NOT NULL, Email NVARCHAR(100) UNIQUE, CreatedDate DATETIME DEFAULT GETDATE() );3. C#基础操作命令
3.1 数据库连接管理
using System.Data.SqlClient; // 连接字符串配置(实际项目应该放在配置文件中) string connectionString = "Server=localhost;Database=TestDB;Integrated Security=True;"; // 最佳实践:使用using自动释放资源 using (SqlConnection connection = new SqlConnection(connectionString)) { try { connection.Open(); // 执行数据库操作... } catch (SqlException ex) { Console.WriteLine($"数据库错误: {ex.Message}"); } }3.2 参数化查询(防SQL注入)
string sql = "INSERT INTO Users (UserName, Email) VALUES (@name, @email)"; using (SqlCommand command = new SqlCommand(sql, connection)) { command.Parameters.AddWithValue("@name", "张三"); command.Parameters.AddWithValue("@email", "zhangsan@example.com"); int rowsAffected = command.ExecuteNonQuery(); Console.WriteLine($"插入了 {rowsAffected} 行数据"); }4. SQL Server实用命令
4.1 数据查询优化
-- 基础查询 SELECT * FROM Users WHERE UserName LIKE '张%'; -- 添加索引提高查询性能 CREATE INDEX IX_Users_UserName ON Users(UserName); -- 查看查询执行计划(优化必备) SET SHOWPLAN_TEXT ON; GO SELECT * FROM Users WHERE Email LIKE '%example%'; GO SET SHOWPLAN_TEXT OFF;4.2 事务处理示例
using (SqlTransaction transaction = connection.BeginTransaction()) { try { // 执行多个操作 SqlCommand cmd1 = new SqlCommand("UPDATE Accounts SET Balance = Balance - 100 WHERE AccountID = 1", connection, transaction); SqlCommand cmd2 = new SqlCommand("UPDATE Accounts SET Balance = Balance + 100 WHERE AccountID = 2", connection, transaction); cmd1.ExecuteNonQuery(); cmd2.ExecuteNonQuery(); transaction.Commit(); } catch { transaction.Rollback(); throw; } }5. 高级技巧与性能优化
5.1 批量数据操作
// 使用SqlBulkCopy高效导入数据 DataTable newUsers = GetUserData(); // 假设这个方法返回要导入的数据 using (SqlBulkCopy bulkCopy = new SqlBulkCopy(connection)) { bulkCopy.DestinationTableName = "Users"; bulkCopy.WriteToServer(newUsers); }5.2 存储过程调用
-- 创建存储过程 CREATE PROCEDURE sp_GetUserByEmail @Email NVARCHAR(100) AS BEGIN SELECT * FROM Users WHERE Email = @Email; END// C#调用存储过程 using (SqlCommand command = new SqlCommand("sp_GetUserByEmail", connection)) { command.CommandType = CommandType.StoredProcedure; command.Parameters.AddWithValue("@Email", "zhangsan@example.com"); using (SqlDataReader reader = command.ExecuteReader()) { while (reader.Read()) { Console.WriteLine(reader["UserName"]); } } }6. 常见问题排查
6.1 连接问题
错误:"无法打开登录请求的数据库"
- 检查连接字符串中的数据库名称
- 确认SQL Server服务已启动
- 检查防火墙设置
错误:"超时时间已到"
- 增加连接超时时间:在连接字符串中添加"Connect Timeout=30"
- 检查网络延迟
- 优化查询性能
6.2 性能问题
查询缓慢:
- 使用EXEC sp_helpindex '表名'检查索引
- 避免SELECT *,只查询需要的列
- 考虑添加适当的索引
内存泄漏:
- 确保所有SqlConnection、SqlCommand对象都在using块中
- 监控应用程序的内存使用情况
7. 安全最佳实践
7.1 连接字符串安全
- 永远不要将连接字符串硬编码在代码中
- 使用ConfigurationManager或.NET Core的IConfiguration
- 考虑使用Windows身份验证而非SQL身份验证
7.2 SQL注入防护
- 始终使用参数化查询
- 避免动态拼接SQL语句
- 对用户输入进行验证和清理
// 危险做法(绝对避免) string sql = "SELECT * FROM Users WHERE UserName = '" + userInput + "'"; // 安全做法 string sql = "SELECT * FROM Users WHERE UserName = @name"; command.Parameters.AddWithValue("@name", userInput);8. 实用扩展资源
8.1 常用NuGet包
- Dapper:轻量级ORM
- Entity Framework Core:全功能ORM
- Polly:弹性与瞬时故障处理
8.2 学习资源推荐
- Microsoft Docs的C#和SQL Server文档
- Stack Overflow上的常见问题解答
- GitHub上的开源项目代码参考
在实际开发中,我发现很多问题其实都有现成的解决方案。关键是要建立自己的代码片段库,并持续更新这份"常用命令大全"。当遇到新问题时,及时将解决方案补充进来,久而久之就会形成非常有价值的个人知识库。