Flutter数据库连接插件dart_odbc的使用

发布于 1周前 作者 htzhanglong 来自 Flutter

Flutter数据库连接插件dart_odbc的使用

dart_odbc 是一个用于与ODBC数据库交互的Dart包。它允许你在Dart应用程序中连接到ODBC数据源并直接执行SQL查询。

这个包受到由 Juan Mellado 开发的已弃用包 odbc 的启发。

使用方法

实例化ODBC类

通过提供ODBC驱动程序在主机上的路径来实例化ODBC类:

final odbc = DartOdbc(
  dsn: '<your_dsn>',
  pathToDriver: '<path_to_odbc_driver>',
);

DSN(可选)

DSN(数据源名称)是你在设置驱动程序管理器时给出的名称。更多信息可以查看 MySQL 文档。 如果没有提供DSN,只能通过连接字符串进行连接。

通过DSN连接到数据库
await odbc.connect(
  username: 'db_username',
  password: 'db_password',
);
通过连接字符串连接到数据库
await odbc.connectWithConnectionString(
  "DRIVER={Microsoft Excel Driver (*.xls, *.xlsx, *.xlsm, *.xlsb)};DBQ=C:\\Users\\Computer\\AppData\\Local\\Temp\\test.xlsx;",
);

执行SQL查询

final result = await odbc.execute("SELECT 10");

执行预编译语句

预编译语句可以防止SQL注入。

final List<Map<String, dynamic>> result = await odbc.execute(
  'SELECT * FROM USERS WHERE UID = ?',
  params: [1],
);

提供结果集列配置

抽象层DartOdbc应该能够处理大多数查询的输出。但是,对于列大小非常长或数据类型不常见的查询,由于默认内存分配问题,可能会导致输出被破坏。可以通过在execute方法的columnConfig参数中提供ColumnType来处理这些问题。

result = await odbc.execute(
  'SELECT * FROM USERS WHERE UID = ?',
  params: [1],

  /// The column config can be provided as this.
  /// But for most cases this config is not necessary
  /// This is only needed when the data fetching is not working as expected
  /// Only the columns with issues need to be provided
  columnConfig: {
    'NAME': ColumnType(size: 150),
    'DESCRIPTION': ColumnType(type: SQL_C_WCHAR, size: 500),
  },
);

结果将是一个包含Map对象的Future<List<Map<String, dynamic>>>,每个Map代表一行。如果出现问题,将抛出ODBCException异常。

获取表

final List<Map<String, String>> tables = await odbc.getTables();

断开数据库连接

最后,别忘了断开数据库连接并释放资源。

await odbc.disconnect();

直接访问ODBC驱动绑定

可以通过LibOdbc类执行原生ODBC方法。

测试环境

该包已在以下数据库服务器上进行了测试:

  • Microsoft SQL Server
  • Oracle

支持其他数据库服务器

虽然未经过测试,但该插件应该适用于任何提供ODBC驱动程序的数据库。有关支持的数据库服务器的详细列表,请参阅官方 unixodbc 网站的“驱动程序”部分。

支持项目

大家好!我在兼顾学习和其他责任的同时积极维护这个项目。如果你觉得我的工作有用,并且希望帮助我继续改进这个项目,请考虑支持我!你的贡献将帮助我支付费用、买更多咖啡☕,并投入更多时间进行开发。🙏

每一点帮助都非常重要,我非常感谢你的支持。谢谢你们帮助我保持这个项目的运行!💛


示例代码

以下是完整的示例代码:

import 'package:dart_odbc/dart_odbc.dart';
import 'package:dotenv/dotenv.dart';

void main(List<String> args) {
  run(args);
}

Future<void> run(List<String> args) async {
  // 加载环境变量
  final DotEnv env = DotEnv()..load(['.env']);

  // 数据库用户名
  final username = env['USERNAME'];
  // 数据库密码
  final password = env['PASSWORD'];

  final dsn = env['DSN'];

  // 可选选择数据库
  final db = env['DATABASE'];

  final odbc = DartOdbc(dsn: dsn);
  await odbc.connect(username: username!, password: password!);

  if (db != null) {
    await odbc.execute('USE $db');
  }

  List<Map<String, dynamic>> result = await odbc.execute(
    args[0], // SQL 查询
    params: args.sublist(1), // SQL 查询参数
    columnConfig: {
      "COL1": ColumnType(size: 100),
    },
  );

  print(result);

  // 断开数据库连接
  await odbc.disconnect();
}

更多关于Flutter数据库连接插件dart_odbc的使用的实战系列教程也可以访问 https://www.itying.com/category-92-b0.html

1 回复

更多关于Flutter数据库连接插件dart_odbc的使用的实战系列教程也可以访问 https://www.itying.com/category-92-b0.html


在Flutter中使用dart_odbc插件来连接数据库并不是常见的做法,因为dart_odbc主要是为Dart VM设计的,并不直接支持Flutter(尤其是Flutter的移动端平台,如iOS和Android)。不过,为了说明如何使用dart_odbc(假设在支持Dart VM的环境中,比如服务器端的Dart应用),这里提供一个基本的代码案例。

请注意,以下代码示例不适用于Flutter的移动端开发。对于Flutter中的数据库操作,通常会使用如sqflite这样的插件来处理SQLite数据库。

Dart VM 环境下的 dart_odbc 使用示例

首先,确保你的pubspec.yaml文件中包含了dart_odbc的依赖:

dependencies:
  dart_odbc: ^any_version_you_want_to_use

然后,运行flutter pub get(在Dart VM环境下,这可能是dart pub get)来安装依赖。

以下是一个简单的示例,展示如何使用dart_odbc连接到数据库并执行查询:

import 'package:dart_odbc/dart_odbc.dart';

void main() async {
  // 配置ODBC连接字符串
  String connectionString = 'DRIVER={SQL Server};SERVER=your_server_address;DATABASE=your_database_name;UID=your_username;PWD=your_password;';

  // 创建ODBC连接
  OdbcConnection connection = OdbcConnection(connectionString);

  try {
    // 打开连接
    await connection.open();
    print('Connection opened successfully.');

    // 创建SQL查询
    String sql = 'SELECT * FROM your_table_name';

    // 执行查询
    OdbcResultSet resultSet = await connection.executeQuery(sql);

    // 处理结果集
    while (await resultSet.next()) {
      // 假设你的表有一个名为`column_name`的列
      String value = resultSet.getString('column_name');
      print('Value: $value');
    }

    // 关闭结果集
    await resultSet.close();
  } catch (e) {
    print('Error: $e');
  } finally {
    // 确保连接被关闭
    if (connection.isOpen) {
      await connection.close();
      print('Connection closed.');
    }
  }
}

注意事项

  1. 环境限制:上述代码适用于Dart VM环境,不适用于Flutter移动端开发。
  2. 依赖项:确保你的系统上已正确安装了ODBC驱动程序,并且dart_odbc插件与你的Dart版本兼容。
  3. 安全性:在实际应用中,避免在代码中硬编码数据库凭据。考虑使用环境变量或安全的凭据存储服务。
  4. 错误处理:示例中包含了基本的错误处理,但在生产环境中,你可能需要更详细的日志记录和错误处理机制。

对于Flutter应用,如果需要使用数据库,建议使用专为Flutter设计的插件,如sqflite,它提供了对SQLite数据库的支持,并且与Flutter的移动端平台兼容。

回到顶部