如何在Visual Studio 2022中用C#查询已连接的SQL Server数据库
无需Entity Framework,在Blazor Server中直接查询SQL Server数据库
1. 确认连接字符串已配置
通过「连接服务」添加数据库后,项目的appsettings.json中应该已自动生成对应连接字符串,格式大致如下:
{ "ConnectionStrings": { "YourDatabaseConnection": "Server=你的服务器地址;Database=数据库名;User ID=用户名;Password=密码;TrustServerCertificate=True;" } }
直接使用该连接字符串名称即可获取数据库连接配置。
2. 创建数据访问服务
新建数据访问类(如DatabaseService.cs),用SqlConnection和SqlCommand执行存在性查询,必须用参数化查询防止SQL注入:
using Microsoft.Extensions.Configuration; using System.Data.SqlClient; public class DatabaseService { private readonly string _connectionString; // 构造函数注入配置,读取连接字符串 public DatabaseService(IConfiguration configuration) { _connectionString = configuration.GetConnectionString("YourDatabaseConnection") ?? throw new InvalidOperationException("未找到数据库连接字符串"); } // 检查指定名称是否存在于目标表中 public async Task<bool> IsNameExistsAsync(string tableName, string name) { // 参数化查询,规避注入风险 string sql = $"SELECT 1 FROM {tableName} WHERE Name = @Name"; using (var connection = new SqlConnection(_connectionString)) { await connection.OpenAsync(); using (var command = new SqlCommand(sql, connection)) { command.Parameters.AddWithValue("@Name", name); // 执行查询,返回非空结果则说明名称存在 var result = await command.ExecuteScalarAsync(); return result != null; } } } }
注意:若表名/字段名不是
Name,需自行调整SQL语句;若表名是动态传入,建议增加白名单校验,避免恶意表名注入。
3. 注册服务到依赖注入容器
在Program.cs中注册数据访问服务(Blazor Server推荐使用Scoped生命周期):
builder.Services.AddScoped<DatabaseService>();
4. 在Blazor组件中调用服务
在需要查询的.razor组件中注入服务并执行查询:
@page "/check-name" @inject DatabaseService DbService @using System.Threading.Tasks <h3>检查名称是否存在</h3> <input @bind="targetName" placeholder="输入名称" /> <button @onclick="CheckName">查询</button> @if (result.HasValue) { <p>名称@(result.Value ? "存在" : "不存在")</p> } @code { private string targetName = string.Empty; private bool? result; private async Task CheckName() { // 替换为你实际要查询的表名,比如"Products" result = await DbService.IsNameExistsAsync("Users", targetName); } }
补充说明
- 若项目未安装
System.Data.SqlClient,可通过NuGet包管理器安装:Install-Package System.Data.SqlClient - Blazor Server中所有数据库操作需使用异步方法(带
Async后缀),避免阻塞主线程影响UI响应
内容的提问来源于stack exchange,提问作者RGreen
相关产品推荐
相关产品推荐

