2012-04-22 70 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