2012-04-03 75 views
0

我的环境如下:时间SQL数据类型生成无效的变体异常

SQL Server 2008的 的Visual C#快递在Windows 7

我有一个存储过程返回多个领域,其中包括一个运行这是数据类型'时间'。当我尝试将此字段分配给一个变量时(在代​​码片段中使用了timespan,显然是使用该变量的时间段,但也尝试过使用datetime和object得到相同的结果),编译器会给出以下MDA错误:

InvalidVariant was detected
Invalid variant was detected during a conversion from an unmanaged VARIANT to a managed object. Passing invalid VARIANTs to the CLR can cause unexpected exceptions, corruption or data loss.

非常感谢您提供的任何帮助。

的代码如下:

private void CreateCScrapeObjects(string ItemsToScrapeStoredProc, int MaxItemsPerRequest, int SendRequestTolerance) 
    { 
     object tempobjecttotestnull; 
     string scrapename; 
     string scrapeurl; 
     string scrapetemplate; 
     string latestflag; 
     string parameter1; 
     string parameter2; 
     string parameter3; 
     string parameter1replacestring; 
     string parameter2replacestring; 
     string parameter3replacestring; 
     int dataitemsperday; 
     DateTime lastsuccessfulrequesttime; 
     DateTime lastscrapeddatadate; 
     TimeSpan scrapetime; 

     DateTime startdate; 
     DateTime startdateforrequestitem; 
     DateTime enddate; 
     DateTime enddateforrequestitem; 

     int latestdateoffset; 
     string scrapefrequencytype; 
     int scrapefrequencynumber; 
     string rescrapefrequencytype; 
     int rescrapefrequencynumber; 


     Scrapeobject MyScrape = new Scrapeobject(); 
     List<ADODB.Parameter> oParams = new List<ADODB.Parameter>(); 
     ADODB.Recordset oRst = new ADODB.Recordset(); 
     if (_databasequeue.RunStoredProcedure(ItemsToScrapeStoredProc, , oParams, _connectstring, ref oRst, ADODB.ExecuteOptionEnum.adOptionUnspecified)) 
     { 
      while (!oRst.EOF) 
      { 
       scrapename = (string)oRst.Fields[0].Value; 
       scrapeurl = (string)oRst.Fields[1].Value; 
       scrapetemplate = (string)oRst.Fields[2].Value; 
       latestflag = (string)oRst.Fields[3].Value; 

       tempobjecttotestnull = oRst.Fields[5].Value; 
       if (tempobjecttotestnull.Equals(System.DBNull.Value)) 
       { parameter1 = ""; } 
       else 
       { parameter1 = (string)tempobjecttotestnull; } 

       tempobjecttotestnull = oRst.Fields[7].Value; 
       if (tempobjecttotestnull.Equals(System.DBNull.Value)) 
       { parameter2 = ""; } 
       else 
       { parameter2 = (string)tempobjecttotestnull; } 

       tempobjecttotestnull = oRst.Fields[9].Value; 
       if (tempobjecttotestnull.Equals(System.DBNull.Value)) 
       { parameter3 = ""; } 
       else 
       { parameter3 = (string)tempobjecttotestnull; } 

       tempobjecttotestnull = oRst.Fields[4].Value; 
       if (tempobjecttotestnull.Equals(System.DBNull.Value)) 
       { parameter1replacestring = ""; } 
       else 
       { parameter1replacestring = (string)tempobjecttotestnull; } 

       tempobjecttotestnull = oRst.Fields[6].Value; 
       if (tempobjecttotestnull.Equals(System.DBNull.Value)) 
       { parameter2replacestring = ""; } 
       else 
       { parameter2replacestring = (string)tempobjecttotestnull; } 

       tempobjecttotestnull = oRst.Fields[8].Value; 
       if (tempobjecttotestnull.Equals(System.DBNull.Value)) 
       { parameter3replacestring = ""; } 
       else 
       { parameter3replacestring = (string)tempobjecttotestnull; } 

       dataitemsperday = (int)oRst.Fields[14].Value; 
       latestdateoffset = (int)oRst.Fields[15].Value; 
       scrapefrequencytype = (string)oRst.Fields[10].Value; 
       scrapefrequencynumber = (int)oRst.Fields[11].Value; 
       rescrapefrequencytype = (string)oRst.Fields[12].Value; 
       rescrapefrequencynumber = (int)oRst.Fields[13].Value; 



       scrapetime = TimeSpan.Parse(Convert.ToString (oRst.Fields[16].Value)); 
       lastsuccessfulrequesttime = Convert.ToDateTime(oRst.Fields[17].Value); 
       lastscrapeddatadate = Convert.ToDateTime(oRst.Fields[18].Value); 

       startdate = GetNextScrapeDate(scrapefrequencytype, scrapefrequencynumber, lastscrapeddatadate,scrapetime); 
       enddate = DateTime.Now.AddDays(latestdateoffset); 

       startdateforrequestitem = startdate; 
       enddateforrequestitem = GetScrapeRequestEndDate(scrapefrequencytype,scrapefrequencynumber,lastscrapeddatadate,enddate,MaxNGCDataItemsPerRequest,scrapetime); 

       while(startdateforrequestitem<enddate) 
       { 

        if (MyScrape == null) 
        { 
         MyScrape = new ScrapeObject(); 
         MyScrape .DefineScrape(startdateforrequestitem, enddateforrequestitem, scrapeurl, scrapetemplate); 
         MyScrape .AddItemToRequest(latestflag, parameter1, parameter2, parameter3, parameter1replacestring, parameter2replacestring, parameter3replacestring); 
        } 
        else 
        { 
         int expecteddataitems = ScrapeFrequency.ExpectedDataItems(scrapefrequencytype,scrapefrequencynumber,startdateforrequestitem,enddateforrequestitem,scrapetime); 
         if (expecteddataitems > MyScrape .MinRemainingScrapeItems(MaxItemsPerRequest)) 
         { 
          _scrapequeue.AddQueueItem(MyScrape); 
          MyScrape = null; 
          MyScrape = new ScrapeObject(); 
          MyScrape .DefineScrape(startdateforrequestitem, enddateforrequestitem, scrapeurl, scrapetemplate); 
          MyScrape .AddItemToRequest(latestflag, parameter1, parameter2, parameter3, parameter1replacestring, parameter2replacestring, parameter3replacestring); 
         } 
         else 
         { 
          MyScrape .AddItemToRequest(latestflag, parameter1, parameter2, parameter3, parameter1replacestring, parameter2replacestring, parameter3replacestring); 
         } 

        } 


       } 
      } 
      if (MyScrape != null) 
      { 
       _scrapequeue.AddQueueItem(MyScrape); 
      } 
     } 
     else 
     { 
      //raise error 
     } 

    } 

回答

0

我用ADODB的错误版本(我不得不使用旧版本的COM,因为这是工作了,我觉得没必要推倒重来)。尽管如此,在这种情况下,我应该更新,因为时间SQL数据类型是新的,并且(显然)不支持旧的adodb版本。我重写了所有数据库交互以使用adodb.net,并且它适用于Timespan类型。

相关问题