2010-01-29 40 views
0

我正在对生成的LINQ to SQL类(即DataContext)进行一些反思。对于每个类(表)上的每个属性(列),我都会得到ColumnAttribute.DbType值。解析字符串的SQL DataType

它可以是各种不同的值,这里有一些例子:

  • 诠释NOT NULL
  • 诠释
  • VARCHAR(255)
  • VARCHAR(255)NOT NULL

...等等。

如果我想将这些字符串解析为单独的有意义的值,比如“DataType”,“Nullable”和“MaxLength”,最好的方法是什么?

我不需要一个完整的词法分析器/解析器thingy或语言解释器,我不认为有必要去追求像M之类的东西。除了涉及Substring的一些(可怕的)特定手动分析之外,您会推荐什么?

答案在C#中,请 - 这几乎是所有我好了,这些天:)

回答

1

,你可以使用正则表达式匹配的模式:

string input = @" 
    Int NOT NULL 
    Int 
    VarChar(255) 
    VarChar(255) NOT NULL 
    Bit"; 
foreach (Match m in Regex.Matches(input, 
    @"^\s*(?<datatype>\w+)(?:\((?<length>\d+)\))?(?<nullable> (?:NOT)?NULL)?", 
    RegexOptions.ECMAScript | RegexOptions.Multiline)) 
{ 
    Console.WriteLine(m.Groups[0].Value.Trim()); 
    Console.WriteLine("\tdatatype: {0}", m.Groups["datatype"].Value); 
    Console.WriteLine("\tlength : {0}", m.Groups["length" ].Value); 
    Console.WriteLine("\tnullable: {0}", m.Groups["nullable"].Value); 
} 
1

这会做,使用正则表达式如下所示:

 
public Regex MyRegex = new Regex(@ 
     "(?<datatype>([tiny|big]?int|long)?|(?<varchar>varchar)?)\s?"+ 
     "(\((?<len>\d{1,})\))?\s?(?<nullable>(?<not>not)?\s+(?<null>null))?", 
    RegexOptions.IgnoreCase 
    | RegexOptions.CultureInvariant 
    | RegexOptions.IgnorePatternWhitespace 
    | RegexOptions.Compiled 
    ); 

Match m = MyRegex.Match(InputText); 

// Example invocation... 
if (m.Success){ 
    string DataType = m.Groups["datatype"].Value; 
    int DataLen = m.Groups["len"].Value; 
    string Nullable = m.Groups["nullable"].Value; 
} 

对于上面的示例,它匹配:

 
int null 
varchar(255) not null 

此外,正则表达式仅匹配tinyint,bigint,int,long和varchar作为示例以帮助您入门。

希望这会有所帮助, 最好的问候, 汤姆。