如何在.NET MAUI中连接SQL Server并实现CRUD操作(安卓适配)
.NET MAUI 连接本地SQL Server(安卓模拟器)及CRUD实现指南
一、直接连接失效的原因
- 安卓模拟器的
localhost指向自身虚拟机,而非你的PC主机,无法直接访问本地SQL Server - 本地SQL Server默认仅允许本地连接,未开启远程访问权限
- 移动端硬编码数据库连接字符串存在严重安全风险(易被反编译获取,导致数据泄露)
二、直接连接的测试配置(不推荐用于生产)
1. 开启SQL Server远程访问
- 打开SQL Server配置管理器 → SQL Server网络配置 → 启用TCP/IP协议
- 编辑TCP/IP属性:在IP地址列表中,设置
IPAll的TCP端口为1433,启用所有IP地址 - 重启SQL Server服务
- 在Windows防火墙中添加入站规则,允许1433端口的TCP连接
2. 修改MAUI连接字符串
替换localhost为模拟器对应的主机IP:
- Android Studio模拟器用
10.0.2.2 - Genymotion模拟器用
10.0.3.2
示例连接字符串:
var connString = "Server=10.0.2.2,1433;Database=YourDBName;User Id=YourUsername;Password=YourPassword;TrustServerCertificate=True;";
注:
TrustServerCertificate=True仅用于测试,生产环境需配置合法SSL证书
3. 安卓平台权限配置
在Platforms/Android/AndroidManifest.xml中添加网络权限:
<uses-permission android:name="android.permission.INTERNET" />
三、生产环境推荐:ASP.NET Core API中间层
直接连接数据库在移动端弊端太多,通过API作为中间层是行业标准方案,优势包括:
- 隐藏数据库连接信息,避免安全泄露
- 可实现权限控制、数据缓存、请求限流等功能
- 更稳定的网络交互(API可处理重试、超时等逻辑)
1. 快速搭建API
- 创建ASP.NET Core Web API项目
- 添加
Microsoft.EntityFrameworkCore.SqlServer包,用EF Core实现数据库操作(或直接用ADO.NET) - 配置DbContext:
public class AppDbContext : DbContext { public AppDbContext(DbContextOptions<AppDbContext> options) : base(options) { } public DbSet<Product> Products { get; set; } // 替换为你的实体类 } - 在
Program.cs中注册DbContext:builder.Services.AddDbContext<AppDbContext>(opt => opt.UseSqlServer(builder.Configuration.GetConnectionString("DefaultConnection"))); - 编写CRUD控制器示例:
[ApiController] [Route("api/products")] public class ProductsController : ControllerBase { private readonly AppDbContext _db; public ProductsController(AppDbContext db) => _db = db; [HttpGet] public async Task<IActionResult> GetAll() => Ok(await _db.Products.ToListAsync()); [HttpPost] public async Task<IActionResult> Create(Product product) { _db.Products.Add(product); await _db.SaveChangesAsync(); return CreatedAtAction(nameof(GetById), new { id = product.Id }, product); } // 补充GetById、Put、Delete接口 }
2. MAUI中调用API
用HttpClient发起请求,示例:
private readonly HttpClient _httpClient; public MainPage() { InitializeComponent(); _httpClient = new HttpClient { BaseAddress = new Uri("http://10.0.2.2:5123/") }; // 替换为你的API地址 } private async Task LoadProducts() { var products = await _httpClient.GetFromJsonAsync<List<Product>>("api/products"); // 将数据绑定到CollectionView或其他UI控件 }
注:API需开启跨域支持,在
Program.cs中添加:builder.Services.AddCors(opt => opt.AddPolicy("AllowAll", policy => policy.AllowAnyOrigin().AllowAnyMethod().AllowAnyHeader())); app.UseCors("AllowAll");
四、总结
- 直接连接仅适合本地快速测试,生产环境务必使用API中间层
- API方案更安全、易维护,且能适配更多扩展需求
内容的提问来源于stack exchange,提问作者Arshad Mohamed
相关产品推荐
相关产品推荐

