gpt4 book ai didi

mysql - F# 初学者 : retrieving an array of data from a server

转载 作者:可可西里 更新时间:2023-11-01 06:40:23 26 4
gpt4 key购买 nike

我正在尝试从 MySQL 数据库中获取数据。

方法 2 - 应用/映射样式

我正在使用 MySQL ADO Reference尝试建立这个系统。特别是在 21.2.3.1.7 找到的示例。

(使用伪代码)

let table = build_sequence(query.read)

其中 query.read 返回表中的一行(或者更确切地说,恰好是表中一行的元素列表)。 table 变量是一个列表列表,表示从查询返回的表。

我盯着下面给出的代码,恐怕它的语法超出了我的理解范围。

方法 1 - 循环。

问题 1:它不够优雅,需要一个可变的。

问题 2:根据我之前使用 Prolog 和 Lisp 的经验,这只是感觉不对。必须有一种更...功能性的方式来做到这一点。

虽然我不确定从哪里开始。评论和想法?

let reader : MySql.Data.MySqlClient.MySqlDataReader = command.ExecuteReader()

let arr = []

let mutable rowIter = 0
let readingLoop() =
while(reader.Read()) do
rowIter = rowIter + 1
for i = 0 to reader.FieldCount do

//set arr[someiterator, i] = reader.GetValue[i].ToString())

最佳答案

Seq 类型有一个用于处理数据库游标的简洁函数,称为 generate_using(参见 F# ManualFoundations of F# 中的数据访问章节)。这是一个高阶函数,它采用一个函数打开游标,另一个函数(重复调用)处理游标中的记录。下面是一些使用 generate_using 执行 sql 查询的代码:

let openConnection (connectionName : string) =
let connectionSetting = ConfigurationManager.ConnectionStrings.Item(connectionName)
let connectionString = connectionSetting.ConnectionString
let connection = new OracleConnection(connectionString)
connection.Open()
connection

let generator<'a> (reader : IDataReader) =
if reader.Read() then
let t = typeof<'a>
let props = t.GetProperties()
let types = props
|> Seq.map (fun x -> x.PropertyType)
|> Seq.to_array
let cstr = t.GetConstructor(types)
let values = Array.create reader.FieldCount (new obj())
reader.GetValues(values) |> ignore
let values = values
|> Array.map (fun x -> match x with | :? DBNull -> null | _ -> x)
Some (cstr.Invoke(values) :?> 'a)
else
None

let executeSqlReader<'a> (connectionName : string) (sql : string) : 'a list =
let connection = openConnection connectionName

let opener() =
let command = connection.CreateCommand(CommandText = sql, CommandType = CommandType.Text)
command.ExecuteReader()

let result = Seq.to_list(Seq.generate_using opener generator)

connection.Close()
connection.Dispose()
result

例如,要列出 Oracle 数据库中的所有表,我们需要定义一个列定义类型并调用 executeSqlReader,如下所示:

type ColumnDefinition = {
TableName : string;
ColumnName : string;
DataType : string;
DataLength : decimal;
}

let tableList = executeSqlReader<ColumnDefinition>
"MyDatabase"
"SELECT t.table_name, column_name, data_type, data_length FROM USER_TABLES t, USER_TAB_COLUMNS c where t.TABLE_NAME = c.table_name order by t.table_name, c.COLUMN_NAME"

关于mysql - F# 初学者 : retrieving an array of data from a server,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/291445/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com