Loading... > 关于在.NET中执行SQLServer的SQL查询这件事,我在开发中经常会遇到,有时候一个工具里会存在大量的,复杂的SQL查询语句。在代码里编写和管理这些SQL语句是一件麻烦事。以前我都是在代码里将这些SQL语句完整拼接出来,里面可能还嵌入了从代码中获得的一些变量。这个方式维护起来很不方便,且让代码看起来很臃肿。 #### 背景 S3D底层的数据库设计很复杂,有大量的接口表,关系表和视图,我们做的查询往往都会是一个综合性的多属性的报表,会跨很多的视图,甚至数据库。我不确定这种模式是否适合常规的ORM中的实体类映射,因为底层数据库里并不存在对应的这么单纯的一个视图或表。即便是用了ORM框架,或实体类的映射,依然没有减少任何代码中编写SQL查询语句的工作。其实这个工作使用PowerBI更合适,但我们现在是在编写程序。 #### 尝试 我现在找到的折中的方法是将用到的SQL查询,在SSMS中调试好存储成为sql文件,以嵌入资源的方式添加到.NET项目的某个文件夹目录下统一管理,如果查询中存在使用代码中的变量,那在查询中声明相应的变量,结合SqlCommand的参数注入进行传值。 #### 在代码里调用嵌入资源 1. 设置文件为嵌入资源 在Visual Studio中右键点击SQL文件,选择“属性”,将“生成操作”设置为嵌入的资源。 2. 确定资源名称 资源名称格式为:默认命名空间.文件夹路径.文件名(使用点分隔)。例如,若项目默认命名空间是MyApp,文件位于Resources文件夹内且名为script.sql,则资源名为MyApp.Resources.script.sql。 3. 使用代码读取资源 通过程序集获取资源流,并读取内容到字符串。 4. 示例代码: ```csharp using System.IO; using System.Reflection; // 替换为你的资源名称 string resourceName = "YourNamespace.Resources.script.sql"; Assembly assembly = Assembly.GetExecutingAssembly(); using (Stream stream = assembly.GetManifestResourceStream(resourceName)) { if (stream == null) { throw new FileNotFoundException($"资源 '{resourceName}' 未找到。"); } using (StreamReader reader = new StreamReader(stream)) { string sqlScript = reader.ReadToEnd(); // 现在sqlScript变量包含脚本内容 } } ``` #### 参数化SQL查询 这里我们依然还是以最常用的ADO.NET来举例 ```csharp using (SqlConnection connection = new SqlConnection("YourConnectionString")) { string sql = "SELECT * FROM Users WHERE Name = @Name AND Age = @Age"; using (SqlCommand command = new SqlCommand(sql, connection)) { // 添加参数 command.Parameters.AddWithValue("@Name", "Alice"); command.Parameters.AddWithValue("@Age", 30); connection.Open(); using (SqlDataReader reader = command.ExecuteReader()) { while (reader.Read()) { // 处理结果 } } } } ``` 最后修改:2025 年 04 月 04 日 © 允许规范转载 打赏 赞赏作者 支付宝微信 赞 如果觉得我的文章对你有用,请随意赞赏