Flutter对接远程SQL Server实现CRUD的推荐方案及入门指导
Flutter对接SQL Server实现CRUD的推荐方案
你提到的直接让Flutter连接SQL Server并非明智之举的观点完全正确。Flutter作为跨平台UI框架,核心定位是适配多端、灵活对接各类后端,直接连接数据库会带来安全风险(暴露数据库账号密码)、性能瓶颈(移动端直接执行复杂查询)、维护成本高(数据库结构变更需同步修改Flutter代码)等问题。
生产环境推荐方案:搭建中间后端服务
通过中间后端作为Flutter与SQL Server的中转层,是行业标准做法,具体落地步骤如下:
1. 选择适配的后端技术栈
根据自身熟悉程度和业务需求选择:
- .NET/.NET Core:与SQL Server原生兼容性最佳,官方支持完善,适合快速开发数据接口
- Node.js + Express:轻量灵活,生态丰富,适合快速搭建RESTful API
- Python + FastAPI/Flask:语法简洁,数据处理能力强,开发效率高
2. 封装CRUD接口
为数据库操作封装标准化的RESTful接口:
- 创建(Create):POST接口,接收Flutter端传入的数据,写入SQL Server
- 读取(Read):GET接口,根据查询参数从数据库获取数据,返回JSON格式结果
- 更新(Update):PUT/PATCH接口,接收更新数据,修改对应数据库记录
- 删除(Delete):DELETE接口,根据唯一标识删除数据库中的指定记录
3. Flutter端对接后端API
在Flutter中使用http或dio包发送HTTP请求,与后端接口交互:
- 发送POST请求提交新增数据
- 发送GET请求获取列表或详情数据
- 发送PUT请求更新数据
- 发送DELETE请求删除数据
关于sql_conn包的风险
你测试的sql_conn包依赖的JDBC驱动已近10年未更新,确实不适合生产环境:
- 存在未修复的安全漏洞隐患
- 无法兼容新版本SQL Server的特性
- 出现问题难以获得有效技术支持
你的测试代码(中文注释版)
import 'dart:async'; import 'package:flutter/material.dart'; import 'package:sql_conn/sql_conn.dart'; void main() { WidgetsFlutterBinding.ensureInitialized(); runApp(const MyApp()); } class MyApp extends StatelessWidget { const MyApp({super.key}); @override Widget build(BuildContext context) { return const MaterialApp( title: "测试", home: TestPage(), ); } } class TestPage extends StatefulWidget { const TestPage({super.key}); @override _TestPageState createState() => _TestPageState(); } class _TestPageState extends State<TestPage> { // 连接SQL Server Future<void> connect(BuildContext ctx) async { debugPrint("正在连接..."); try { // 显示加载弹窗 showDialog( context: context, builder: (context) { return const AlertDialog( title: Text("加载中"), content: CircularProgressIndicator(), ); }, ); // 执行数据库连接 await SqlConn.connect( ip: "192.168.128.176", port: "1433", databaseName: "MDCData", username: "AS", password: "112233"); debugPrint("连接成功!"); } catch (e) { debugPrint(e.toString()); } finally { // 关闭加载弹窗 Navigator.pop(context); } } // 读取数据库数据 Future<void> read(String query) async { var res = await SqlConn.readData(query); debugPrint(res.toString()); } // 执行写入/修改/删除操作 Future<void> write(String query) async { var res = await SqlConn.writeData(query); debugPrint(res.toString()); } @override Widget build(BuildContext context) { return Scaffold( appBar: AppBar( title: const Text('插件测试应用'), ), body: Center( child: Column( mainAxisAlignment: MainAxisAlignment.center, crossAxisAlignment: CrossAxisAlignment.center, children: [ ElevatedButton( onPressed: () => connect(context), child: const Text("连接数据库")), ElevatedButton( onPressed: () => read("SELECT * FROM IP_List"), child: const Text("读取数据")), ElevatedButton( onPressed: () => write("DELETE FROM IP_List WHERE LOC='vv1'"), child: const Text("删除数据")), ElevatedButton( onPressed: () => write( "CREATE TABLE Persons (PersonID int, LastName varchar(255), FirstName varchar(255), Address varchar(255),City varchar(255))"), child: const Text("创建表")), ElevatedButton( onPressed: () => write("DROP TABLE Persons"), child: const Text("删除表")), ElevatedButton( onPressed: () => SqlConn.disconnect(), child: const Text("断开连接")) ], ), )); } }
内容的提问来源于stack exchange,提问作者TheMortiestMorty
相关产品推荐
相关产品推荐

