次のコードでは、F#を使用してSQLテーブルに行を挿入または更新したいと考えています。 ユーザーを表すタプルの行列と、いくつかのF#計算の結果である関連スコア(usrID、score)を取ります。
ここで、UserScoresTableというSQLテーブルを更新したいとします。
私が書いたコードは動作していますが、非常に遅いです。F#にストアドプロシージャを含める方法
let cnn = new System.Data.SqlClient.SqlConnection(ConfigurationManager.ConnectionStrings.Item("Database").ConnectionString)
cnn.Open()
// Definition d'une fonction qui execute une demande sous MySQL
let execNonQuery s =
let comm = new System.Data.SqlClient.SqlCommand(s, cnn, CommandTimeout = 10)
comm.ExecuteNonQuery() |> ignore
// Definition d'une fonction qui utilise les éléments d'une matrice pour updater une table dans MySQL
let updateMySQLTable (m : Matrix<float * float>) =
for j in 0 .. (snd m.Dimensions) - 1 do
for i in 1 .. (fst m.Dimensions) - 1 do
// first check if the user and score and date do not exist
sprintf "IF NOT EXISTS (SELECT * FROM ProductScores WHERE UserID = %f AND ProductID = %f) INSERT INTO ProductScores (UserID, Score, Date) VALUES (%f, %f,CURRENT_TIMESTAMP)" (fst m.[i, j]) (snd m.[i, j])
|> execNonQuery
// otherwise update the row
sprintf "UPDATE ProductScores SET Score = %f, Date = CURRENT_TIMESTAMP WHERE UserID = %f " (snd m.[i, j]) (fst m.[i, j])
|> execNonQuery
私は、このような
CREATE PROCEDURE updateScoreByUsers
-- Add the parameters for the stored procedure here
@UserID int,
@Score float
AS
BEGIN
IF NOT EXISTS
(SELECT * FROM ProductScores WHERE UserID = @UserID)
INSERT INTO
ProductScores (UserID, Score, Date) VALUES (@UserID,@Score,CURRENT_TIMESTAMP)
ELSE
UPDATE ProductScores
SET Score = @Score, Date = CURRENT_TIMESTAMP
WHERE UserID = @UserID
END
GO
としてストアドプロシージャを使用してコード内の2つのexecNonQuery要求を避けたいしかし、私はF#でSQLストアドプロシージャを呼び出す方法を知りません。
F#でどのように呼び出すことができますか?
他に改善の方法がありますか?
ADO.NETオブジェクトの管理は、少し壊れやすいようです。 – ChaosPandion
MS SQLまたはMySQLを使用していますか? – ChaosPandion
申し訳ありません私はMS SQLを使用しています。 – fabco63