F # LINQ добавить новые строки в SQL Server - PullRequest
4 голосов
/ 29 января 2012

Я учусь LINQ с F # 3.0.Я хочу знать, как переписать мой старый код для использования новых функций LINQ в F # 3.0. Например, я создал простую таблицу данных в 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 я могу использовать набор данных для добавления новых строк, например:

#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

Теперь, с F # 3.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, так как я сразу вижу результаты. У кого-нибудь есть идеи по этому поводу? Спасибо, Джон

1 Ответ

5 голосов
/ 29 января 2012

Вы можете использовать InsertOnSubmit и InsertAllOnSubmit для удобной вставки статически типизированной записи.Что-то вроде:

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()

Также см. http://msdn.microsoft.com/en-us/library/hh361033(v=vs.110).aspx и выполните поиск на странице "InsertOnSubmit" (на самом деле, здесь приведен пример для вашей демонстрационной таблицы Table1).

...