2012-04-22 62 views
0

我保存了一大組數據,其中每條記錄都有一個時間標記。我想用UTC時間標記保存每個項目,因此我使用ToUniversalTime()(VB.NET)轉換原始時間。這種方法的使用似乎很慢。你有任何提示如何加速過程?ToUniversalTime() - 太慢?

For Each i In CollectionOutput.Select(Function(f) f) 
    Dim utcTimeMark = i.GetTIMEMARK.ToUniversalTime() 
    contextEmanagement.pr_Collection_Store(i.GetID, i.GetTIMEMARK, utcTimeMark, i.GetVALUE) 
Next 

其中.pr_Collection_Store調用SQL Server存儲過程。

+1

顯示你的代碼。 – JohnFx 2012-04-22 21:29:34

+0

是由相同數量的分鐘的移位在數據庫中的每一個值(例如,所有的源數據是由相同的時區,並且在該組的所有數據要麼根本不受日光節約時間,或受其影響的相同量的影響? – 2012-04-22 21:29:46

+0

ToUniversalTime不是「慢」。你的數據庫訪問正在採取的大部分時間。 – usr 2012-04-22 21:37:32

回答

1

目前您的存儲過程大概做這樣的事情(我絕對在數據類型的猜測在這裏,和我假設你使用的是SQL Server 2008或更好的 - 請提問的時候指定版本!):

從應用程序

CREATE TYPE dbo.Collection AS TABLE 
(
    GetID  INT, 
    GetTimeMark DATETIME, 
    UTCTimeMark DATETIME, 
    GetValue INT 
); 
GO 

CREATE PROCEDURE dbo.pr_Collection_Store2 
    @Collection AS dbo.Collection READONLY 
AS 
BEGIN 
    SET NOCOUNT ON; 

    INSERT dbo.SomeTable(ID, TimeMark, UTCTimeMark, Value) 
    SELECT GetID, GetTimeMark, UTCTimeMark, GetValue 
    FROM @Collection AS c 
    WHERE NOT EXISTS (SELECT 1 FROM dbo.SomeTable WHERE ID = c.GetID); 
END 
GO 

然後:

CREATE PROCEDURE dbo.pr_Collection_Store 
    @GetID INT, 
    @GetTimeMark DATETIME, 
    @UTCTimeMark DATETIME, 
    @GetValue INT 
AS 
BEGIN 
    SET NOCOUNT ON; 

    INSERT dbo.SomeTable(ID, TimeMark, UTCTimeMark, Value) 
    SELECT @GetID, @GetTimeMark, @UTCTimeMark, @GetValue; 
END 
GO 

你能做到這一點,而不是。對不起,我知道C#,希望你可以把它翻譯成VB.NET。

DataTable tvp = new DataTable(); 
tvp.Columns.Add(new DataColumn("i")); 
foreach(var i in CollectionOutput) 
{ 
    tvp.Rows.Add(i.GetID, i.GetTIMEMARK, i.GetTIMEMARK.ToUniversalTime(), i.GetValue); 
} 

using (connection) 
{ 
    SqlCommand cmd = new SqlCommand("dbo.pr_Collection_Store2", connection); 
    cmd.CommandType = CommandType.StoredProcedure; 
    SqlParameter tvparam = cmd.Parameters.AddWithValue("@Collection", tvp); 
    tvparam.SqlDbType = SqlDbType.Structured; 
    connection.Open(); 
    cmd.ExecuteNonQuery(); 
} 
+0

這樣的利他主義。謝謝! – Daniel 2012-04-22 22:21:01

+0

順便說一句:我使用SQL Server 2008 R2 – Daniel 2012-04-22 22:35:16

+0

我到目前爲止,我不能在存儲過程中利用實體框架的使用表值參數找到。所以我只能使用「舊」方法才能達到目標 - 就像您在此建議的那樣。 – Daniel 2012-04-22 22:41:13