в этом файле панель сохраняет новые записи в конце файла, пока максимальное количество записей не достигнет 10 000. Когда сохраняется последняя запись, следующая сохраняется в первой строке файла csv. Итак, это цикл.
Я хотел бы сохранить эти записи в базе данных SQL Server.
Для этого у меня есть процесс, который читает каждые 5 или 10 минут, поэтому, прежде чем пытаться сохранить файлы в базе данных, мне нужно знать, какие записи являются новыми, чтобы попытаться сохранить только новые записи.
Однако файл . csv не имеет какого-либо уникального поля, я мог бы иметь две записи с одинаковой датой и временем в миллисекундах и одинаковой информацией в полях, поэтому в этом случае я бы считал обе записи одинаковыми.
Проблема в том, что в базе данных я не могу задать первичный ключ, состоящий из 20 полей, поэтому мне нужно создать ключ для записи.
Я думал о создании класса с одним свойством для каждого поля и еще одним свойством для идентификатора, который будет установлен как хэш класса.
Код: Выделить всё
internal class Alarma
{
public long Id { get; init; }
public long TimeMs { get; init; }
public int MsgProc { get; init; }
public int StateAfter { get; init; }
public int MsgClass { get; init; }
public int MsgNumber { get; init; }
public string? Var1 { get; init; }
public string? Var2 { get; init; }
public string? Var3 { get; init; }
public string? Var4 { get; init; }
public string? Var5 { get; init; }
public string? Var6 { get; init; }
public string? Var7 { get; init; }
public string? Var8 { get; init; }
public string? TimeString { get; init; }
public string? MsgText { get; init; }
public string? Plc { get; init; }
private Alarma()
{
Id = this.GetHashCode();
}
public Alarma(long parmaTimeMs, int paramMsgProg, int paramStateAfeter, int paramMsgClass, int paramMsgNumber,
string? paramVar1, string? paramVar2, string? paramVar3, string? paramVar4, string? paramVar5, string? paramVar6, string? paramVar7, string? paramVar8,
string? paramTimeString, string? paramMsgText, string? paramPlc)
{
TimeMs = parmaTimeMs;
MsgProc = paramMsgProg;
StateAfter = paramStateAfeter;
MsgClass = paramMsgClass;
MsgNumber = paramMsgNumber;
Var1 = paramVar1;
Var2 = paramVar2;
Var3 = paramVar3;
Var4 = paramVar4;
Var5 = paramVar5;
Var6 = paramVar6;
Var7 = paramVar7;
Var8 = paramVar8;
TimeString = paramTimeString;
MsgText =paramMsgText;
Plc = paramPlc;
Id = this.GetHashCode();
}
public override bool Equals(object obj)
{
if (obj is Alarma other)
{
return TimeMs == other.TimeMs
&& MsgProc == other.MsgProc
&& StateAfter == other.StateAfter
&& MsgClass == other.MsgClass
&& MsgNumber == other.MsgNumber
&& Var1 == other.Var1
&& Var2 == other.Var2
&& Var3 == other.Var3
&& Var4 == other.Var4
&& Var5 == other.Var5
&& Var6 == other.Var6
&& Var7 == other.Var7
&& Var8 == other.Var8
&& TimeString == other.TimeString
&& MsgText == other.MsgText
&& Plc == other.Plc;
}
return false;
}
public long GetHashCode()
{
long hash = 17;
hash = hash * 31 + TimeMs.GetHashCode();
hash = hash * 31 + MsgProc.GetHashCode();
hash = hash * 31 + StateAfter.GetHashCode();
hash = hash * 31 + MsgClass.GetHashCode();
hash = hash * 31 + MsgNumber.GetHashCode();
hash = hash * 31 + (Var1?.GetHashCode() ?? 0);
hash = hash * 31 + (Var2?.GetHashCode() ?? 0);
hash = hash * 31 + (Var3?.GetHashCode() ?? 0);
hash = hash * 31 + (Var4?.GetHashCode() ?? 0);
hash = hash * 31 + (Var5?.GetHashCode() ?? 0);
hash = hash * 31 + (Var6?.GetHashCode() ?? 0);
hash = hash * 31 + (Var7?.GetHashCode() ?? 0);
hash = hash * 31 + (Var8?.GetHashCode() ?? 0);
hash = hash * 31 + (TimeString?.GetHashCode() ?? 0);
hash = hash * 31 + (MsgText?.GetHashCode() ?? 0);
hash = hash * 31 + (Plc?.GetHashCode() ?? 0);
return hash;
}
}
А будут ли другие варианты?
Спасибо.
Подробнее здесь: https://stackoverflow.com/questions/788 ... a-database