【问题标题】:F# SQL Insert in Observable在 Observable 中插入 F# SQL
【发布时间】:2014-09-06 10:28:49
【问题描述】:

我有一个 SQL Server CE 数据库,我正在尝试使用事件中的值进行更新,但是当我尝试从可观察的事件中插入时,控制台会打印出来

有人知道这是为什么吗?

在 observable 之外工作的代码:

    let test1 =
       use con  = new SqlCeConnection (@"Data Source=C:\Users\Database1.sdf")
       con.Open()
       let AA = "Enter"
       let BB = "Enter"
       use cmd = new SqlCeCommand("insert into Table1 (A,B) values (@A, @B)", con) 
       let A1 = new SqlCeParameter("A", "1")
       let B1 = new SqlCeParameter("B", "2")
       do cmd.Parameters.Add A1 |>ignore
       do cmd.Parameters.Add B1 |>ignore
       do cmd.ExecuteNonQuery() |>ignore
       printfn "%s" "complete1"
       ()

返回 的代码,还要注意最后的 printfn 没有执行。

    let sqlsubmit = stream|> Observable.map (fun x -> 
            use con  = new SqlCeConnection (@"Data Source=C:\Users\Database1.sdf")
            con.Open()
            let AA = "Enter"
            let BB = "Enter"
            use cmd = new SqlCeCommand("insert into Table1 (A,B) values (@A, @B)", con) 
            let A1 = new SqlCeParameter("A", "1")
            let B1 = new SqlCeParameter("B", "2")
            do cmd.Parameters.Add A1 |>ignore
            do cmd.Parameters.Add B1 |>ignore
            do cmd.ExecuteNonQuery |>ignore
            printfn "%s" "complete1"
            )

我在 Linq 中尝试过 SubmitChanges(),效果也一样。

这是用于 LINQ SubmitChanges 的类型:

    [<Table(Name = "Table1")>]
    type Macro (A:string, B:string)=    

    [<Column(IsPrimaryKey=true)>]
    member this.A = A
    [<Column>]
    member this.B = B

【问题讨论】:

  • 没有printfn "%s" "complete1"的边可以用printfn "complete1"代替,不需要"%s"。此外,您的表名不同

标签: sql linq f# sql-server-ce unit-type


【解决方案1】:

F# 中的unit 类型是单例类型;它的值由()指定。

() 值在编译后的代码中由 null 表示,这就是您看到代码返回 null 的原因。

【讨论】:

  • 把最后的()删掉了,又试了SubmitChanges删了,还是都返回了...
  • 即使你不把()放在最后,如果表达式的类型是'unit',函数返回单位值——即null,而不是@ 987654328@ 就像在 C# 中一样。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-06-08
  • 2022-02-04
  • 2018-02-02
  • 2017-09-20
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多