Это программный способ получить ключевые слова SQL (зарезервированные слова)

мне нужно проверить имя столбца SQL, который создается программно...

должно быть 2 правила проверки:

  1. на имя не должно быть в C# ключевое слово
  2. на имя не должно быть ключевым словом SQL (SQL Server 2008 R2)

решение для 1-го правила приятно:

на CSharpCodeProvider класс IsValidIdentifier метод, который упрощает реализацию проверки.

(ex:

string myColumnName = "blabla";
var isValid = _cSharpCodeProvider.IsValidIdentifier(myColumnName);

)


решение для 2-го правила это немного многословно:

единственный способ, которым я нашел поиск google, - это взять ключевые слова из MSDN-зарезервированные ключевые слова (Transact-SQL) SQL Server 2008 R2

для создания свойства string [], которое вернет все эти ключевое слово...

(ex:

public static class SqlReservedKeywords {

     public static string[] SqlServerReservedKeywords {
        get { return SqlServerKeywords; }
     }

     private static readonly string[] SqlServerKeywords = new[] { 
        "ADD","EXISTS","PRECISION",   

    //. . .

        "EXEC","PIVOT","WITH",
        "EXECUTE","PLAN","WRITETEXT"
     };
}

//внешний код

var isValid = SqlReservedKeywords.SqlServerReservedKeywords.Contains(myColumnName);

)


вы можете мне советы о implementantion 2-го правила проверки. Это хорошая практика? Возможно, существует другой способ реализации, который я не нашел в Google...

3 ответов


поскольку есть функция, которую вы можете вызвать для C#, реальный вопрос заключается в том, как выполнить поиск зарезервированных слов SQL. То, как вы реализовали поиск здесь, не самый эффективный C#. Вы должны использовать HashSet -- быстрый непроверенный пример кода:

public static class SqlReservedKeywords {

   public bool isReserved(string in)
   {
      return SqlServerKeywords.Contains(in.ToUpper());
   }

   private static HashSet<string> SqlServerKeywords = new HashSet<string>();

   static SqlReservedKeywords() 
   {
      SqlServerKeywords.Add("ADD");
      SqlServerKeywords.Add("EXISTS");
      SqlServerKeywords.Add("PRECISION");

   //. . .

      SqlServerKeywords.Add("EXEC");
      SqlServerKeywords.Add("PIVOT");
      SqlServerKeywords.Add("WITH");
      SqlServerKeywords.Add("EXECUTE");
      SqlServerKeywords.Add("PLAN");
      SqlServerKeywords.Add("WRITETEXT");
   }   
}

вот хорошая статья (@theburningmonk), показывающая, как быстро HashSet при использовании Contains

(для тех, кто не хочет нажимать, HashSet ноль)

http://theburningmonk.com/2011/03/hashset-vs-list-vs-dictionary/


зарезервированные слова являются движущейся целью. Если СУБД не предоставляет их через открытый интерфейс, обычно нет хорошего программного способа добраться до них.

Если вы не хотите защищать их скобками, вы рискуете включить символы, которые не зарезервированы в используемой в настоящее время версии SQL Server, но are зарезервировано в какой-то будущей версии.

Я думаю, что лучше всего использовать механизм цитирования вашей СУБД, поскольку он разработан разобраться именно с этой проблемой. Для SQL Server это означает квадратные скобки.


Как правило, подход выглядит правильным. Получение ключевых слов для любого данного языка включает (надеюсь, небольшой) бит проб и ошибок из-за чего-либо недокументированного, но основным источником всегда является сама спецификация языка. Я не знаю ни одного языка со своими валидаторами, но это не значит, что их не существует.

сама Visual Studio имеет набор xml-файлов, которые помогают ей выполнять проверку для любого данного языка. Если вы разрабатываете IDE, вы можете у вас есть стол, который выглядел примерно так;

Keyword     | MatchWithRegEx | Color
------------+----------------+---------
for         | \wfor          | #FF0000

...вы поняли идею. В вашем случае вы просто хотите отфильтровать возможные ключевые слова проблемы, чтобы они не создавали исключения. Разрешение исключения быть брошенным и ловить и обрабатывать его специально is действительная методология, хотя и не очень чистая.

Что касается вашего случая, единственная реальная настройка, которую я бы сделал, - это не список ключевых слов, похороненных в программе во время компиляции, а вместо этого хранить список во внешнем файле, который загружается в начальной точке приложения. Это обеспечивает некоторую гибкость, если вы что-то забыли или вам нужно поддерживать более поздние версии языка, не требуя перестроения приложения.