我正在用F#3.0學習LINQ。我想知道如何重寫我的舊代碼以使用F#3.0中的新LINQ功能。例如,我在SQL Server 2008 R2中創建了一個簡單的數據表,數據庫名稱爲myDatabase。F#LINQ向SQL Server添加新行
-- 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
現在,我怎麼可以重新寫入新行添加代碼更好? 我想我可以wrtie一些代碼,如:
#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中的手,我可以立即看到結果 任何人有這樣一個更好的主意 感謝, 約翰