2013-02-28 3 views
13

通常のSQL文をC#オブジェクトに変換するメソッドを作成しようとしています。そのため、Ironyを使用してSQL文を解析し、その文を[私はその後、何をするか分からないと不満を持っているのでここでタイプにIronyでSQL文を解析する

を依存する文と、その値は私の非完成したコードである

private List<Action> ParseStatement(string statement) 
{ 
    var parser = new Parser(new SqlGrammar()); 
    var parsed = parser.Parse(statement); 
    var status = parsed.Status; 

    while (parsed.Status == ParseTreeStatus.Parsing) 
    { 
     Task.Yield(); 
    } 

    if (status == ParseTreeStatus.Error) 
     throw new ArgumentException("The statement cannot be parsed."); 

    ParseTreeNode parsedStmt = parsed.Root.ChildNodes[0]; 

    switch (parsedStmt.Term.Name) 
    { 
     case "insertStmt": 
      var table = parsedStmt.ChildNodes.Find(x => x.Term.Name == "Id").ChildNodes[0].Token.ValueString; 
      var valuesCount = 
       parsedStmt.ChildNodes.Find(x => x.Term.Name == "insertData").ChildNodes.Find(
        x => x.Term.Name == "exprList").ChildNodes.Count; 
      var values = parsedStmt.ChildNodes.Find(x => x.Term.Name == "insertData").ChildNodes.Find(
        x => x.Term.Name == "exprList").ChildNodes; 
      foreach (var value in values) 
      { 
       string type = value.Token.Terminal.Name; 
      } 
      break; 
    } 

    return null; 
} 

private Type ParseType(string type) 
{ 
    switch (type) 
    { 
     case "number": 
      return typeof (int); 
     case "string": 
      return typeof (string); 
    } 

    return null; 
} 

ので、ここで質問です:どのように文字列のSQL文をac#オブジェクトに変換するためにIronyを使用できますか?ここで

は私が達成したいものの一例である:

INSERT INTO者VALUES(4 'ニルセン'、 'ヨハン'、 'バッケン2'、 'スタヴァンゲル')

そしてそれは、動的にメソッドが声明から読んだものに応じて

return new Action<string type, string table, int val1, string val2, string val3, string val4, string val5>; 

に変換します。

私は私のアイデアをよく説明してくれて、みんな助けてくれることを願っています。そして、不明な点がある場合は教えてください。私はそれを説明しようとします。

+5

私は適切なSQL文法を取得し、それをアイロニーが理解できる文法形式に変換する必要があると思います。簡単なものではありません。あなたは簡単に挫折した人々のためではない多くの仕事をしています。しかし、それはできます。 –

+0

私はすでにSQLGrammarを持っていますが、問題はすべてのStatementの解析、挿入、更新、作成...そのコンテンツの返却です[他の目的ではC#で使用されます] –

+0

IronyがSQL文を解析する方法、またはそれ以上を解析結果に基づいて変換するか?あなたがアイロニーから戻ってきたASTに満足していますか?使用している関連するSQL文法の一部を表示できますか? –

答えて

1

楽しい演習としてこれをやっていないのであれば、Linq to SQLを使ってスタブクラスやEntity Frameworkをコメントに記載されたDrunken Code Monkeyとして生成することをお勧めします。

は、ここであなたが始めるために良い記事です:​​

1

私もアイロニーとSQLを解析しようとしていました。私はアイロニーについて学ぶ素晴らしい時間を過ごしている間のCTE、注文列番号によって、

SET TRANSACTION ISOLATION LEVEL READ UNCOMMITTED 

のような半分の特別な文を、私は持っていない:私はアイロニーのサンプルSQLパーサは処理しないのであきらめました上記のすべての部分を正しく実装するためのコードチョップ。

マイクロソフトが提供するSQL解析ライブラリを使い終わった。以下のLINQPad 5のサンプルコード:

// Add a reference to 
// C:\Program Files (x86)\Microsoft SQL Server\130\SDK\Assemblies\ 
// Microsoft.SqlServer.TransactSql.ScriptDom.dll 
// 
// https://blogs.msdn.microsoft.com/gertd/2008/08/21/getting-to-the-crown-jewels/ 

public void Main() 
{ 
    var sqlFilePath = @"C:\Users\Colin\Documents\Vonigo\database-scripts\Client\Estimate\spClient_EstimateAddNew.sql"; 
    bool fQuotedIdenfifiers = false; 
    var parser = new TSql100Parser(fQuotedIdenfifiers); 

    string inputScript = File.ReadAllText(sqlFilePath); 
    IList<ParseError> errors; 
    using (StringReader sr = new StringReader(inputScript)) 
    { 
     var fragment = parser.Parse(sr, out errors); 
     fragment.Dump(); 
    } 
}