7

我需要验证以编程方式创建的 SQL 列的名称...

应该有2个验证规则:

  1. 名称不应是 C#关键字
  2. 名称不应是 SQL 关键字( SQL Server 2008 R2)

第一条规则的解决方案很好:

CSharpCodeProvider类具有IsValidIdentifier方法,这使得验证的实现变得容易

(前任:

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

)


第二条规则的解决方案有点冗长:

我发现进行谷歌搜索的唯一方法是从MSDN 中获取关键字 - 保留关键字 (Transact-SQL) SQL Server 2008 R2

构建一个将返回所有这些关键字的字符串 [] 属性...

(前任:

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);

)


你能告诉我关于第二个验证规则的实施吗?这是一个好习惯吗?也许它存在另一种实现方式,我没有通过谷歌搜索找到......

4

3 回答 3

4

保留字是一个移动的目标。如果 dbms 不通过公共接口公开它们,那么通常没有一种好的编程方式来获取它们。

如果您不想用括号保护它们,则可能会合并在当前使用的 SQL Server 版本中未保留但在将来的某个版本中保留的符号。

我认为您最好的选择是使用您的 dbms 提供的引用机制,因为它旨在处理这个问题。对于 SQL Server,这意味着方括号。

于 2013-02-18T15:44:31.543 回答
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),展示了使用 Contains 时 HashSet 的速度

(不想点击的,HashSet为零)

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

于 2013-02-18T16:00:59.100 回答
1

通常,该方法看起来是正确的。由于任何未记录的内容,获取任何给定语言的关键字都涉及(希望很小)一些试验和错误,但主要来源始终是语言规范本身。我不知道任何语言都有自己的验证器,但这并不是说它们不存在。

Visual Studio 本身有一组 xml 文件,可帮助它对任何给定语言进行验证。如果你正在开发一个 IDE,你可能有一个看起来像这样的表;

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

...你明白了。在您的情况下,您只想过滤掉可能的问题关键字,以便它们不会引发异常。允许抛出异常并专门捕获和处理它一种有效的方法,尽管不是一种非常干净的方法。

至于您的情况,我要做的唯一真正的调整是不在编译时将关键字列表埋入程序中,而是将列表存储在一个外部文件中,该文件在您的应用程序的起点加载。如果您忘记任何事情或需要支持更高版本的语言而不需要重新构建应用程序,这将提供一定的灵活性。

于 2013-02-18T15:37:46.323 回答