Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/fsharp/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Linq to sql F LINQ向SQL Server添加新行_Linq To Sql_F#_Sql Server 2008 R2 - Fatal编程技术网

Linq to sql F LINQ向SQL Server添加新行

Linq to sql F LINQ向SQL Server添加新行,linq-to-sql,f#,sql-server-2008-r2,Linq To Sql,F#,Sql Server 2008 R2,我正在用F3.0学习LINQ。我想知道如何重新编写旧代码以使用F 3.0中的新LINQ功能例如,我在SQL Server 2008 R2中创建了一个简单的数据表,数据库名为myDatabase -- Create the Table1 table. CREATE TABLE [dbo].[Table1] ( [Id] INT NOT NULL, [TestData1] INT NOT NULL, [TestData2] FLOAT

我正在用F3.0学习LINQ。我想知道如何重新编写旧代码以使用F 3.0中的新LINQ功能例如,我在SQL Server 2008 R2中创建了一个简单的数据表,数据库名为myDatabase

-- Create the Table1 table.
CREATE TABLE [dbo].[Table1] (
    [Id]        INT        NOT NULL,
    [TestData1] INT        NOT NULL,
    [TestData2] FLOAT (53) NOT NULL,
    [Name]      NTEXT      NOT NULL,
    PRIMARY KEY CLUSTERED ([Id] ASC)
);
对于F 2.0,我可以使用Dataset添加新行,如下所示:

#light
open System
open System.Collections.Generic 
open System.Data
open System.Data.SqlClient

let sqlConn = "server=(local); Integrated Security=True; Database=MyDatabase"
let connDB = new SqlConnection(sqlConn)
let sql = "SELECT * FROM Table1"
let da = new SqlDataAdapter(sql, connDB)
let ds  = new DataSet()
da.Fill(ds) |> ignore
let commandBuilder: SqlCommandBuilder = new SqlCommandBuilder(da)

for i = 0 to 1 do
    let newDR: DataRow = ds.Tables.Item(0).NewRow()
    newDR.Item(0) <- (i + 1)
    newDR.Item(1) <- (i * 10)
    newDR.Item(2) <- ( decimal i ) * 5.0M
    newDR.Item(3) <- "Testing" + (i + 1).ToString()
    ds.Tables.Item(0).Rows.Add(newDR)
da.Update(ds) |> ignore
现在有了F3.0,如何更好地重新编写添加新行代码? 我想我可以编写一些代码,比如:

#light
open System
open System.Data.Linq
open Microsoft.FSharp.Data.TypeProviders
open Microsoft.FSharp.Linq

[<Generate>]
type dbSchema = SqlDataConnection<"Data Source=.;Initial Catalog=MyDatabase;Integrated Security=True">
let db = dbSchema.GetDataContext()

try
   db.DataContext.ExecuteCommand("INSERT INTO Table1 (Id, TestData1, TestData2, Name) VALUES (1, 10, 0.0, 'Testing1')") |> ignore
with
   | exn -> printfn "Exception:\n%s" exn.Message

try
   db.DataContext.ExecuteCommand("INSERT INTO Table1 (Id, TestData1, TestData2, Name) VALUES (2, 20, 5.0, 'Testing2')") |> ignore
with
   | exn -> printfn "Exception:\n%s" exn.Message
但我不认为新方法更好,事实上,我认为它更糟。在F 2.0中,我可以使用代码为数据表生成值,但如果我必须编写静态SQL语句,如INSERT INTO Table1 values(插入带有前缀值的值),那么我想我更喜欢从SQL Server Management Studio手动插入数据记录,因为我可以立即看到结果。 有人对此有更好的想法吗? 谢谢 John

您可以使用和进行漂亮的静态类型记录插入。比如:

let newRecords =
    [for i in [0 .. 1] ->
        new Table1(Id=(i + 1), TestData1=(i * 10), TestData2=( decimal i ) * 5.0M, Name="Testing" + (i + 1).ToString())]

db.Table1.InsertAllOnSubmit(newRecords)
db.SubmitChanges()
另外,请在页面中查看并搜索InsertOnSubmit事实上,这里的示例是为Table1演示表制作的