359 lines
16 KiB
C#
359 lines
16 KiB
C#
using System;
|
|
using System.Collections.Generic;
|
|
using System.Linq;
|
|
using System.Text;
|
|
using System.Threading.Tasks;
|
|
using System.Data.SqlClient;
|
|
using System.Data;
|
|
using MySql.Data.MySqlClient;
|
|
using System.IO;
|
|
|
|
namespace DataPoolingService
|
|
{
|
|
class DALscada
|
|
{
|
|
ConnectionClass ConnectionClass = new ConnectionClass();
|
|
Logger Logger = new Logger();
|
|
SqlCommand sqlCommand = new SqlCommand();
|
|
DataTable dataTable = new DataTable();
|
|
SqlDataAdapter SqlDataAdapter = new SqlDataAdapter();
|
|
|
|
MySqlCommand MySqlCommand = new MySqlCommand();
|
|
Boolean check = false;
|
|
private static int site_id, uom_id, meter_id;
|
|
private static string meter_no;
|
|
private static double units;
|
|
private static DateTime date;
|
|
private static string reading_method;
|
|
|
|
public void GetAndInsertData()
|
|
{
|
|
try
|
|
{
|
|
ConnectionClass.OpenConnection();
|
|
// string query = "Select b.reading_method,a.* from utility_sub_meter_reading a ,utility_sub_meter b WHERE CONVERT(date, date) = '2025-01-19' and a.meter_id = b.meter_id";
|
|
string query = "Select b.reading_method,a.* from utility_sub_meter_reading a ,utility_sub_meter b WHERE CONVERT(date, date) = CONVERT(date, GETDATE()) and a.meter_id = b.meter_id";
|
|
|
|
sqlCommand = new SqlCommand(query, ConnectionClass.connection);
|
|
SqlDataAdapter.SelectCommand = sqlCommand;
|
|
dataTable = new DataTable();
|
|
SqlDataAdapter.Fill(dataTable);
|
|
ConnectionClass.CloseConnection();
|
|
|
|
if (dataTable.Rows.Count > 0)
|
|
{
|
|
InsertingData(dataTable);
|
|
}
|
|
else
|
|
{
|
|
Logger.NotFoundLog();
|
|
}
|
|
}
|
|
catch (Exception ex)
|
|
{
|
|
ConnectionClass.CloseConnection();
|
|
}
|
|
|
|
}
|
|
private bool CheckRecordExist()
|
|
{
|
|
try
|
|
{
|
|
ConnectionClass.OpenConnectionMysql();
|
|
|
|
DataRowCollection rows = dataTable.Rows; // Get the collection of rows from the DataTable
|
|
|
|
string query = "SELECT * FROM utility_sub_meter_reading WHERE DATE(reading_timestamp) = CURDATE() limit 1";
|
|
//string query = "Select * from utility_sub_meter_reading a where date(a.reading_timestamp) = '2024-04-05'";
|
|
|
|
MySqlCommand mySqlCommand = new MySqlCommand(query, ConnectionClass.MySqlConnection);
|
|
|
|
using (MySqlDataReader dataReader = mySqlCommand.ExecuteReader())
|
|
{
|
|
// Check if any rows are returned by the query
|
|
if (dataReader.HasRows)
|
|
{
|
|
check = true;
|
|
return true; // Records exist for the current date
|
|
}
|
|
}
|
|
check = false;
|
|
return false; // No records found for the current date
|
|
}
|
|
catch (Exception ex)
|
|
{
|
|
// Log or handle the exception appropriately
|
|
Console.WriteLine("Error: " + ex.Message);
|
|
return false; // Or return true/false based on your error handling strategy
|
|
}
|
|
finally
|
|
{
|
|
ConnectionClass.CloseConnectionMysql(); // Ensure connection is closed
|
|
}
|
|
}
|
|
private void InsertingData(DataTable dt)
|
|
{
|
|
try
|
|
{
|
|
Logger.StartLogEvent();
|
|
ConnectionClass.OpenConnectionMysql();
|
|
|
|
foreach (DataRow dr in dt.Rows)
|
|
{
|
|
meter_id = Convert.ToInt32(dr["meter_id"]);
|
|
meter_no = (dr["meter_number"].ToString());
|
|
site_id = Convert.ToInt32(dr["site_id"]);
|
|
uom_id = Convert.ToInt32(dr["uom_id"]);
|
|
units = Convert.ToDouble(dr["units"]);
|
|
date = Convert.ToDateTime(dr["date"]);
|
|
|
|
string mySqlDefaultFormat = date.ToString("yyyy-MM-dd HH:mm:ss");
|
|
|
|
// Check if the record already exists
|
|
string checkQuery = "SELECT COUNT(*) FROM utility_sub_meter_reading " +
|
|
"WHERE meter_id = @meter_id AND " +
|
|
"DATE(reading_timestamp) = DATE(@date)";
|
|
|
|
using (MySqlCommand checkCmd = new MySqlCommand(checkQuery, ConnectionClass.MySqlConnection))
|
|
{
|
|
checkCmd.Parameters.AddWithValue("@meter_id", meter_id);
|
|
checkCmd.Parameters.AddWithValue("@site_id", site_id);
|
|
checkCmd.Parameters.AddWithValue("@date", mySqlDefaultFormat);
|
|
|
|
int recordExists = Convert.ToInt32(checkCmd.ExecuteScalar());
|
|
|
|
if (recordExists == 0) // If the record does not exist
|
|
{
|
|
reading_method = dr["reading_method"].ToString();
|
|
string insertQuery;
|
|
if (reading_method == "CONSUMPTION")
|
|
{
|
|
insertQuery = "INSERT INTO utility_sub_meter_reading " +
|
|
"(meter_id, meter_number, site_id, uom_id, reading_diff, reading_timestamp) " +
|
|
"VALUES (@meter_id, @meter_no, @site_id, @uom_id, @units, @date)";
|
|
|
|
}
|
|
else
|
|
{
|
|
|
|
insertQuery = "INSERT INTO utility_sub_meter_reading " +
|
|
"(meter_id, meter_number, site_id, uom_id, reading, reading_timestamp) " +
|
|
"VALUES (@meter_id, @meter_no, @site_id, @uom_id, @units, @date)";
|
|
|
|
}
|
|
|
|
|
|
|
|
using (MySqlCommand insertCmd = new MySqlCommand(insertQuery, ConnectionClass.MySqlConnection))
|
|
{
|
|
insertCmd.Parameters.AddWithValue("@meter_id", meter_id);
|
|
insertCmd.Parameters.AddWithValue("@meter_no", meter_no);
|
|
insertCmd.Parameters.AddWithValue("@site_id", site_id);
|
|
insertCmd.Parameters.AddWithValue("@uom_id", uom_id);
|
|
insertCmd.Parameters.AddWithValue("@units", units);
|
|
insertCmd.Parameters.AddWithValue("@date", mySqlDefaultFormat);
|
|
|
|
// Execute the query
|
|
int rowsAffected = insertCmd.ExecuteNonQuery();
|
|
|
|
if (rowsAffected == 1)
|
|
{
|
|
// Log the successful insert to the text file
|
|
Logger.RowSuccessLog(meter_no, site_id, units);
|
|
}
|
|
else
|
|
{
|
|
// Log the failed insert to the text file
|
|
Logger.RowFailedLog(meter_no, site_id, units);
|
|
}
|
|
}
|
|
}
|
|
else
|
|
{
|
|
// Log if record already exists
|
|
Logger.RowAlreadyExistsLog(meter_no, site_id, units);
|
|
}
|
|
}
|
|
}
|
|
|
|
ConnectionClass.CloseConnectionMysql();
|
|
Logger.EndLogEvent();
|
|
}
|
|
catch (Exception ex)
|
|
{
|
|
// Handle any exceptions that may occur during execution.
|
|
//Logger.ErrorLog(ex);
|
|
ConnectionClass.CloseConnectionMysql();
|
|
}
|
|
}
|
|
private string GetDate()
|
|
{
|
|
DateTime currentDateTime = DateTime.Now;
|
|
// Convert to MySQL's default format 'YYYY-MM-DD HH:MM:SS'
|
|
string mySqlDefaultFormat = currentDateTime.ToString("yyyy-MM-dd HH:mm:ss");
|
|
return mySqlDefaultFormat;
|
|
}
|
|
public void InsertReadingDiff()
|
|
{
|
|
if (check == false)
|
|
{
|
|
dataTable = new DataTable();
|
|
|
|
ConnectionClass.OpenConnectionMysql();
|
|
string query = @"SELECT
|
|
b.meter_number,
|
|
IF(b.units = 0, 0, b.units) AS units_yesterday,
|
|
c.units AS units_today,
|
|
DATE(b.reading_timestamp) AS date_yesterday,
|
|
DATE(c.reading_timestamp) AS date_today
|
|
FROM
|
|
utility_sub_meter_reading AS b
|
|
JOIN
|
|
utility_sub_meter_reading AS c
|
|
ON DATE(b.reading_timestamp) = DATE(c.reading_timestamp) - INTERVAL 1 DAY
|
|
AND b.meter_number = c.meter_number
|
|
JOIN
|
|
utility_sub_meter sm
|
|
ON c.meter_number = sm.meter_number
|
|
WHERE
|
|
DATE(c.reading_timestamp) = CURDATE()
|
|
AND sm.utility_type = 'SOLAR'";
|
|
MySqlCommand = new MySqlCommand(query, ConnectionClass.MySqlConnection);
|
|
MySqlDataAdapter mySqlDataAdapter = new MySqlDataAdapter();
|
|
mySqlDataAdapter.SelectCommand = MySqlCommand; //
|
|
mySqlDataAdapter.Fill(dataTable); //
|
|
|
|
if (dataTable.Rows.Count > 0)
|
|
{
|
|
// ConnectionClass.OpenConnection();
|
|
|
|
// Loop through the rows of the DataTable
|
|
foreach (DataRow row in dataTable.Rows)
|
|
{
|
|
// Calculate the difference between units_today and units_yesterday
|
|
double unitsToday = Convert.ToDouble(row["units_today"]);
|
|
double unitsYesterday = Convert.ToDouble(row["units_yesterday"]);
|
|
double readingDiff = unitsToday - unitsYesterday;
|
|
|
|
// Update the utility_sub_meter_reading table
|
|
string updateQuery = @"UPDATE utility_sub_meter_reading
|
|
SET reading_diff = @reading_diff
|
|
WHERE meter_number = @meter_number
|
|
AND DATE(reading_timestamp) = @date_today";
|
|
|
|
MySqlCommand updateCommand = new MySqlCommand(updateQuery, ConnectionClass.MySqlConnection);
|
|
updateCommand.Parameters.AddWithValue("@reading_diff", readingDiff);
|
|
updateCommand.Parameters.AddWithValue("@meter_number", row["meter_number"]);
|
|
updateCommand.Parameters.AddWithValue("@date_today", row["date_today"]);
|
|
updateCommand.ExecuteNonQuery();
|
|
}
|
|
}
|
|
ConnectionClass.CloseConnectionMysql();
|
|
}
|
|
}
|
|
|
|
public void SyncUtilitySubMeterData()
|
|
{
|
|
try
|
|
{
|
|
// Step 1: Get data from MySQL
|
|
FetchDataFromMySQL();
|
|
|
|
if (dataTable.Rows.Count > 0)
|
|
{
|
|
// Step 2: Synchronize data with SQL Server
|
|
SynchronizeWithSQLServer();
|
|
Console.WriteLine("Data synchronized successfully.");
|
|
}
|
|
else
|
|
{
|
|
Console.WriteLine("No data found in MySQL to synchronize.");
|
|
}
|
|
}
|
|
catch (Exception ex)
|
|
{
|
|
Console.WriteLine("Error during synchronization: " + ex.Message);
|
|
}
|
|
}
|
|
private void FetchDataFromMySQL()
|
|
{
|
|
ConnectionClass.OpenConnectionMysql();
|
|
string query = "SELECT * FROM utility_sub_meter";
|
|
MySqlCommand = new MySqlCommand(query, ConnectionClass.MySqlConnection);
|
|
MySqlDataAdapter mySqlDataAdapter = new MySqlDataAdapter();
|
|
mySqlDataAdapter.SelectCommand = MySqlCommand; //
|
|
mySqlDataAdapter.Fill(dataTable); //
|
|
ConnectionClass.CloseConnectionMysql();
|
|
}
|
|
|
|
private void SynchronizeWithSQLServer()
|
|
{
|
|
const string deleteQuery = "DELETE FROM utility_sub_meter";
|
|
const string insertQuery = @"
|
|
INSERT INTO utility_sub_meter
|
|
(meter_id, utility_type, uom_id, allocation_type, site_id, unit_id,
|
|
meter_number, location, added_by, date_time_added, install_capacity, scada_tag,description,is_active,reading_method)
|
|
VALUES
|
|
(@MeterID, @UtilityType, @UOMID, @AllocationType, @SiteID, @UnitID,
|
|
@MeterNumber, @Location, @AddedBy, @DateTimeAdded, @InstallCapacity, @ScadaTag,@Description,@IsActive,@ReadingMethod)";
|
|
|
|
ConnectionClass.OpenConnection();
|
|
|
|
// Step 1: Delete existing data
|
|
using (var deleteCommand = new SqlCommand(deleteQuery, ConnectionClass.connection))
|
|
{
|
|
deleteCommand.ExecuteNonQuery();
|
|
}
|
|
|
|
// Step 2: Insert new data
|
|
using (var transaction = ConnectionClass.connection.BeginTransaction())
|
|
{
|
|
using (var insertCommand = new SqlCommand(insertQuery, ConnectionClass.connection, transaction))
|
|
{
|
|
// Add parameters once to avoid creating them repeatedly
|
|
insertCommand.Parameters.Add("@MeterID", SqlDbType.Int);
|
|
insertCommand.Parameters.Add("@UtilityType", SqlDbType.VarChar);
|
|
insertCommand.Parameters.Add("@UOMID", SqlDbType.Int);
|
|
insertCommand.Parameters.Add("@AllocationType", SqlDbType.VarChar);
|
|
insertCommand.Parameters.Add("@SiteID", SqlDbType.Int);
|
|
insertCommand.Parameters.Add("@UnitID", SqlDbType.Int);
|
|
insertCommand.Parameters.Add("@MeterNumber", SqlDbType.VarChar);
|
|
insertCommand.Parameters.Add("@Location", SqlDbType.VarChar);
|
|
insertCommand.Parameters.Add("@AddedBy", SqlDbType.VarChar);
|
|
insertCommand.Parameters.Add("@DateTimeAdded", SqlDbType.DateTime);
|
|
insertCommand.Parameters.Add("@InstallCapacity", SqlDbType.Decimal);
|
|
insertCommand.Parameters.Add("@ScadaTag", SqlDbType.VarChar);
|
|
insertCommand.Parameters.Add("@Description", SqlDbType.VarChar);
|
|
insertCommand.Parameters.Add("@IsActive", SqlDbType.TinyInt);
|
|
insertCommand.Parameters.Add("@ReadingMethod", SqlDbType.VarChar);
|
|
foreach (DataRow row in dataTable.Rows)
|
|
{
|
|
// Update parameter values for each row
|
|
insertCommand.Parameters["@MeterID"].Value = row["id"];
|
|
insertCommand.Parameters["@UtilityType"].Value = row["utility_type"];
|
|
insertCommand.Parameters["@UOMID"].Value = row["uom_id"];
|
|
insertCommand.Parameters["@AllocationType"].Value = row["allocation_type"];
|
|
insertCommand.Parameters["@SiteID"].Value = row["site_id"];
|
|
insertCommand.Parameters["@UnitID"].Value = row["unit_id"];
|
|
insertCommand.Parameters["@MeterNumber"].Value = row["meter_number"];
|
|
insertCommand.Parameters["@Location"].Value = row["location"];
|
|
insertCommand.Parameters["@AddedBy"].Value = row["added_by"];
|
|
insertCommand.Parameters["@DateTimeAdded"].Value = row["date_time_added"];
|
|
insertCommand.Parameters["@InstallCapacity"].Value = row["install_capacity"];
|
|
insertCommand.Parameters["@ScadaTag"].Value = row["scada_tag"];
|
|
insertCommand.Parameters["@Description"].Value = row["description"];
|
|
insertCommand.Parameters["@IsActive"].Value = row["is_active"];
|
|
insertCommand.Parameters["@ReadingMethod"].Value = row["reading_method"];
|
|
insertCommand.ExecuteNonQuery();
|
|
}
|
|
}
|
|
|
|
transaction.Commit();
|
|
|
|
}
|
|
|
|
ConnectionClass.CloseConnection();
|
|
}
|
|
}
|
|
}
|