这是一种获取SQL关键字(保留字)的编程方式吗
本文关键字:保留字 关键字 编程 方式吗 SQL 一种 获取 | 更新日期: 2023-09-27 18:00:02
我需要验证以编程方式创建的SQL列的Name。。。
可能有两个验证规则:
- 名称不应该是C#关键字
- 名称不应是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);
)
你能就第二条验证规则的实施给我一些建议吗。这是一个好的做法吗?也许它存在另一种我在谷歌上找不到的实现方式。。。
保留字是一个移动的目标。如果dbms不通过公共接口公开它们,通常就没有一个好的编程方法来访问它们。
如果您不想用括号保护它们,则可能会合并当前使用的SQL Server版本中未保留的符号,但在将来的某个版本中是保留的符号。
我认为您最好的选择是使用dbms提供的引用机制,因为它正是为了处理这个问题而设计的。对于SQL Server,这意味着方括号。
因为有一个函数可以为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/
一般来说,这种方法看起来是正确的。由于任何未记录的内容,为任何给定语言获取关键字都需要(希望是一小部分)尝试和错误,但主要来源始终是语言规范本身。我不知道有哪种语言自带验证器,但这并不是说它们不存在。
VisualStudio本身有一组xml文件,可以帮助它对任何给定的语言进行验证。如果你正在开发一个IDE,你可能会有一个看起来像的表;
Keyword | MatchWithRegEx | Color
------------+----------------+---------
for | 'wfor | #FF0000
你明白了。在您的情况下,您只想过滤掉可能的问题关键字,这样它们就不会抛出异常。允许抛出异常并专门捕获和处理是一种有效的方法,尽管不是很干净。
至于您的情况,我唯一真正的调整是在编译时不将关键字列表隐藏在程序中,而是将列表存储在外部文件中,该文件在应用程序的起点加载。如果您忘记了任何事情,或者需要在不需要重新构建应用程序的情况下支持某一语言的更高版本,这将提供一定的灵活性。