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(...)
becomeprotected
instead ofinternal
- Remove
ScriptWriter
parameter inCreateSqlScriptGeneratorVisitor(...)
. This can avoid to markScriptWriter
aspublic
. Instantiation ofScriptWriter
will be handled by child class ofSqlScriptGenerator
. See example below. - Mark
SqlScriptGeneratorVisitor
as public accessible.SqlScriptGeneratorVisitor
will 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