نمایش نتایج 1 تا 7 از 7

نام تاپیک: تفسیر و آنالیز سورس SQL با استفاده از Microsoft.SqlServer.TransactSql.ScriptDom

  1. #1
    کاربر دائمی آواتار mazoolagh
    تاریخ عضویت
    اردیبهشت 1384
    سن
    71
    پست
    3,054

    تفسیر و آنالیز سورس SQL با استفاده از Microsoft.SqlServer.TransactSql.ScriptDom

    اول افزودن رفرنس:

    nuget.png
    reference.png

    کار کردن با این api در نگاه اول قدری پیچیده بنظر میاد (همینجور هم هست)،
    دو نمونه زیر به شما کمک میکنه چجوری ازش استفاده کنین و البته که امکاناتش خیلی گسترده تر از اینهاست.

    Microsoft.SqlServer.TransactSql.ScriptDom Namespace | Microsoft Learn
    عکس های ضمیمه عکس های ضمیمه

  2. #2
    کاربر دائمی آواتار mazoolagh
    تاریخ عضویت
    اردیبهشت 1384
    سن
    71
    پست
    3,054

    ScriptTokenStream SqlServer.TransactSql.ScriptDom

    در نمونه اول میخواهیم همه اجزای سورس رو بیرون بکشیم.
    طبق مستندات باید چند آبجکت رو آماده کنیم:
    یک tsqlparser که سورس رو به صورت stream میگیره،
    یک tsqlscript که tsqlparser نتیجه parse رو برای آنالیزهای بعدی در اون برمیگردونه،
    و یک parseerror که لیست خطاها (احتمالی) رو نگه میداره.

    لیستی از همه اجزای سورس (حتی شامل whitespaceih هم میشه) در یکی از پراپرتی های tsqlscript به اسم ScriptTokenStream در دسترس هست.

    TSqlParserToken Class (Microsoft.SqlServer.TransactSql.ScriptDom) | Microsoft Learn

  3. #3
    کاربر دائمی آواتار mazoolagh
    تاریخ عضویت
    اردیبهشت 1384
    سن
    71
    پست
    3,054

    ScriptTokenStream SqlServer.TransactSql.ScriptDom

    1- آماده سازی:
    Imports Microsoft.SqlServer.TransactSql

    Dim dt_tokens As New DataTable
    Dim dt_errors As New DataTable

    Private Sub SQLscriptDom_ParseScript_Load(sender As Object, e As EventArgs) Handles MyBase.Load
    If dt_tokens.Columns.Count > 0 Then Exit Sub
    With dt_tokens
    .Columns.Add("Line", GetType(System.Int32))
    .Columns.Add("Column", GetType(System.Int32))
    .Columns.Add("Offset", GetType(System.Int32))
    .Columns.Add("Text", GetType(System.String))
    .Columns.Add("Type", GetType(System.String))
    .Columns.Add("IsKeyword", GetType(System.Boolean))
    End With
    DGV_ScriptTokens.DataSource = dt_tokens


    With dt_errors
    .Columns.Add("Error", GetType(System.Int32))
    .Columns.Add("Line", GetType(System.Int32))
    .Columns.Add("Offset", GetType(System.Int32))
    .Columns.Add("Message", GetType(System.String))
    End With
    DGV_Errors.DataSource = dt_errors
    End Sub




    2- خواندن سورس و بیرون کشیدن tokenها:
    Private Sub Btn_Parse_Click(sender As Object, e As EventArgs) Handles Btn_Parse.Click
    dt_script.Clear()
    dt_errors.Clear()
    Dim parse_errors As IList(Of ScriptDom.ParseError) = Nothing
    Dim parser As New ScriptDom.TSql150Parser(True)
    Dim script As New ScriptDom.TSqlScript
    Using reader As New System.IO.StringReader(SQL_Source.Text)
    script = parser.Parse(reader, parse_errors)
    End Using

    If parse_errors.Count > 0 Then
    Dim dr_error As DataRow
    For Each perr As ScriptDom.ParseError In parse_errors
    dr_error = dt_errors.NewRow
    dr_error("Error") = perr.Number
    dr_error("Line") = perr.Line
    dr_error("Offset") = perr.Offset
    dr_error("Message") = "sc=" & perr.Message
    dt_errors.Rows.Add(dr_error)
    Next
    End If


    If script Is Nothing Then Exit Sub


    Dim dr_script As DataRow
    For Each token As ScriptDom.TSqlParserToken In script.ScriptTokenStream
    If token.TokenType <> ScriptDom.TSqlTokenType.WhiteSpace Then
    dr_script = dt_script.NewRow
    dr_script("Line") = token.Line
    dr_script("Column") = token.Column
    dr_script("Offset") = token.Offset
    dr_script("Type") = token.TokenType.ToString
    dr_script("Text") = token.Text
    dr_script("IsKeyword") = token.IsKeyword
    dt_script.Rows.Add(dr_script)
    End If
    Next
    End Sub

  4. #4
    کاربر دائمی آواتار mazoolagh
    تاریخ عضویت
    اردیبهشت 1384
    سن
    71
    پست
    3,054

    ScriptTokenStream SqlServer.TransactSql.ScriptDom

    نمونه:
    parse_script.jpg

  5. #5
    کاربر دائمی آواتار mazoolagh
    تاریخ عضویت
    اردیبهشت 1384
    سن
    71
    پست
    3,054

    ParseStatementList SqlServer.TransactSql.ScriptDom

    در نمونه دوم یک لیست از دستورها و نوع اونها میسازیم:
    TSqlParser.ParseStatementList Method (Microsoft.SqlServer.TransactSql.ScriptDom) | Microsoft Learn

    1- آماده سازی
    Dim dt_statements As New DataTable
    Dim dt_errors As New DataTable


    Private Sub SQLscripDom_ParseStatements_Load(sender As Object, e As EventArgs) Handles MyBase.Load
    If dt_statements.Columns.Count > 0 Then Exit Sub
    With dt_statements
    .Columns.Add("Line", GetType(System.Int32))
    .Columns.Add("Type", GetType(System.String))
    .Columns.Add("Statement", GetType(System.String))
    End With
    DGV_Statements.DataSource = dt_statements


    With dt_errors
    .Columns.Add("Error", GetType(System.Int32))
    .Columns.Add("Line", GetType(System.Int32))
    .Columns.Add("Offset", GetType(System.Int32))
    .Columns.Add("Message", GetType(System.String))
    End With
    DGV_Errors.DataSource = dt_errors
    End Sub


    2- خواندن سورس و بیرون کشیدن statementها
    Private Sub Btn_Parse_Click(sender As Object, e As EventArgs) Handles Btn_Parse.Click
    dt_statements.Clear()
    dt_errors.Clear()
    Dim parse_errors As IList(Of ScriptDom.ParseError) = Nothing
    Dim parser As New ScriptDom.TSql150Parser(True)
    Dim statements_list As New ScriptDom.StatementList


    Using reader As New System.IO.StringReader(SQL_Source.Text)
    statements_list = parser.ParseStatementList(reader, parse_errors)
    End Using


    If parse_errors.Count > 0 Then
    Dim dr_error As DataRow
    For Each perr As ScriptDom.ParseError In parse_errors
    dr_error = dt_errors.NewRow
    dr_error("Error") = perr.Number
    dr_error("Line") = perr.Line
    dr_error("Offset") = perr.Offset
    dr_error("Message") = perr.Message
    dt_errors.Rows.Add(dr_error)
    Next
    End If


    If statements_list Is Nothing Then Exit Sub


    Dim dr_statements As DataRow
    For Each statement As ScriptDom.TSqlStatement In statements_list.Statements
    dr_statements = dt_statements.NewRow
    dr_statements("Line") = dt_statements.Rows.Count + 1
    dr_statements("Type") = statement.GetType.Name
    Dim sb As New System.Text.StringBuilder
    For i As Integer = statement.FirstTokenIndex To statement.LastTokenIndex
    sb.Append(statement.ScriptTokenStream(i).Text)
    Next
    dr_statements("Statement") = sb.ToString
    dt_statements.Rows.Add(dr_statements)
    Next
    End Sub

  6. #6
    کاربر دائمی آواتار mazoolagh
    تاریخ عضویت
    اردیبهشت 1384
    سن
    71
    پست
    3,054

    ParseStatementList SqlServer.TransactSql.ScriptDom

    نمونه:

    ضمیمه 154402

  7. #7
    کاربر دائمی آواتار mazoolagh
    تاریخ عضویت
    اردیبهشت 1384
    سن
    71
    پست
    3,054

    نمونه PARSE ERROR در Microsoft.SqlServer.TransactSql.ScriptDom

    نمونه خطا:
    ضمیمه 154403

تاپیک های مشابه

  1. روش کار با dll های Microsoft.SqlServer
    نوشته شده توسط fakhravari در بخش T-SQL
    پاسخ: 1
    آخرین پست: پنج شنبه 02 خرداد 1392, 20:16 عصر
  2. مشکل using Microsoft.SqlServer.Management.Smo;
    نوشته شده توسط Merila_Rad در بخش C#‎‎
    پاسخ: 4
    آخرین پست: شنبه 27 شهریور 1389, 00:23 صبح
  3. پاسخ: 0
    آخرین پست: سه شنبه 09 شهریور 1389, 18:50 عصر
  4. آموزش: limit mysql در sqlserver برای استفاده در گرید ویو و یا هر چیز دیگری
    نوشته شده توسط m110_110 در بخش ASP.NET Web Forms
    پاسخ: 1
    آخرین پست: دوشنبه 14 تیر 1389, 10:14 صبح

قوانین ایجاد تاپیک در تالار

  • شما نمی توانید تاپیک جدید ایجاد کنید
  • شما نمی توانید به تاپیک ها پاسخ دهید
  • شما نمی توانید ضمیمه ارسال کنید
  • شما نمی توانید پاسخ هایتان را ویرایش کنید
  •