public IList<PointSVO> Save(IList<PointSVO> points, string machineName, double accuracy = 0.1)
{
IList<PointSVO> unSavePoints = new List<PointSVO>();
IList<PointSVO> insertPoints = new List<PointSVO>();
List<uint> dataIndexTable = new List<uint>();
double reciprocalAccuracy = 1 / accuracy;
using (var conn = _DBHelper.GetConnection())
{
conn.Open();
//获取所有表中数据
using (var reader = _DBHelper.Select(conn, _DBTableName, "", CreateSaveSelectColumnDescription()))
{
//生成以用数据表
while (reader.Read())
{
//chainage
uint rowIndex = GetStep(reader.GetDouble(0), reciprocalAccuracy, 0);
//offset
uint columnIndex = GetStep(reader.GetDouble(1), reciprocalAccuracy, 1000);
uint tableIndex = (rowIndex << 16) + columnIndex;
dataIndexTable.Add(tableIndex);
}
reader.Close();
}
//插入新点,生成新点表与未使用表
foreach (var point in points)
{
//在精度范围内搜索数据
//chainage
uint rowIndex = GetStep(point.SCoordinateH.Chainage, reciprocalAccuracy, 0);
//offset
uint columnIndex = GetStep(point.SCoordinateH.Offset, reciprocalAccuracy, 1000);
uint tableIndex = (rowIndex << 16) + columnIndex;
if (!dataIndexTable.Contains(tableIndex))
{
//没有找到对象,插值
insertPoints.Add(point);
dataIndexTable.Add(tableIndex);
}
else
{
//找到对象了,放入未使用点集里
unSavePoints.Add(point);
}
}
//更新新点
StringBuilder insertValueStr = new StringBuilder(20480);//20M缓存
var cmd = _DBHelper.GetCommand(conn);
string columnStr = _DBHelper.GetColumnsString(_pointSVODescription.GetRange(1, _pointSVODescription.Count - 1));
foreach (var point in insertPoints)
{
insertValueStr.Append(ConvertToValueString(point, machineName) + ",");
if (insertValueStr.Length > 20000)
{
insertValueStr.Remove(insertValueStr.Length - 1, 1);
_DBHelper.Insert(cmd, _DBTableName, "", columnStr, insertValueStr.ToString());
insertValueStr.Clear();
}
}
//处理最后未处理完数据
if (insertValueStr.Length > 0)
{
insertValueStr.Remove(insertValueStr.Length - 1, 1);
_DBHelper.Insert(cmd, _DBTableName, "", columnStr, insertValueStr.ToString());
insertValueStr.Clear();
}
conn.Close();
}
return unSavePoints;
}
急急急,在线等....谢谢....