C# 在F中使用SqlDataReader#

C# 在F中使用SqlDataReader#,c#,list,ado.net,f#,sqlclient,C#,List,Ado.net,F#,Sqlclient,在C#中,我使用sql脚本将数据添加到列表中,其中T是一个类,其字段/属性映射到sql脚本 我怎么能在F#里做到这一点?本文以标准方式使用存储过程 使用(连接) { conn.Open(); 使用(SqlCommand cmd=newsqlcommand(“dbo.query_here”,conn)) { cmd.CommandText=“dbo.query_here”; cmd.CommandType=System.Data.CommandType.StoredProcess; cmd.Com

在C#中,我使用sql脚本将数据添加到列表中,其中T是一个类,其字段/属性映射到sql脚本

我怎么能在F#里做到这一点?本文以标准方式使用存储过程

使用(连接)
{
conn.Open();
使用(SqlCommand cmd=newsqlcommand(“dbo.query_here”,conn))
{
cmd.CommandText=“dbo.query_here”;
cmd.CommandType=System.Data.CommandType.StoredProcess;
cmd.CommandTimeout=600;
cmd.Parameters.Add(新的SqlParameter(“@x1”,Convert.ToString(x));
cmd.Parameters.Add(新的SqlParameter(“@y1”,y));
cmd.Parameters.Add(新的SqlParameter(“@z1”,z));
SqlDataReader=cmd.ExecuteReader();
while(reader.Read())
{
添加(新的MyDataClass(reader.GetInt32(reader.GetOrdinal(“x”))
reader.GetDouble(reader.GetOrdinal(“y”)),
reader.GetDouble(reader.GetOrdinal(“a”)),
reader.GetDouble(reader.GetOrdinal(“b”));
}
reader.Close();
}
康涅狄格州关闭();
我意识到F#可能并不像这样直截了当,但我需要以类似的方式将这些数据放入F#列表中。我也更喜欢那些本质上不起作用且遵循类似于C#代码模式的建议

在前一个线程中,有人建议使用记录,但这与SqlDataReader无关。最好有一个类列表,这样我就可以在每个项上使用getter和setter

在不可避免的评论“为什么不直接使用C?”之前,我应该加上一句。很显然,我可以使用C,但我正在探索用F编写算法的可能性,为此,我需要从SQL Server获取原始数据。

您可以阅读此文

链接:

let rdr=cmd.ExecuteReader()
rdr
|>SomeRecord.asSeq//将datareader项目导入seq
|>Seq.sumBy(fun r->r.val1*r.val2)//现在您可以使用所有的Seq操作符了
//大家都知道。
未经测试的F翻译#

使用conn=???
康涅狄格州公开赛
使用新的SqlCommand(“dbo.query_here”,conn)(fun cmd->

cmd.CommandText使用普通的旧ADO.NET处理数据库,实际上使用F#dynamic operator
非常好。我编写了一个

let myListOfClasses = 
  [ let db = new DynamicDatabase(connectionString)
    let rows = db.Query?query_here(string x, y, z)
    for r in rows do 
      yield MyDataClass(row?x, row?y, row?a, row?b) ]
这使用动态调用操作符
来调用存储过程(
db.Query?Query\u here
)。当您调用它时,您可以像调用普通函数一样给它参数(它会将它们作为SQL参数添加)。然后,您还可以使用
row?x
读取属性-这可以从
MyDataClass
参数的类型推断类型,因此假设这些参数匹配,您无需自己编写类型转换

以下是MSDN教程的链接,其中讨论了以下内容:


如果您想在F#list中返回
结果
,这里可以使用列表理解。使用
use
关键字,您不需要显式地处理对象

使用conn=(*在此处初始化sql连接*)
康涅狄格州公开赛
使用cmd=newsqlcommand(“dbo.query\u here”,conn)

cmd.CommandText我喜欢这个,但是对于我正在尝试做的简单任务来说,它太复杂了。是否有一种真正简单的方法可以使用C方法,而不是List(ResizeArray),我们使用F#List?或者从一个转换到另一个?@RichardTodd Yep,同意-对于单个任务来说,这太复杂了。您仍然可以定义
(?)
操作员从
SqlDataReader
访问属性-这很简单。我不确定您对列表有什么要求?(您可以使用
list.ofSeq
从任何
IEnumerable
中获取F#list)谢谢,我想这对我和其他人会有帮助。输出需要是一个F不可变的列表,否则我只需要使用C。谢谢,就像简单一样。我会标记答案,但上面的一个使用列表comp,这是我想要的答案。谢谢你,先生。我知道我真的不需要处理,我想是VBA的习惯:(.
use conn = ???
conn.Open()
using new SqlCommand("dbo.query_here", conn)(fun cmd ->

    cmd.CommandText <- "dbo.query_here"
    cmd.CommandType <- System.Data.CommandType.StoredProcedure
    cmd.CommandTimeout <- 600
    cmd.Parameters.Add(new SqlParameter("@x1", Convert.ToString(x)))
    cmd.Parameters.Add(new SqlParameter("@y1", y))
    cmd.Parameters.Add(new SqlParameter("@z1", z))
    let reader = cmd.ExecuteReader()
    while (reader.Read()) do
        MyListOfClasses.Add(new MyDataClass(reader.GetInt32(reader.GetOrdinal("x"))           
                                            reader.GetDouble(reader.GetOrdinal("y")),
                                            reader.GetDouble(reader.GetOrdinal("a")),
                                            reader.GetDouble(reader.GetOrdinal("b"))))

    reader.Close()
)
conn.Close()
MyListOfClasses.ToArray() |> List.ofArray
let myListOfClasses = 
  [ let db = new DynamicDatabase(connectionString)
    let rows = db.Query?query_here(string x, y, z)
    for r in rows do 
      yield MyDataClass(row?x, row?y, row?a, row?b) ]