Skip to content

Commit 1d5667d

Browse files
author
Gert Marginet
committed
Initial commit for Generate poco class
1 parent 216e015 commit 1d5667d

File tree

11 files changed

+276
-6
lines changed

11 files changed

+276
-6
lines changed

src/SqlQueryTools/Commands/AddSqlFileCommand.cs

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -10,11 +10,15 @@ namespace SqlQueryTools
1010
[Command(PackageIds.AddSqlFileCommand)]
1111
internal sealed class AddSqlFileCommand : BaseCommand<AddSqlFileCommand>
1212
{
13+
internal const string GenerateParameterNamesAttributeName = "GenerateParameterNames";
14+
internal const string GeneratePocoClassAttributeName = "GeneratePocoClass";
15+
1316
public OutputWindowPane OutputPane => ((SqlQueryToolsPackage)Package).OutputPane;
1417

1518
protected override Task InitializeCompletedAsync()
1619
{
1720
Command.Supported = false;
21+
1822
return base.InitializeCompletedAsync();
1923
}
2024

@@ -73,6 +77,15 @@ protected override async Task ExecuteAsync(OleMenuCmdEventArgs e)
7377

7478
await project.AddNestedFileAsync(newFileFullName, selectedPhisicalFile);
7579

80+
var newPhisicalFile = project.GetPhysicalFile(newFileFullName);
81+
if (newPhisicalFile != null)
82+
{
83+
await newPhisicalFile.TrySetAttributeAsync(GenerateParameterNamesAttributeName, options.GenerateParameterNames);
84+
await newPhisicalFile.TrySetAttributeAsync(GeneratePocoClassAttributeName, options.GeneratePocoClass);
85+
await newPhisicalFile.TrySetAttributeAsync("New Property", "test from code");
86+
await project.SaveAsync();
87+
}
88+
7689
await VS.Documents.OpenAsync(newFileFullName);
7790

7891
await OutputPane.ActivateAsync();
Lines changed: 45 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,45 @@
1+
namespace SqlQueryTools.Dto
2+
{
3+
internal class SpDescribeFirstResultSetResult
4+
{
5+
public bool is_hidden { get; set; }
6+
public int column_ordinal { get; set; }
7+
public string name { get; set; }
8+
public bool is_nullable { get; set; }
9+
public int system_type_id { get; set; }
10+
public string system_type_name { get; set; }
11+
public int max_length { get; set; }
12+
public int precision { get; set; }
13+
public int scale { get; set; }
14+
public string collation_name { get; set; }
15+
public int user_type_id { get; set; }
16+
public string user_type_database { get; set; }
17+
public string user_type_schema { get; set; }
18+
public string user_type_name { get; set; }
19+
public string assembly_qualified_type_name { get; set; }
20+
public int xml_collection_id { get; set; }
21+
public string xml_collection_database { get; set; }
22+
public string xml_collection_schema { get; set; }
23+
public string xml_collection_name { get; set; }
24+
public bool is_xml_document { get; set; }
25+
public bool is_case_sensitive { get; set; }
26+
public bool is_fixed_length_clr_type { get; set; }
27+
public string source_server { get; set; }
28+
public string source_database { get; set; }
29+
public string source_schema { get; set; }
30+
public string source_table { get; set; }
31+
public string source_column { get; set; }
32+
public bool is_identity_column { get; set; }
33+
public bool is_part_of_unique_key { get; set; }
34+
public bool is_updateable { get; set; }
35+
public bool is_computed_column { get; set; }
36+
public bool is_sparse_column_set { get; set; }
37+
public bool ordinal_in_order_by_list { get; set; }
38+
public bool order_by_is_descending { get; set; }
39+
public bool order_by_list_length { get; set; }
40+
public int tds_type_id { get; set; }
41+
public int tds_length { get; set; }
42+
public int tds_collation_id { get; set; }
43+
public int tds_collation_sort_id { get; set; }
44+
}
45+
}

src/SqlQueryTools/FileHandlers/SqlSaveHandler.cs

Lines changed: 31 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,9 @@
33
using Microsoft.VisualStudio.Text;
44
using Microsoft.VisualStudio.Text.Editor;
55
using Microsoft.VisualStudio.Utilities;
6+
using SqlQueryTools.Dto;
67
using SqlQueryTools.Extensions;
8+
using SqlQueryTools.Helpers;
79
using SqlQueryTools.Options;
810
using System.Collections.Generic;
911
using System.ComponentModel.Composition;
@@ -165,20 +167,19 @@ private async Task GenerateSqlConstStringAsync(string inputFilePath)
165167
return;
166168
}
167169

