Utility-data-pooling/DALscada.cs

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();
}
}
}