You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何通过Web服务实现Xamarin.Forms应用与SQL Server数据库连接?

为什么不直接在Xamarin.Forms里连SQL Server?

直接把数据库凭证硬编码在客户端风险极高——APK/IPA一旦被反编译,数据库账号密码会直接泄露,任何人都能随意操作你的SQL Server。而且移动网络环境不稳定,长连接容易出现异常,SQL Server的端口也可能被运营商屏蔽,用户大概率无法正常连接。

Web服务的工作原理

简单来说就是在SQL Server和移动APP之间加一层中间服务:

  • 移动APP仅与Web服务交互,发送HTTP请求(GET/POST/PUT/DELETE等)
  • Web服务负责接收请求、验证身份、执行SQL操作,将结果整理成JSON格式返回给APP
  • 全程由Web服务与SQL Server保持安全连接,APP完全接触不到数据库凭证
实现步骤(以ASP.NET Core Web API为例)
  1. 搭建Web API项目
    新建ASP.NET Core Web API项目,这层服务作为数据访问的中间层。

  2. 在Web API中实现数据访问
    将你原有的数据库连接逻辑迁移到Web API中,比如创建数据访问类:

    using System.Data;
    using System.Data.SqlClient;
    using Microsoft.Extensions.Configuration;
    
    namespace YourWebApi.Data
    {
        public class DbService
        {
            private readonly string _connectionString;
    
            public DbService(IConfiguration configuration)
            {
                _connectionString = configuration.GetConnectionString("DefaultConnection");
            }
    
            public DataTable ExecuteQuery(string query)
            {
                using var conn = new SqlConnection(_connectionString);
                conn.Open();
                using var cmd = new SqlCommand(query, conn);
                using var adapter = new SqlDataAdapter(cmd);
                var dt = new DataTable();
                adapter.Fill(dt);
                return dt;
            }
    
            // 封装增删改方法,比如执行非查询语句的ExecuteNonQuery
            public int ExecuteNonQuery(string query)
            {
                using var conn = new SqlConnection(_connectionString);
                conn.Open();
                using var cmd = new SqlCommand(query, conn);
                return cmd.ExecuteNonQuery();
            }
        }
    }
    

    然后在appsettings.json中配置连接字符串(仅在服务器端存储,安全性高):

    {
      "ConnectionStrings": {
        "DefaultConnection": "Data Source=你的服务器名;Initial Catalog=你的数据库名;User ID=账号;Password=密码"
      }
    }
    
  3. 编写API接口
    创建Controller处理APP的请求,比如获取数据的接口:

    using Microsoft.AspNetCore.Mvc;
    using YourWebApi.Data;
    
    namespace YourWebApi.Controllers
    {
        [ApiController]
        [Route("api/[controller]")]
        public class DataController : ControllerBase
        {
            private readonly DbService _dbService;
    
            public DataController(DbService dbService)
            {
                _dbService = dbService;
            }
    
            [HttpGet("get-users")]
            public IActionResult GetUsers()
            {
                var data = _dbService.ExecuteQuery("SELECT * FROM Users");
                return Ok(data);
            }
    
            [HttpPost("add-user")]
            public IActionResult AddUser(string userName, string email)
            {
                var affectedRows = _dbService.ExecuteNonQuery($"INSERT INTO Users(UserName, Email) VALUES('{userName}', '{email}')");
                return Ok(affectedRows > 0 ? "添加成功" : "添加失败");
            }
        }
    }
    
  4. 在Xamarin.Forms中调用API
    使用HttpClient发送请求获取数据,比如封装API调用服务:

    using System.Net.Http;
    using System.Threading.Tasks;
    using Newtonsoft.Json;
    
    namespace MVVMdemo.Services
    {
        public class ApiService
        {
            private readonly HttpClient _httpClient;
    
            public ApiService()
            {
                _httpClient = new HttpClient();
                _httpClient.BaseAddress = new Uri("https://你的WebAPI域名/api/");
            }
    
            public async Task<T> GetDataAsync<T>(string endpoint)
            {
                var response = await _httpClient.GetAsync(endpoint);
                response.EnsureSuccessStatusCode();
                var jsonContent = await response.Content.ReadAsStringAsync();
                return JsonConvert.DeserializeObject<T>(jsonContent);
            }
    
            public async Task<string> PostDataAsync(string endpoint, FormUrlEncodedContent content)
            {
                var response = await _httpClient.PostAsync(endpoint, content);
                response.EnsureSuccessStatusCode();
                return await response.Content.ReadAsStringAsync();
            }
        }
    }
    

    之后在ViewModel中调用该服务,将数据绑定到UI即可。

额外注意事项
  • 必须给Web API添加身份验证,比如JWT,防止无关人员随意调用接口
  • 禁止将SQL语句从APP传到Web API,要在Web API中封装好业务方法,APP仅传递参数,避免SQL注入风险
  • 移动端要做好网络异常处理,比如断网、超时情况,给用户友好提示

内容的提问来源于stack exchange,提问作者macecahu

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.23 15:54:43