Another user for my post on getting the schema from a Stored Procedure. This time I am generating a Dbml fragment.
In the Column element, I am not providing a DbType. I don’t use Linq to Sql in such a way that it actually uses that value for anything important. I am also assuming that CanBeNull is true.
Yes, this is totally a message for work post. If you need detail as to what I’m doing, check this out.
<#@ assembly name="TsqlDesriptionUtil.dll" #> <#@ import namespace="Microsoft.VisualStudio.TextTemplating" #> <#@ import namespace="TsqlDesriptionUtil" #> <#@ import namespace="System.Collections.Generic" #> <#+ public class DbmlFunctionFromTSqlCmd : TextTransformation { public string FunctionName; public string FunctionMethod; public List<TableDescription> tables; public override string TransformText() { #> <Function Name="<#= FunctionName #>" Method="<#= FunctionMethod #>"> <#+ foreach(TableDescription table in tables) { #> <ElementType Name="<#= FunctionMethod #>Result_<#= table.TableName #>"> <#+ foreach(FieldDescription field in table.Fields) { #> <Column Name="<#= field.FieldName #>" Type="<#= field.FieldType.FullName #>" CanBeNull="true" /> <#+ } #> </ElementType> <#+ } #> </Function> <#+ return this.GenerationEnvironment.ToString(); } } #>
Again, for Demonstration purposes I wrote a simple T4 Template that includes the template above and uses the library I wrote in this post to get a description of the data.
<#@ template language="C#v3.5" debug="true" #><#@ output extension="txt" #><#@ include file="DbmlFunctionFromTSqlCmd.tt" #><#@ assembly name="TsqlDesriptionUtil.dll" #><#@ import namespace="TsqlDesriptionUtil" #><# // Since I'm generating XML, I will go to extreme measures to avoid new // line characters like the strange formatting of declarations above ^ // Get the table descriptions for given T-SQL string conString = @"Data Source=localhost;" + @"Initial Catalog=Northwind;Integrated Security=True"; string commandString = "EXEC CustOrderHist @CustomerID='ALFKI'"; List<TableDescription> tables = TsqlCommandSchema.GetFieldDescription(conString, commandString); // Generate DBML Fragment: var gen = new DbmlFunctionFromTSqlCmd(); gen.FunctionName = "dbo.GetBigTableDataUseTempTab"; gen.FunctionMethod = "MyNew"; gen.tables = tables; Write(gen.TransformText()); #>
(If I were more of a studman programmer dude, I'd write a Visual Studio Add-in that would insert this fragment directly into my .dbml file.)
No comments:
Post a Comment