最近客户对报表的要求有改变,客户要求要能方便的设置顺序报表的开始时间,结束是时间和时间间隔以及报表的变量。思来想去只有WinCCOLEDBProvider能方便的完成在这个要求。所以我就用C#写了一个小程序,通过WinCCOLEDBProvider接口来调用wincc归档数据,然后再利用得到的数据做出一个报表,最后用户可以选择将报表导出为excel文件。
现在问题是,我查询的时间如果短的话是没有问题的的,数据可以正常的查询出来.但是一旦查询的时间比较长就会报错。错误信息为:DB_E_ERRORSINCOMMAND(0x80040E14)
一开始我觉得是我的程序有问题,我不断的检查我的程序,我没有发现有错误。后来我打开sql 的report service,利用report service来查询,发现问题是一样的。查询的时间短没有问题,查询的时间一长就报错。
图1和图2都是用SQL report service 来查询的.
图1是查询时间比较短的截图.
图2是查询时间长的截图
图2是查询时间长的截图
上传一段我查询的关键代码:
string myConnectstr = "Provider=WinCCOLEDBProvider.1;" + "Catalog="+ Database + ";" + "Data Source="+ serverName+ "\\WinCC";
string mySelectQuery = "TAG:R," + "(303;304;305)" + ",'" + starttime + "','" + endtime + "','order by Timestamp ASC','"+ "TimeStep=" + step + ",1'";
//mySelectQuery = "Tag:R,305,'2016-08-30 08:20:27','2016-08-31 08:20:27','order by Timestamp ASC','TimeStep=3600,1'";
try
{
using (OleDbCommand myCommand = new OleDbCommand(mySelectQuery))
{
OleDbConnection myConnection = new OleDbConnection(myConnectstr);
myCommand.Connection = myConnection;
OleDbDataAdapter myAdapter = new OleDbDataAdapter(myCommand);
DataTable myTableTags = new DataTable();
myTableTags.TableName = "myTableTags";
myAdapter.Fill(myTableTags);
dgv.DataSource = myTableTags;
myConnection.Close();
MessageBox.Show(myTableTags.Rows.Count.ToString());
}
}
catch(Exception ex)
{
//myConnection.Close();
MessageBox.Show(ex.Message);
}
现在问题卡住,不知道到底是wincc的connectivity package问题还是MS SQL的问题,我觉得可能是wincc的分段导致的,因为我发现一般在分段时间(项目现在设置的分段时间是一周)查询问题不大,一旦超过一周那么100%报错。希望那位大神帮忙看看,有没有什么其他原因被我忽略了。
----------没有人提供点信息吗?
被客户逼的没办法了,暂时 我先把查询分段了。每三天分一段。一个一星期的查询分三次进行,第一次查3天,第二次查3天,第三次查1天。经过我测试这样查询是可以查询出来。但是一个明显的缺点就是查询时间变长了。因为查询的次数增加了。如果客户一次查询一个月的数据,那效率..........
软件版本:wincc 7.2 update7
我尝试用wincc 7.3测试也是同样的问题。
在2014年的时候我记得当初用wincc 7.0 SP3的时候是没有这个问题的。
操作系统:win7 32位和64位都测试过了,都是同样的结果。
难道这个是一个很冷的东西?没有什么人用?我现在甚至都怀疑西门子有没有对connectivity package做过严格的测试了。connectivity package的文档中的例子说明什么的都标明“西门子不对此提供技术支持”。我真是晕......
实在没办法只能暂时这么用着,再实在不行我就自己创建一个数据库,用c#写个程序,读取wincc的变量,定时往数据库写数据,然后再做一个程序从数据库查询了 。wincc 7.2 /7.3的connectivity package提供的oledb接口这的让人伤心了。
|