public static string SaveAndReorder(AdoDataConnection database, Phasor phasor, int oldSourceIndex, bool skipMeasurementUpdate = false)
{
bool createdConnection = false;
string query;
try
{
createdConnection = CreateConnection(ref database);
if (phasor.SourceIndex == 0)
phasor.SourceIndex = database.ExecuteScalar<int>("SELECT MAX(SourceIndex) FROM Phasor WHERE DeviceID = {0}", phasor.DeviceID) + 1;
// Since phasors could be reordered in the source device, this test could inadvertently throw an exception when it should not - so the validation has been removed
//if (database.ExecuteScalar<int>("SELECT COUNT(*) FROM Phasor WHERE ID <> {0} AND DeviceID = {1} AND SourceIndex = {2}", phasor.ID, phasor.DeviceID, phasor.SourceIndex) > 0)
// throw new InvalidOperationException("Phasor source index must be unique per device.");
if (phasor.ID == 0)
{
query = database.ParameterizedQueryString("INSERT INTO Phasor (DeviceID, Label, Type, Phase, SourceIndex, UpdatedBy, UpdatedOn, CreatedBy, CreatedOn) " +
"VALUES ({0}, {1}, {2}, {3}, {4}, {5}, {6}, {7}, {8})", "deviceID", "label", "type", "phase", "sourceIndex", "updatedBy", "updatedOn", "createdBy",
"createdOn");
database.Connection.ExecuteNonQuery(query, DefaultTimeout, phasor.DeviceID, phasor.Label, phasor.Type, phasor.Phase, phasor.SourceIndex,
CommonFunctions.CurrentUser, database.UtcNow, CommonFunctions.CurrentUser, database.UtcNow);
}
else
{
query = database.ParameterizedQueryString("UPDATE Phasor SET DeviceID = {0}, Label = {1}, Type = {2}, Phase = {3}, SourceIndex = {4}, " +
"UpdatedBy = {5}, UpdatedOn = {6} WHERE ID = {7}", "deviceID", "label", "type", "phase", "sourceIndex", "updatedBy", "updatedOn", "id");
database.Connection.ExecuteNonQuery(query, DefaultTimeout, phasor.DeviceID, phasor.Label, phasor.Type,
phasor.Phase, phasor.SourceIndex, CommonFunctions.CurrentUser, database.UtcNow, phasor.ID);
}
// Get reference to the device to which phasor is being added.
Device device = Device.GetDevice(database, "WHERE ID = " + phasor.DeviceID);
// Get Phasor signal types.
ObservableCollection<SignalType> signals;
if (phasor.Type == "V")
signals = SignalType.GetVoltagePhasorSignalTypes();
else
signals = SignalType.GetCurrentPhasorSignalTypes();
// Get reference to phasor which has just been added.
Phasor addedPhasor = GetPhasor(database, "WHERE DeviceID = " + phasor.DeviceID + " AND SourceIndex = " + phasor.SourceIndex);
foreach (SignalType signal in signals)
{
Measurement measurement = Measurement.GetMeasurement(database, "WHERE DeviceID = " + phasor.DeviceID + " AND SignalTypeSuffix = '" + signal.Suffix + "' AND PhasorSourceIndex = " + oldSourceIndex);
if ((object)measurement == null)
{
measurement = new Measurement();
measurement.DeviceID = device.ID;
measurement.HistorianID = device.HistorianID;
measurement.PointTag = CommonPhasorServices.CreatePointTag(device.CompanyAcronym, device.Acronym, device.VendorAcronym, signal.Acronym, addedPhasor.SourceIndex, addedPhasor.Phase[0]);
measurement.SignalReference = device.Acronym + "-" + signal.Suffix + addedPhasor.SourceIndex;
measurement.SignalTypeID = signal.ID;
measurement.Description = device.Name + " " + addedPhasor.Label + " " + device.VendorDeviceName + " " + addedPhasor.Phase + " " + signal.Name;
measurement.PhasorSourceIndex = addedPhasor.SourceIndex;
measurement.Enabled = true;
Measurement.Save(database, measurement);
}
else if (!skipMeasurementUpdate || addedPhasor.SourceIndex != oldSourceIndex) // || measurement.SignalTypeID != signal.ID
{
// Update existing record when needed or when phasor source index has changed
measurement.HistorianID = device.HistorianID;
measurement.PointTag = CommonPhasorServices.CreatePointTag(device.CompanyAcronym, device.Acronym, device.VendorAcronym, signal.Acronym, addedPhasor.SourceIndex, addedPhasor.Phase[0]);
measurement.SignalReference = device.Acronym + "-" + signal.Suffix + addedPhasor.SourceIndex;
measurement.SignalTypeID = signal.ID;
measurement.Description = device.Name + " " + addedPhasor.Label + " " + device.VendorDeviceName + " " + addedPhasor.Phase + " " + signal.Name;
measurement.PhasorSourceIndex = addedPhasor.SourceIndex;
Measurement.Save(database, measurement);
}
}
return "Phasor information saved successfully";
}
finally
{
if (createdConnection && database != null)
database.Dispose();
}
}