170+
List<SpDescribeFirstResultSetResult> queryMetaData;
168171
try
169172
{
170173
using (var conn = new SqlConnection(connectionString))
171174
{
172175
await conn.OpenAsync();
173176
try
174177
{
175-
//conn.Query($"DECLARE @sql NVARCHAR(MAX) = '{sqlCode.Replace("'", "''")}'; EXEC sp_describe_first_result_set @sql;");
176-
//conn.Query($"DECLARE @sql NVARCHAR(MAX) = '{sqlCode.Replace("'", "''")}'; DECLARE @params NVARCHAR(MAX) = '{string.Join(", ", declaredParameters.Select(x => $"{x.Key} {x.Value}"))}'; EXEC sp_describe_first_result_set @sql, @params;").ToList();
177178
var queryBuilder = new StringBuilder();
178179
queryBuilder.AppendLine($"DECLARE @sql NVARCHAR(MAX) = '{sqlCode.Replace("'", "''")}';");
179180
queryBuilder.AppendLine($"DECLARE @params NVARCHAR(MAX) = '{string.Join(", ", declaredParameters.Select(x => $"{x.Key} {x.Value}"))}';");
180181
queryBuilder.AppendLine("EXEC sp_describe_first_result_set @sql, @params;");
181-
conn.Query(queryBuilder.ToString()).ToList();
182+
queryMetaData = conn.Query<SpDescribeFirstResultSetResult>(queryBuilder.ToString()).ToList();
182183
}
183184
catch (SqlException ex)
184185
{
@@ -234,15 +235,39 @@ private async Task GenerateSqlConstStringAsync(string inputFilePath)
234235
contentBuilder.AppendLine($"\t{{");
235236
contentBuilder.AppendLine($"\t\tpublic const string {options.SqlStringFieldName} = @\"{sqlCode}\";");
236237

237-
foreach (var name in declaredParameters.Keys)
238+
var generateParameterNames = await inputPhysicalFile.GetAttributeAsync(AddSqlFileCommand.GenerateParameterNamesAttributeName);
239+
var generatePocoClass = await inputPhysicalFile.GetAttributeAsync(AddSqlFileCommand.GeneratePocoClassAttributeName);
240+
241+
if (true)
238242
{
239-
contentBuilder.AppendLine();
240-
contentBuilder.AppendLine($"\t\tpublic const string {name} = @\"{name}\";");
243+
foreach (var name in declaredParameters.Keys)
244+
{
245+
contentBuilder.AppendLine();
246+
contentBuilder.AppendLine($"\t\tpublic const string {name} = @\"{name}\";");
247+
}
248+
241249
}
242250

243251
contentBuilder.AppendLine($"\t}}");
244252
contentBuilder.AppendLine($"}}");
245253

254+
if (false)
255+
{
256+
contentBuilder.AppendLine();
257+
contentBuilder.AppendLine($"\tpublic class {className}Dto");
258+
contentBuilder.AppendLine($"\t{{");
259+
260+
foreach (var columnInfo in queryMetaData)
261+
{
262+
var columnName = columnInfo.name;
263+
var columnType = SqlTypeHelper.ToCSharpTypeName(columnInfo.system_type_name);
264+
265+
contentBuilder.AppendLine($"\t\tpublic {columnType} {columnName} {{ get; set; }}");
266+
}
267+
268+
contentBuilder.AppendLine($"\t}}");
269+
}
270+
246271
var newFileName = $"{inputFileNameWithoutSuffix}{options.CodeFileSuffix}";
247272
var newFilePath = Path.Combine(inputFileDirectory, newFileName);
248273

Lines changed: 42 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,42 @@
1+
namespace SqlQueryTools.Helpers
2+
{
3+
internal static class SqlTypeHelper
4+
{
5+
internal static string ToCSharpTypeName(string sqlTypeName)
6+
{
7+
if (sqlTypeName.ToLower().StartsWith("bigint")) return "System.Int64";
8+
if (sqlTypeName.ToLower().StartsWith("binary")) return "System.Byte[]";
9+
if (sqlTypeName.ToLower().StartsWith("bit")) return "System.Boolean";
10+
if (sqlTypeName.ToLower().StartsWith("char")) return "System.String";
11+
if (sqlTypeName.ToLower().StartsWith("datetimeoffset")) return "System.DateTimeOffset";
12+
if (sqlTypeName.ToLower().StartsWith("datetime2")) return "System.DateTime";
13+
if (sqlTypeName.ToLower().StartsWith("datetime")) return "System.DateTime";
14+
if (sqlTypeName.ToLower().StartsWith("date")) return "System.DateTime";
15+
if (sqlTypeName.ToLower().StartsWith("decimal")) return "System.Decimal";
16+
if (sqlTypeName.ToLower().StartsWith("float")) return "System.Double";
17+
if (sqlTypeName.ToLower().StartsWith("image")) return "System.Byte[]";
18+
if (sqlTypeName.ToLower().StartsWith("int")) return "System.Int32";
19+
if (sqlTypeName.ToLower().StartsWith("money")) return "System.Decimal";
20+
if (sqlTypeName.ToLower().StartsWith("nchar")) return "System.String";
21+
if (sqlTypeName.ToLower().StartsWith("ntext")) return "System.String";
22+
if (sqlTypeName.ToLower().StartsWith("numeric")) return "System.Decimal";
23+
if (sqlTypeName.ToLower().StartsWith("nvarchar")) return "System.String";
24+
if (sqlTypeName.ToLower().StartsWith("real")) return "System.Single";
25+
if (sqlTypeName.ToLower().StartsWith("rowversion")) return "System.Byte[]";
26+
if (sqlTypeName.ToLower().StartsWith("smalldatetime")) return "System.DateTime";
27+
if (sqlTypeName.ToLower().StartsWith("smallint")) return "System.Int16";
28+
if (sqlTypeName.ToLower().StartsWith("smallmoney")) return "System.Decimal";
29+
if (sqlTypeName.ToLower().StartsWith("sql_variant")) return "System.Object";
30+
if (sqlTypeName.ToLower().StartsWith("text")) return "System.String";
31+
if (sqlTypeName.ToLower().StartsWith("timestamp")) return "System.Byte[]";
32+
if (sqlTypeName.ToLower().StartsWith("time")) return "System.TimeSpan";
33+
if (sqlTypeName.ToLower().StartsWith("tinyint")) return "System.Byte";
34+
if (sqlTypeName.ToLower().StartsWith("uniqueidentifier")) return "System.Guid";
35+
if (sqlTypeName.ToLower().StartsWith("varbinary")) return "System.Byte[]";
36+
if (sqlTypeName.ToLower().StartsWith("varchar")) return "System.String";
37+
if (sqlTypeName.ToLower().StartsWith("xml")) return "System.Xml";
38+
39+
return "System.Object";
40+
}
41+
}
42+
}

src/SqlQueryTools/Options/GeneralOptions.cs

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,18 @@ internal class GeneralOptions : BaseOptionModel<GeneralOptions>
1616
[DefaultValue("---------- End Of Parameter Declaration ----------")]
1717
public string EndOfParameterDeclarationMarker { get; set; } = "---------- End Of Parameter Declaration ----------";
1818

19+
[Category("Sql File")]
20+
[DisplayName("Default generate parameter names")]
21+
[Description("This default is used when a new sql file is created. It marks that the parameter name fields should be generated for this sql file.")]
22+
[DefaultValue(true)]
23+
public bool GenerateParameterNames { get; set; } = true;
24+
25+
[Category("Sql File")]
26+
[DisplayName("Default generate poco class")]
27+
[Description("This default is used when a new sql file is created. It marks that poco class should be generated for this sql file. The poco class contains properties for every column that gets returned by the query.")]
28+
[DefaultValue(false)]
29+
public bool GeneratePocoClass { get; set; } = false;
30+
1931
[Category("Code generator")]
2032
[DisplayName("Class suffix")]
2133
[Description("This suffix will be added to the class name SqlQueryTools will generate for the sql string.")]
Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,19 @@
1+
using System.ComponentModel;
2+
using System.Drawing.Design;
3+
4+
namespace SqlQueryTools.PropertyExtenders
5+
{
6+
public class CustomUiTypeEditor : UITypeEditor
7+
{
8+
public override UITypeEditorEditStyle GetEditStyle(ITypeDescriptorContext context)
9+
{
10+
return UITypeEditorEditStyle.Modal;
11+
}
12+
13+
public override object EditValue(ITypeDescriptorContext context, IServiceProvider provider, object value)
14+
{
15+
// Use the result of a dialog or something else here.
16+
return "HELLO WORLD";
17+
}
18+
}
19+
}
Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,10 @@
1+
using System.Runtime.InteropServices;
2+
3+
namespace SqlQueryTools.PropertyExtenders
4+
{
5+
[ComVisible(true)]
6+
public interface IMyDynamicExtender
7+
{
8+
String NewProperty { get; set; }
9+
}
10+
}
Lines changed: 27 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,27 @@
1+
using EnvDTE;
2+
using Microsoft.Internal.VisualStudio.PlatformUI;
3+
4+
namespace SqlQueryTools.PropertyExtenders
5+
{
6+
public class MyExtenderProvider : IExtenderProvider
7+
{
8+
private IMyDynamicExtender _extender;
9+
public object GetExtender(string extenderCatid, string extenderName,
10+
object extendeeObject, IExtenderSite extenderSite,
11+
int cookie)
12+
{
13+
ThreadHelper.ThrowIfNotOnUIThread();
14+
15+
return _extender = CanExtend(extenderCatid, extenderName, extendeeObject) ?
16+
new NewPropertyExtender(extenderSite, cookie) : null;
17+
}
18+
19+
public bool CanExtend(string extenderCatid, string extenderName, object extendeeObject)
20+
{
21+
//((Microsoft.VisualStudio.ProjectSystem.VS.Implementation.PropertyPages.DynamicTypeBrowseObjectBase)extendeeObject).Name
22+
23+
// Some implementation will be here in the real world.
24+
return true;
25+
}
26+
}
27+
}
Lines changed: 47 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,47 @@
1+
using EnvDTE;
2+
using System.ComponentModel;
3+
using System.Drawing.Design;
4+
using System.Runtime.InteropServices;
5+
6+
namespace SqlQueryTools.PropertyExtenders
7+
{
8+
[ComVisible(true)] // Important!
9+
public class NewPropertyExtender : IMyDynamicExtender, IDisposable
10+
{
11+
// These attibutes supply the property with some information
12+
// on how to display and which UITypeEditor to use.
13+
[DisplayName("New Property")]
14+
[Category("New")]
15+
[Description("Specifies the new property")]
16+
//[Editor(typeof(CustomUiTypeEditor), typeof(UITypeEditor))]
17+
public String NewProperty { get; set; }
18+
private readonly IExtenderSite _extenderSite;
19+
private readonly int _cookie;
20+
private bool _disposed;
21+
22+
public NewPropertyExtender(IExtenderSite extenderSite, int cookie)
23+
{
24+
_extenderSite = extenderSite;
25+
_cookie = cookie;
26+
}
27+
28+
public void Dispose()
29+
{
30+
Dispose(true);
31+
// take the instance off of the finalization queue.
32+
GC.SuppressFinalize(this);
33+
}
34+
35+
private void Dispose(bool disposing)
36+
{
37+
ThreadHelper.ThrowIfNotOnUIThread();
38+
39+
if (_disposed) return;
40+
if (disposing && _cookie != 0)
41+
{
42+
_extenderSite.NotifyDelete(_cookie);
43+
}
44+
_disposed = true;
45+
}
46+
}
47+
}

src/SqlQueryTools/SqlQueryTools.csproj

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -50,12 +50,18 @@
5050
<DependentUpon>FileNameDialog.xaml</DependentUpon>
5151
</Compile>
5252
<Compile Include="Dialogs\VsTheme.cs" />
53+
<Compile Include="Dtos\SpDescribeFirstResultSetResult.cs" />
5354
<Compile Include="Extensions\ProjectExtensions.cs" />
5455
<Compile Include="FileHandlers\SqlSaveHandler.cs" />
56+
<Compile Include="Helpers\SqlTypeHelper.cs" />
5557
<Compile Include="Options\DialogPageProvider.cs" />
5658
<Compile Include="Options\GeneralOptions.cs" />
5759
<Compile Include="Properties\AssemblyInfo.cs" />
5860
<Compile Include="Commands\AddSqlFileCommand.cs" />
61+
<Compile Include="PropertyExtenders\CustomUiTypeEditor.cs" />
62+
<Compile Include="PropertyExtenders\IMyDynamicExtender.cs" />
63+
<Compile Include="PropertyExtenders\MyExtenderProvider.cs" />
64+
<Compile Include="PropertyExtenders\NewPropertyExtender.cs" />
5965
<Compile Include="SqlQueryToolsPackage.cs" />
6066
<Compile Include="source.extension.cs">
6167
<AutoGen>True</AutoGen>

0 commit comments

Comments
 (0)