Как создать класс, содержащий свойства различных типов в C # - PullRequest
0 голосов
/ 11 октября 2010

Я пытаюсь создать класс для представления значения столбца в SQL. Вот конечная цель, которую я хочу достичь:

public string GenerateInsertSql()
{
  StringBuilder insertSql = new StringBuilder();
  insertSql.Append("INSERT INTO " + SchemaName + "." + TableName + "\n");
  insertSql.Append("(\n");
  int counter = 0;
  foreach (ColumnValue columnValue in _insertValues)
  {
    if (counter > 0) insertSql.Append(",");
    counter++;
    insertSql.Append(columnValue.ColumnName).Append("\n");
  }
  insertSql.Append(")\n");
  insertSql.Append("VALUES\n");
  insertSql.Append("(\n");
  counter = 0;
  foreach (ColumnValue columnValue in _insertValues)
  {
    if (counter > 0) insertSql.Append(",");
    counter++;
    insertSql.Append(columnValue.SqlValue).Append("\n");
  }
  insertSql.Append(")\n");
}

Итак, класс - это класс ColumnValue, упомянутый выше. Класс ColumnValue нуждается в свойстве Value, которое предположительно может быть любого базового типа .NET (int, string и т. Д.). Класс также имеет свойство SqlValue, которое предоставляет строковое представление свойства Value, которое я могу использовать в сгенерированном операторе SQL. Так что если Value является целым числом, то SqlValue просто дает Value.ToString(), тогда как если Value является строкой, SqlValue необходимо проверить, является ли строка нулевой, чтобы либо возвратить NULL, либо 1014 * собственно свойство.

Изначально я пытался использовать Value в качестве объекта и SqlValue для проверки типа Value в операторе switch:

public string SqlValue
{
  get
  {
    switch (Value.GetType())
    {
      ...
    }
  }
}

Но тогда я получаю «Ожидаемое значение целого типа». Поэтому я не могу проверить тип объекта.

Затем я попробовал дженерики. Я изменил класс ColumnValue на ColumnValue<T> со свойством Value следующим образом:

public T Value { get; set; }

А затем, в свойстве SqlValue, еще одна проверка типа T, но я тоже не могу этого делать.

Есть ли способ достичь этого в C # без простого создания отдельных классов для обработки каждого возможного типа столбца?

Ответы [ 3 ]

0 голосов
/ 11 октября 2010

Если вы используете параметры, вы можете сделать так, чтобы ваше SqlValue просто возвращало объект.

В вашем примере нужно будет добавлять кавычки вокруг строк и решать вопросы культуры (форматирование типа double, даты).

0 голосов
/ 11 октября 2010

Вы также можете использовать Type.GetTypeCode (Value.GetType ()), который превратит его в перечисляемый TypeCode, который имеет все примитивы, извлекаемые из базы данных, особенно перечисляемые.За исключением Guid, который появится как объект, но вы можете справиться с этим в блоке объектов.

0 голосов
/ 11 октября 2010
Ключевое слово

switch может принимать только целые числа (правильно говоря, целочисленный тип (см. здесь )).Но вы всегда можете использовать операторы «если».Например,

var t = value.GetType();
if (t == typeof(string))
{
   ..
}
else if (t == typeof(int))
{
}
else if ...

Вы также можете использовать ключевое слово "is".Например, оператор

if (value is string) 
{
  ...
}
else if (value is int)
{
  ...
}
else if ...

"is" также будет проверять иерархию наследования, но я не думаю, что это будет иметь место в вашем использовании.

Наконец, я надеюсь, что независимо от SqlValueРеализация, которую вы собираетесь сделать, будет обрабатывать экранирование (например, кавычки в строковых значениях) и защищать от атак внедрения SQL.Вы можете рассмотреть возможность создания параметризованного встроенного запроса (т. Е. Добавить параметр для каждого столбца в запросе, а затем передать фактические значения в качестве значений параметров - так что вам вообще не понадобится свойство SqlValue).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...