连接到 MySQL 并执行查询的最佳方式? (可能与 Dapper 一起使用)

Best way to connect to MySQL and execute a query? (probably with Dapper)

我将以我根本无法让 Sql Type Provider 工作作为开头 - 它在某些地方抛出了十几个不同的错误,似乎是版本冲突。所以我想避免这种情况。我一直在关注 C# 示例,但并不总能在 F# 中获得正确的语法。

我的目标是 .NET6(如果这会成为问题,可以降到 5)。

我也将数据建模为一种类型。

我最喜欢 Dapper 的外观,但我通常不需要完整的 ORM,只想 运行 原始 SQL 查询,所以我对其他解决方案持开放态度。

我有一个 MySQL 服务器 运行ning 和一个连接字符串。

我愿意

  1. 用我的连接字符串初始化一个 SQL 连接。
  2. 执行一个查询(最好是原始的SQL)。如果是 select 查询,请将其映射到我的数据类型。
  3. 几乎能够从代码中的其他地方执行更多查询而无需重新初始化连接。

它实际上只是我需要的这三样东西的一个包和一个语法示例。谢谢

这是我使用 Dapper 查询 MS SQL Express 数据库的示例。为了让 Dapper(在一定程度上还有 SqlClient)在 F# 中变得简单和安全,我多年来制作了很多辅助方法。在下面,您只看到其中两个助手 - queryMultipleAsSeqqueryMultipleToList.

我现在意识到,要开始使用 Dapper 和 F# 并不容易,除非可以将它们提供给其他人。为此,我在 GitHub 上创建了一个存储库,它将定期更新新的辅助函数和演示,以展示它们的使用方式。

地址是https://github.com/BentTranberg/DemoDapperStuff

好的,现在是初始演示:

module DemoSql.Main

open System
open System.Data.SqlClient
open Dapper
open Dapper.Contrib
open Dapper.Contrib.Extensions

let queryMultipleAsSeq<'T> (conn: SqlConnection, sql: string, args: obj) : 'T seq =
    conn.Query<'T> (sql, args)

let queryMultipleToList<'T> (conn: SqlConnection, sql: string, args: obj) : 'T list =
    queryMultipleAsSeq (conn, sql, args)
    |> Seq.toList

let connectionString = @"Server=.\SqlExpress;Database=MyDb;User Id=sa;Password=password"
let [<Literal>] tableUser = "User"

[<Table (tableUser); CLIMutable>]
type EntUser =
    {
        Id: int
        UserName: string
        Role: string
        PasswordHash: string
    }

let getUsers () =
    use conn = new SqlConnection(connectionString)
    (conn, "SELECT * FROM " + tableUser, null)
    |> queryMultipleToList<EntUser>

[<EntryPoint>]
let main _ =
    getUsers ()
    |> List.iter (fun user -> printfn "Id=%d User=%s" user.Id user.UserName)
    Console.ReadKey() |> ignore
    0

本演示使用的包:

<PackageReference Include="Dapper.Contrib" Version="2.0.78" />
<PackageReference Include="System.Data.SqlClient" Version="4.8.2" />

Dapper.Contrib 会拖拽 Dapper 本身。