2010-01-29 9 views
0

Je réfléchis aux classes LINQ to SQL générées (c'est-à-dire DataContext). Pour chaque propriété (colonne) sur une classe (table) j'obtiens la valeur ColumnAttribute.DbType.Analyse de chaîne pour SQL DataType

Il peut être différentes valeurs, voici quelques exemples:

  • Int NOT NULL
  • Int
  • VarChar (255)
  • VarChar (255) NOT NULL
  • Bit

... et ainsi de suite.

Si je voulais analyser ces chaînes en valeurs significatives séparées, telles que "DataType", "Nullable" et "MaxLength", quelle serait la meilleure approche?

Je n'ai pas besoin d'un interpréteur de langage ou d'un interprète de langage lexer/parser, je ne pense pas qu'il soit nécessaire de chercher quelque chose comme M. Autre que certains (horrible) analyse manuelle spécifique impliquant Substring, que recommanderiez-vous?

Réponses dans C#, s'il vous plaît - c'est à peu près tout ce que je suis bon pour ces jours :)

Répondre

1

Vous pourriez utiliser une expression régulière pour correspondre à ces modèles:

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

Est-ce que ce faire, en utilisant regexp comme indiqué ci-dessous:

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

Pour l'exemple ci-dessus, il correspond:

 
int null 
varchar(255) not null 

Egalement, l'expression rationnelle correspond à tinyint, bigint, int, long et varchar comme exemple pour vous aider à démarrer.

Espérons que cela aide, Cordialement, Tom.