连接到 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 和一个连接字符串。
我愿意
- 用我的连接字符串初始化一个 SQL 连接。
- 执行一个查询(最好是原始的SQL)。如果是 select 查询,请将其映射到我的数据类型。
- 几乎能够从代码中的其他地方执行更多查询而无需重新初始化连接。
它实际上只是我需要的这三样东西的一个包和一个语法示例。谢谢
这是我使用 Dapper 查询 MS SQL Express 数据库的示例。为了让 Dapper(在一定程度上还有 SqlClient)在 F# 中变得简单和安全,我多年来制作了很多辅助方法。在下面,您只看到其中两个助手 - queryMultipleAsSeq
和 queryMultipleToList
.
我现在意识到,要开始使用 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 本身。
我将以我根本无法让 Sql Type Provider 工作作为开头 - 它在某些地方抛出了十几个不同的错误,似乎是版本冲突。所以我想避免这种情况。我一直在关注 C# 示例,但并不总能在 F# 中获得正确的语法。
我的目标是 .NET6(如果这会成为问题,可以降到 5)。
我也将数据建模为一种类型。
我最喜欢 Dapper 的外观,但我通常不需要完整的 ORM,只想 运行 原始 SQL 查询,所以我对其他解决方案持开放态度。
我有一个 MySQL 服务器 运行ning 和一个连接字符串。
我愿意
- 用我的连接字符串初始化一个 SQL 连接。
- 执行一个查询(最好是原始的SQL)。如果是 select 查询,请将其映射到我的数据类型。
- 几乎能够从代码中的其他地方执行更多查询而无需重新初始化连接。
它实际上只是我需要的这三样东西的一个包和一个语法示例。谢谢
这是我使用 Dapper 查询 MS SQL Express 数据库的示例。为了让 Dapper(在一定程度上还有 SqlClient)在 F# 中变得简单和安全,我多年来制作了很多辅助方法。在下面,您只看到其中两个助手 - queryMultipleAsSeq
和 queryMultipleToList
.
我现在意识到,要开始使用 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 本身。