Мне нужно написать ужасный интерфейс для импорта данных в новую базу данных из сотен файлов данных из нашего старого приложения, в котором все жестко закодировано (отображаемые данные напоминают электронные таблицы Excel, и это позволяет нам экспортировать данные в Значения, разделенные запятыми).
Я могу все это прочитать, с именами заголовков.
Исходя из этого, я могу создать имя для столбца, который будет использоваться в базе данных Sql CE.
В настоящее время данные состоят из float
, int
, DateTime
, bit
, char
и string
.
Я придумал способ сделать это (непроверенный на всех наших данных), но любая помощь от кого-то, кто знает, как кодировать это лучше, будет очень признателен.
Код ниже не обязательно читать, если кто-то просто не понимает, о чем я спрашиваю.
public enum MyParameterType { NA, Float, Bool, Char, Date, Int, String }
class MyParameter {
public MyParameter(string name, string value) {
if (String.IsNullOrEmpty(name) || String.IsNullOrEmpty(value)) {
throw new NotSupportedException("NULL values are not allowed.");
}
Name = name.Trim();
Value = value.Trim();
Type = MyParameterType.NA;
if (-1 < Value.IndexOf('.')) { // try float
float f;
if (float.TryParse(Value, out f)) {
string s = f.ToString();
if (s == Value) {
Parameter = new SqlCeParameter(AtName, SqlDbType.Float) { Value = f };
Type = MyParameterType.Float;
}
}
}
if (Type == MyParameterType.NA) {
bool b;
if (bool.TryParse(Value, out b)) {
Parameter = new SqlCeParameter(AtName, SqlDbType.Bit) { Value = b };
Type = MyParameterType.Bool;
}
}
if (Type == MyParameterType.NA) {
if (Value.Length == 1) {
char c = Value[0];
Parameter = new SqlCeParameter(AtName, SqlDbType.Char) { Value = c };
Type = MyParameterType.Char;
}
}
if (Type == MyParameterType.NA) {
DateTime date;
if (DateTime.TryParse(Value, out date)) {
Parameter = new SqlCeParameter(AtName, SqlDbType.DateTime) { Value = date };
Type = MyParameterType.Date;
}
}
if (Type == MyParameterType.NA) {
if (50 < Value.Length) {
Value = Value.Substring(0, 49);
}
Parameter = new SqlCeParameter(AtName, SqlDbType.NVarChar, 50) { Value = this.Value };
Type = MyParameterType.String;
}
}
public string AtName { get { return "@" + Name; } }
public string Name { get; set; }
public MyParameterType Type { get; set; }
public SqlCeParameter Parameter { get; set; }
public string Value { get; set; }
}
Больше всего меня беспокоит то, что я не хочу ошибочно интерпретировать один из входных данных (например, логическое значение как символ).
Я также ищу способ сравнения новых экземпляров MyParameter
(т. Е. Если он меньше одного типа, попробуйте другой тип).
Бонусные баллы за просмотр новых классных выражений, генерирующих это!