using System.Data.OleDb; namespace AiQ_GUI { class Access { public const string connString = @"Provider=Microsoft.ACE.OLEDB.12.0;Data Source=G:\Shared drives\MAV Production GUI's\AiQ\GUI's\AiQ_Final_Test.accdb;Persist Security Info=False;OLE DB Services=-1;"; // Allows Different Cam Types with different schemas to be handled safely private static bool HasColumn(OleDbDataReader reader, string columnName) { for (int i = 0; i < reader.FieldCount; i++) if (reader.GetName(i).Equals(columnName, StringComparison.OrdinalIgnoreCase)) return true; return false; } public static string[] ReadCamTypes(string camType) { // No camera type selected if (string.IsNullOrWhiteSpace(camType)) return null; // Preallocate list to reduce resizing List> modelTuples = new(30); using OleDbConnection conn = new(connString); // Attempt to open the database try { conn.Open(); } catch { MessageBox.Show("Could not access Access in google drive. Is it running?"); return null; } // Mobile table does not have MarkNumber // AiQ and others might do ????? - TODO ask string query = camType == "Mobile" ? "SELECT ModelNumber, Description FROM [Mobile]" : $"SELECT ModelNumber, Description FROM [{camType}] WHERE MarkNumber > 1"; using OleDbCommand cmd = new(query, conn); using OleDbDataReader reader = cmd.ExecuteReader(); // Read all models from the selected table while (reader.Read()) { string modelNumber = reader["ModelNumber"] as string ?? string.Empty; string description = reader["Description"] as string ?? string.Empty; modelTuples.Add(Tuple.Create(modelNumber.Trim(), description.Trim())); } // Sort models, pushing AB12CD to the bottom var sorted = modelTuples .OrderBy(t => t.Item1.Equals("AB12CD", StringComparison.OrdinalIgnoreCase) ? 1 : 0) .ThenBy(t => t.Item1, StringComparer.OrdinalIgnoreCase); // Format for combo box display return sorted.Select(t => $"{t.Item1} - {t.Item2}").ToArray(); } public static void ReadUniData() { using OleDbConnection conn = new(connString); try { conn.Open(); } catch { MessageBox.Show("Could not access Access in google drive. Is it running?"); return; } const string query = "SELECT FlexiVersion, FlexiRevision, WonwooFirmware, AiQGUIVersion, PowerConsumption, LicencingServerURL FROM UniversalData"; using OleDbCommand cmd = new(query, conn); using OleDbDataReader reader = cmd.ExecuteReader(); // UniversalData is expected to contain a single row reader.Read(); UniversalData.ExpFlexiVer = Convert.ToString(reader["FlexiVersion"]); UniversalData.ExpFlexiRev = Convert.ToString(reader["FlexiRevision"]); UniversalData.WonwooFirmware = Convert.ToString(reader["WonwooFirmware"]); UniversalData.LatestVersion = Convert.ToString(reader["AiQGUIVersion"]); UniversalData.PowerConsumption = Convert.ToInt16(reader["PowerConsumption"]); UniversalData.LicencingServerURL = Convert.ToString(reader["LicencingServerURL"]); } // Populates CameraAccessInfo dynamically based on available columns public static void ReadModelRow(string camType, string ModelOnTest) { using OleDbConnection conn = new(connString); try { conn.Open(); } catch { MessageBox.Show("Could not access Access in google drive. Is it running?"); return; } // Parameterised query to prevent injection string query = $"SELECT * FROM [{camType}] WHERE ModelNumber = ?"; using OleDbCommand cmd = new(query, conn); cmd.Parameters.AddWithValue("?", ModelOnTest); using OleDbDataReader reader = cmd.ExecuteReader(); // No matching model found if (!reader.Read()) return; // Populate CameraAccessInfo only if columns exist CameraAccessInfo.Processor = HasColumn(reader, "Processor") ? Convert.ToString(reader["Processor"]) : string.Empty; CameraAccessInfo.VaxtorLic = HasColumn(reader, "Vaxtor") && Convert.ToString(reader["Vaxtor"]) == "Yes"; CameraAccessInfo.HardwareExtras = HasColumn(reader, "HardwareExtras") ? Convert.ToString(reader["HardwareExtras"]) : string.Empty; CameraAccessInfo.PowerType = HasColumn(reader, "PowerType") ? Convert.ToString(reader["PowerType"]) : string.Empty; CameraAccessInfo.LED_V = HasColumn(reader, "LEDVoltage") ? Convert.ToDouble(reader["LEDVoltage"]) : 0; CameraAccessInfo.LED_I = HasColumn(reader, "LEDCurrent") ? Convert.ToInt32(reader["LEDCurrent"]) : 0; CameraAccessInfo.SpreadsheetID = HasColumn(reader, "SSID") ? Convert.ToString(reader["SSID"]) : string.Empty; } public static void Stats(string TypeOfTest, string modelNumber) { Stats([TypeOfTest], modelNumber); } public static void Stats(string[] TypeOfTest, string modelNumber) { using OleDbConnection conn = new(connString); try { conn.Open(); foreach (string type in TypeOfTest) { string query = $"UPDATE AiQ SET [{type}] = [{type}] + 1 WHERE [ModelNumber] = ?"; using OleDbCommand cmd = new(query, conn); cmd.Parameters.AddWithValue("?", modelNumber); int rowsAffected = cmd.ExecuteNonQuery(); if (rowsAffected == 0) MainForm.Instance.AddToActionsList($"No rows affected for {modelNumber}", Level.ERROR); } } catch { MainForm.Instance.AddToActionsList( "Could not access Access in Google Drive. Is it running?", Level.WARNING); } } public static void StatsDiags(string redDiagLabels, string RhTxBxActionsText, string ModelNumber) { using OleDbConnection conn = new(connString); conn.Open(); // Replace null or empty values string redVal = string.IsNullOrWhiteSpace(redDiagLabels) ? "-" : redDiagLabels; string actVal = string.IsNullOrWhiteSpace(RhTxBxActionsText) ? "-" : RhTxBxActionsText; string model = string.IsNullOrWhiteSpace(ModelNumber) ? "-" : ModelNumber; const string sql = @"INSERT INTO DiagsStats ([Date], [Model], [Red Diags Labels], [RhTxBxActions Contents]) VALUES (?, ?, ?, ?)"; using OleDbCommand cmd = new(sql, conn); cmd.Parameters.Add(new OleDbParameter { OleDbType = OleDbType.Date, Value = DateTime.Now }); cmd.Parameters.AddWithValue("?", model); cmd.Parameters.AddWithValue("?", redVal); cmd.Parameters.AddWithValue("?", actVal); int rows = cmd.ExecuteNonQuery(); if (rows == 0) MainForm.Instance.AddToActionsList( "No rows inserted into DiagsStats (unexpected).", Level.ERROR); } } public class UniversalData { public static string ExpFlexiVer { get; set; } = string.Empty; public static string ExpFlexiRev { get; set; } = string.Empty; public static string WonwooFirmware { get; set; } = string.Empty; public static string LatestVersion { get; set; } = string.Empty; public static int PowerConsumption { get; set; } = 0; public static string LicencingServerURL { get; set; } = string.Empty; } public class CameraAccessInfo { public static string Processor { get; set; } = string.Empty; public static bool VaxtorLic { get; set; } = false; public static string HardwareExtras { get; set; } = string.Empty; public static string PowerType { get; set; } = string.Empty; public static double LED_V { get; set; } = 0; public static int LED_I { get; set; } = 0; public static string SpreadsheetID { get; set; } = string.Empty; } }