SqlScriptDOM
SqlScriptDOM copied to clipboard
Unable to inherit 'SqlScriptGenerator' class
Is your feature request related to a problem? Please describe.
Consider the following code to inherit SqlScriptGenerator
internal class CustomSqlScriptGenerator : SqlScriptGenerator
{
public CustomSqlScriptGenerator(SqlScriptGeneratorOptions options) : base(options)
{
}
internal override SqlScriptGeneratorVisitor CreateSqlScriptGeneratorVisitor(SqlScriptGeneratorOptions options, ScriptWriter scriptWriter)
{
throw new NotImplementedException();
}
}
However, this will get compilation error because SqlScriptGeneratorVisitor and ScriptWriter are marked as internal, which is impossible to inherit this class.
Describe the solution you'd like
- Change
CreateSqlScriptGeneratorVisitor(...)becomeprotectedinstead ofinternal - Remove
ScriptWriterparameter inCreateSqlScriptGeneratorVisitor(...). This can avoid to markScriptWriteraspublic. Instantiation ofScriptWriterwill be handled by child class ofSqlScriptGenerator. See example below. - Mark
SqlScriptGeneratorVisitoras public accessible.SqlScriptGeneratorVisitorwill be used to visit the expression tree when generating TSQL script.
Here is the suggested changes:
protected abstract SqlScriptGeneratorVisitor CreateSqlScriptGeneratorVisitor(SqlScriptGeneratorOptions options);
And update Sql###ScriptGenerator become
Example:
public sealed class Sql100ScriptGenerator : SqlScriptGenerator
{
public Sql100ScriptGenerator()
: this(new SqlScriptGeneratorOptions())
{
}
public Sql100ScriptGenerator(SqlScriptGeneratorOptions options)
: base(options)
{
}
protected override SqlScriptGeneratorVisitor CreateSqlScriptGeneratorVisitor(SqlScriptGeneratorOptions options)
{
// Create instance of ScriptWriter.
//Currently this is created by private function in SqlScriptGenerator
ScriptWriter scriptWriter = new ScriptWriter(options);
ScriptGeneratorSupporter.CheckForNullReference((object) options, nameof (options));
ScriptGeneratorSupporter.CheckForNullReference((object) scriptWriter, nameof (scriptWriter));
return (SqlScriptGeneratorVisitor) new Sql100ScriptGeneratorVisitor(options, scriptWriter);
}
}
I believe this is the line of code in question: https://github.com/microsoft/SqlScriptDOM/blob/4b7e0af48237191f14612855acda32c97470fe02/SqlScriptDom/ScriptDom/SqlServer/SqlScriptGenerator.cs#L116