subsonic 3.0.0.4
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- data/lib/LICENSE.txt +41 -0
- data/lib/SubSonic.Core.dll +0 -0
- data/lib/T4 Templates/ActiveRecord/ActiveRecord.tt +620 -0
- data/lib/T4 Templates/ActiveRecord/Context.tt +295 -0
- data/lib/T4 Templates/ActiveRecord/SQLServer.ttinclude +347 -0
- data/lib/T4 Templates/ActiveRecord/Settings.ttinclude +552 -0
- data/lib/T4 Templates/ActiveRecord/StoredProcedures.tt +30 -0
- data/lib/T4 Templates/ActiveRecord/Structs.tt +67 -0
- data/lib/T4 Templates/LinqTemplates/Classes.tt +117 -0
- data/lib/T4 Templates/LinqTemplates/Context.tt +276 -0
- data/lib/T4 Templates/LinqTemplates/SQLServer.ttinclude +349 -0
- data/lib/T4 Templates/LinqTemplates/Settings.ttinclude +551 -0
- data/lib/T4 Templates/LinqTemplates/StoredProcedures.tt +30 -0
- data/lib/T4 Templates/LinqTemplates/Structs.tt +67 -0
- data/lib/T4 Templates/README.txt +7 -0
- data/lib/T4 Templates/SubSonic.TemplatesVB/ActiveRecord/ActiveRecord.tt +560 -0
- data/lib/T4 Templates/SubSonic.TemplatesVB/ActiveRecord/ActiveRecord.vb +6447 -0
- data/lib/T4 Templates/SubSonic.TemplatesVB/ActiveRecord/Context.tt +258 -0
- data/lib/T4 Templates/SubSonic.TemplatesVB/ActiveRecord/Context.vb +349 -0
- data/lib/T4 Templates/SubSonic.TemplatesVB/ActiveRecord/SQLServer.ttinclude +332 -0
- data/lib/T4 Templates/SubSonic.TemplatesVB/ActiveRecord/Settings.ttinclude +550 -0
- data/lib/T4 Templates/SubSonic.TemplatesVB/ActiveRecord/StoredProcedures.tt +30 -0
- data/lib/T4 Templates/SubSonic.TemplatesVB/ActiveRecord/StoredProcedures.vb +55 -0
- data/lib/T4 Templates/SubSonic.TemplatesVB/ActiveRecord/Structs.tt +57 -0
- data/lib/T4 Templates/SubSonic.TemplatesVB/ActiveRecord/Structs.vb +1478 -0
- data/lib/T4 Templates/SubSonic.TemplatesVB/ActiveRecord/Tests/FetchTests.vb +52 -0
- data/lib/T4 Templates/SubSonic.TemplatesVB/App.config +9 -0
- data/lib/T4 Templates/SubSonic.TemplatesVB/My Project/Application.Designer.vb +13 -0
- data/lib/T4 Templates/SubSonic.TemplatesVB/My Project/Application.myapp +10 -0
- data/lib/T4 Templates/SubSonic.TemplatesVB/My Project/AssemblyInfo.vb +35 -0
- data/lib/T4 Templates/SubSonic.TemplatesVB/My Project/Resources.Designer.vb +63 -0
- data/lib/T4 Templates/SubSonic.TemplatesVB/My Project/Resources.resx +117 -0
- data/lib/T4 Templates/SubSonic.TemplatesVB/My Project/Settings.Designer.vb +73 -0
- data/lib/T4 Templates/SubSonic.TemplatesVB/My Project/Settings.settings +7 -0
- data/lib/T4 Templates/SubSonic.TemplatesVB/SubSonic.TemplatesVB.vbproj +171 -0
- data/lib/T4 Templates/SubSonic.TemplatesVB/SubSonic.TemplatesVB.vbproj.user +5 -0
- data/lib/T4 Templates/TemplateProviders/MySQL.ttinclude +278 -0
- data/lib/T4 Templates/TemplateProviders/MySQL.ttinclude.orig +303 -0
- data/lib/T4 Templates/TemplateProviders/MySQLTest.tt +27 -0
- data/lib/T4 Templates/TemplateProviders/SQLite.ttinclude +194 -0
- data/lib/T4 Templates/TemplateProviders/SQLite.ttinclude.orig +236 -0
- data/lib/T4 Templates/TemplateProviders/SQLiteTest.tt +27 -0
- data/lib/T4 Templates/TemplateProviders/Settings.ttinclude +551 -0
- metadata +112 -0
@@ -0,0 +1,295 @@
|
|
1
|
+
<#@ template language="C#v3.5" debug="False" hostspecific="True" #>
|
2
|
+
<#@ output extension=".cs" #>
|
3
|
+
<#@ include file="SQLServer.ttinclude" #>
|
4
|
+
<#
|
5
|
+
var tables = LoadTables();
|
6
|
+
#>
|
7
|
+
using System;
|
8
|
+
using System.Data;
|
9
|
+
using System.Linq;
|
10
|
+
using System.Linq.Expressions;
|
11
|
+
using SubSonic.DataProviders;
|
12
|
+
using SubSonic.Extensions;
|
13
|
+
using SubSonic.Linq.Structure;
|
14
|
+
using SubSonic.Query;
|
15
|
+
using SubSonic.Schema;
|
16
|
+
using System.Data.Common;
|
17
|
+
using System.Collections.Generic;
|
18
|
+
|
19
|
+
namespace <#=Namespace#>
|
20
|
+
{
|
21
|
+
public partial class <#=DatabaseName#>DB : IQuerySurface
|
22
|
+
{
|
23
|
+
|
24
|
+
public IDataProvider DataProvider;
|
25
|
+
public DbQueryProvider provider;
|
26
|
+
|
27
|
+
public static IDataProvider DefaultDataProvider { get; set; }
|
28
|
+
|
29
|
+
public bool TestMode
|
30
|
+
{
|
31
|
+
get
|
32
|
+
{
|
33
|
+
return DataProvider.ConnectionString.Equals("test", StringComparison.InvariantCultureIgnoreCase);
|
34
|
+
}
|
35
|
+
}
|
36
|
+
|
37
|
+
public <#=DatabaseName#>DB()
|
38
|
+
{
|
39
|
+
if (DefaultDataProvider == null) {
|
40
|
+
DataProvider = ProviderFactory.GetProvider("<#=ConnectionStringName#>");
|
41
|
+
}
|
42
|
+
else {
|
43
|
+
DataProvider = DefaultDataProvider;
|
44
|
+
}
|
45
|
+
Init();
|
46
|
+
}
|
47
|
+
|
48
|
+
public <#=DatabaseName#>DB(string connectionStringName)
|
49
|
+
{
|
50
|
+
DataProvider = ProviderFactory.GetProvider(connectionStringName);
|
51
|
+
Init();
|
52
|
+
}
|
53
|
+
|
54
|
+
public <#=DatabaseName#>DB(string connectionString, string providerName)
|
55
|
+
{
|
56
|
+
DataProvider = ProviderFactory.GetProvider(connectionString,providerName);
|
57
|
+
Init();
|
58
|
+
}
|
59
|
+
|
60
|
+
public ITable FindByPrimaryKey(string pkName)
|
61
|
+
{
|
62
|
+
return DataProvider.Schema.Tables.SingleOrDefault(x => x.PrimaryKey.Name.Equals(pkName, StringComparison.InvariantCultureIgnoreCase));
|
63
|
+
}
|
64
|
+
|
65
|
+
public Query<T> GetQuery<T>()
|
66
|
+
{
|
67
|
+
return new Query<T>(provider);
|
68
|
+
}
|
69
|
+
|
70
|
+
public ITable FindTable(string tableName)
|
71
|
+
{
|
72
|
+
return DataProvider.FindTable(tableName);
|
73
|
+
}
|
74
|
+
|
75
|
+
public IDataProvider Provider
|
76
|
+
{
|
77
|
+
get { return DataProvider; }
|
78
|
+
set {DataProvider=value;}
|
79
|
+
}
|
80
|
+
|
81
|
+
public DbQueryProvider QueryProvider
|
82
|
+
{
|
83
|
+
get { return provider; }
|
84
|
+
}
|
85
|
+
|
86
|
+
BatchQuery _batch = null;
|
87
|
+
public void Queue<T>(IQueryable<T> qry)
|
88
|
+
{
|
89
|
+
if (_batch == null)
|
90
|
+
_batch = new BatchQuery(Provider, QueryProvider);
|
91
|
+
_batch.Queue(qry);
|
92
|
+
}
|
93
|
+
|
94
|
+
public void Queue(ISqlQuery qry)
|
95
|
+
{
|
96
|
+
if (_batch == null)
|
97
|
+
_batch = new BatchQuery(Provider, QueryProvider);
|
98
|
+
_batch.Queue(qry);
|
99
|
+
}
|
100
|
+
|
101
|
+
public void ExecuteTransaction(IList<DbCommand> commands)
|
102
|
+
{
|
103
|
+
if(!TestMode)
|
104
|
+
{
|
105
|
+
using(var connection = commands[0].Connection)
|
106
|
+
{
|
107
|
+
if (connection.State == ConnectionState.Closed)
|
108
|
+
connection.Open();
|
109
|
+
|
110
|
+
using (var trans = connection.BeginTransaction())
|
111
|
+
{
|
112
|
+
foreach (var cmd in commands)
|
113
|
+
{
|
114
|
+
cmd.Transaction = trans;
|
115
|
+
cmd.Connection = connection;
|
116
|
+
cmd.ExecuteNonQuery();
|
117
|
+
}
|
118
|
+
trans.Commit();
|
119
|
+
}
|
120
|
+
connection.Close();
|
121
|
+
}
|
122
|
+
}
|
123
|
+
}
|
124
|
+
|
125
|
+
public IDataReader ExecuteBatch()
|
126
|
+
{
|
127
|
+
if (_batch == null)
|
128
|
+
throw new InvalidOperationException("There's nothing in the queue");
|
129
|
+
if(!TestMode)
|
130
|
+
return _batch.ExecuteReader();
|
131
|
+
return null;
|
132
|
+
}
|
133
|
+
<# //################################################ IQueryable ####################################### #>
|
134
|
+
<# foreach(Table tbl in tables){
|
135
|
+
if(!ExcludeTables.Contains(tbl.Name))
|
136
|
+
{
|
137
|
+
#>
|
138
|
+
public Query<<#=tbl.ClassName#>> <#=tbl.QueryableName#> { get; set; }
|
139
|
+
<#
|
140
|
+
}
|
141
|
+
}
|
142
|
+
#>
|
143
|
+
|
144
|
+
<# //################################################ Aggregates and Queries ####################################### #>
|
145
|
+
|
146
|
+
#region ' Aggregates and SubSonic Queries '
|
147
|
+
public Select SelectColumns(params string[] columns)
|
148
|
+
{
|
149
|
+
return new Select(DataProvider, columns);
|
150
|
+
}
|
151
|
+
|
152
|
+
public Select Select
|
153
|
+
{
|
154
|
+
get { return new Select(this.Provider); }
|
155
|
+
}
|
156
|
+
|
157
|
+
public Insert Insert
|
158
|
+
{
|
159
|
+
get { return new Insert(this.Provider); }
|
160
|
+
}
|
161
|
+
|
162
|
+
public Update<T> Update<T>() where T:new()
|
163
|
+
{
|
164
|
+
return new Update<T>(this.Provider);
|
165
|
+
}
|
166
|
+
|
167
|
+
public SqlQuery Delete<T>(Expression<Func<T,bool>> column) where T:new()
|
168
|
+
{
|
169
|
+
LambdaExpression lamda = column;
|
170
|
+
SqlQuery result = new Delete<T>(this.Provider);
|
171
|
+
result = result.From<T>();
|
172
|
+
result.Constraints=lamda.ParseConstraints().ToList();
|
173
|
+
return result;
|
174
|
+
}
|
175
|
+
|
176
|
+
public SqlQuery Max<T>(Expression<Func<T,object>> column)
|
177
|
+
{
|
178
|
+
LambdaExpression lamda = column;
|
179
|
+
string colName = lamda.ParseObjectValue();
|
180
|
+
string objectName = typeof(T).Name;
|
181
|
+
string tableName = DataProvider.FindTable(objectName).Name;
|
182
|
+
return new Select(DataProvider, new Aggregate(colName, AggregateFunction.Max)).From(tableName);
|
183
|
+
}
|
184
|
+
|
185
|
+
public SqlQuery Min<T>(Expression<Func<T,object>> column)
|
186
|
+
{
|
187
|
+
LambdaExpression lamda = column;
|
188
|
+
string colName = lamda.ParseObjectValue();
|
189
|
+
string objectName = typeof(T).Name;
|
190
|
+
string tableName = this.Provider.FindTable(objectName).Name;
|
191
|
+
return new Select(this.Provider, new Aggregate(colName, AggregateFunction.Min)).From(tableName);
|
192
|
+
}
|
193
|
+
|
194
|
+
public SqlQuery Sum<T>(Expression<Func<T,object>> column)
|
195
|
+
{
|
196
|
+
LambdaExpression lamda = column;
|
197
|
+
string colName = lamda.ParseObjectValue();
|
198
|
+
string objectName = typeof(T).Name;
|
199
|
+
string tableName = this.Provider.FindTable(objectName).Name;
|
200
|
+
return new Select(this.Provider, new Aggregate(colName, AggregateFunction.Sum)).From(tableName);
|
201
|
+
}
|
202
|
+
|
203
|
+
public SqlQuery Avg<T>(Expression<Func<T,object>> column)
|
204
|
+
{
|
205
|
+
LambdaExpression lamda = column;
|
206
|
+
string colName = lamda.ParseObjectValue();
|
207
|
+
string objectName = typeof(T).Name;
|
208
|
+
string tableName = this.Provider.FindTable(objectName).Name;
|
209
|
+
return new Select(this.Provider, new Aggregate(colName, AggregateFunction.Avg)).From(tableName);
|
210
|
+
}
|
211
|
+
|
212
|
+
public SqlQuery Count<T>(Expression<Func<T,object>> column)
|
213
|
+
{
|
214
|
+
LambdaExpression lamda = column;
|
215
|
+
string colName = lamda.ParseObjectValue();
|
216
|
+
string objectName = typeof(T).Name;
|
217
|
+
string tableName = this.Provider.FindTable(objectName).Name;
|
218
|
+
return new Select(this.Provider, new Aggregate(colName, AggregateFunction.Count)).From(tableName);
|
219
|
+
}
|
220
|
+
|
221
|
+
public SqlQuery Variance<T>(Expression<Func<T,object>> column)
|
222
|
+
{
|
223
|
+
LambdaExpression lamda = column;
|
224
|
+
string colName = lamda.ParseObjectValue();
|
225
|
+
string objectName = typeof(T).Name;
|
226
|
+
string tableName = this.Provider.FindTable(objectName).Name;
|
227
|
+
return new Select(this.Provider, new Aggregate(colName, AggregateFunction.Var)).From(tableName);
|
228
|
+
}
|
229
|
+
|
230
|
+
public SqlQuery StandardDeviation<T>(Expression<Func<T,object>> column)
|
231
|
+
{
|
232
|
+
LambdaExpression lamda = column;
|
233
|
+
string colName = lamda.ParseObjectValue();
|
234
|
+
string objectName = typeof(T).Name;
|
235
|
+
string tableName = this.Provider.FindTable(objectName).Name;
|
236
|
+
return new Select(this.Provider, new Aggregate(colName, AggregateFunction.StDev)).From(tableName);
|
237
|
+
}
|
238
|
+
|
239
|
+
#endregion
|
240
|
+
|
241
|
+
void Init()
|
242
|
+
{
|
243
|
+
provider = new DbQueryProvider(this.Provider);
|
244
|
+
|
245
|
+
<#
|
246
|
+
//################################################ QUERIES ####################################### #>
|
247
|
+
#region ' Query Defs '
|
248
|
+
<#
|
249
|
+
foreach(Table tbl in tables)
|
250
|
+
{
|
251
|
+
if(!ExcludeTables.Contains(tbl.Name))
|
252
|
+
{
|
253
|
+
#>
|
254
|
+
<#=tbl.QueryableName#> = new Query<<#=tbl.ClassName#>>(provider);
|
255
|
+
<#
|
256
|
+
}
|
257
|
+
#>
|
258
|
+
<#
|
259
|
+
}
|
260
|
+
#>
|
261
|
+
#endregion
|
262
|
+
|
263
|
+
<#//################################################ SCHEMAS ####################################### #>
|
264
|
+
|
265
|
+
#region ' Schemas '
|
266
|
+
if(DataProvider.Schema.Tables.Count == 0)
|
267
|
+
{
|
268
|
+
<#
|
269
|
+
foreach(Table tbl in tables)
|
270
|
+
{
|
271
|
+
if(!ExcludeTables.Contains(tbl.Name))
|
272
|
+
{
|
273
|
+
#>
|
274
|
+
DataProvider.Schema.Tables.Add(new <#=tbl.CleanName#>Table(DataProvider));
|
275
|
+
<#
|
276
|
+
}
|
277
|
+
}
|
278
|
+
#>
|
279
|
+
}
|
280
|
+
#endregion
|
281
|
+
}
|
282
|
+
|
283
|
+
<#//################################################ HELPERS ####################################### #>
|
284
|
+
|
285
|
+
#region ' Helpers '
|
286
|
+
|
287
|
+
internal static DateTime DateTimeNowTruncatedDownToSecond() {
|
288
|
+
var now = DateTime.Now;
|
289
|
+
return now.AddTicks(-now.Ticks % TimeSpan.TicksPerSecond);
|
290
|
+
}
|
291
|
+
|
292
|
+
#endregion
|
293
|
+
|
294
|
+
}
|
295
|
+
}
|
@@ -0,0 +1,347 @@
|
|
1
|
+
<#@ include file="Settings.ttinclude" #>
|
2
|
+
<#+
|
3
|
+
|
4
|
+
IDataReader GetReader(string sql){
|
5
|
+
SqlConnection conn=new SqlConnection(ConnectionString);
|
6
|
+
SqlCommand cmd=new SqlCommand(sql,conn);
|
7
|
+
conn.Open();
|
8
|
+
return cmd.ExecuteReader(CommandBehavior.CloseConnection);
|
9
|
+
}
|
10
|
+
SqlCommand GetCommand(string sql){
|
11
|
+
SqlConnection conn=new SqlConnection(ConnectionString);
|
12
|
+
SqlCommand cmd=new SqlCommand(sql,conn);
|
13
|
+
conn.Open();
|
14
|
+
return cmd;
|
15
|
+
}
|
16
|
+
|
17
|
+
const string FKSql=@"SELECT
|
18
|
+
ThisTable = FK.TABLE_NAME,
|
19
|
+
ThisColumn = CU.COLUMN_NAME,
|
20
|
+
OtherTable = PK.TABLE_NAME,
|
21
|
+
OtherColumn = PT.COLUMN_NAME,
|
22
|
+
Constraint_Name = C.CONSTRAINT_NAME,
|
23
|
+
Owner = FK.TABLE_SCHEMA
|
24
|
+
FROM INFORMATION_SCHEMA.REFERENTIAL_CONSTRAINTS C
|
25
|
+
INNER JOIN INFORMATION_SCHEMA.TABLE_CONSTRAINTS FK ON C.CONSTRAINT_NAME = FK.CONSTRAINT_NAME
|
26
|
+
INNER JOIN INFORMATION_SCHEMA.TABLE_CONSTRAINTS PK ON C.UNIQUE_CONSTRAINT_NAME = PK.CONSTRAINT_NAME
|
27
|
+
INNER JOIN INFORMATION_SCHEMA.KEY_COLUMN_USAGE CU ON C.CONSTRAINT_NAME = CU.CONSTRAINT_NAME
|
28
|
+
INNER JOIN
|
29
|
+
(
|
30
|
+
SELECT i1.TABLE_NAME, i2.COLUMN_NAME
|
31
|
+
FROM INFORMATION_SCHEMA.TABLE_CONSTRAINTS i1
|
32
|
+
INNER JOIN INFORMATION_SCHEMA.KEY_COLUMN_USAGE i2 ON i1.CONSTRAINT_NAME = i2.CONSTRAINT_NAME
|
33
|
+
WHERE i1.CONSTRAINT_TYPE = 'PRIMARY KEY'
|
34
|
+
)
|
35
|
+
PT ON PT.TABLE_NAME = PK.TABLE_NAME
|
36
|
+
WHERE FK.Table_NAME=@tableName OR PK.Table_NAME=@tableName";
|
37
|
+
|
38
|
+
|
39
|
+
const string TABLE_SQL=@"SELECT *
|
40
|
+
FROM INFORMATION_SCHEMA.TABLES
|
41
|
+
WHERE TABLE_TYPE='BASE TABLE'";
|
42
|
+
|
43
|
+
const string COLUMN_SQL=@"SELECT
|
44
|
+
TABLE_CATALOG AS [Database],
|
45
|
+
TABLE_SCHEMA AS Owner,
|
46
|
+
TABLE_NAME AS TableName,
|
47
|
+
COLUMN_NAME AS ColumnName,
|
48
|
+
ORDINAL_POSITION AS OrdinalPosition,
|
49
|
+
COLUMN_DEFAULT AS DefaultSetting,
|
50
|
+
IS_NULLABLE AS IsNullable, DATA_TYPE AS DataType,
|
51
|
+
CHARACTER_MAXIMUM_LENGTH AS MaxLength,
|
52
|
+
DATETIME_PRECISION AS DatePrecision,
|
53
|
+
COLUMNPROPERTY(object_id('[' + TABLE_SCHEMA + '].[' + TABLE_NAME + ']'), COLUMN_NAME, 'IsIdentity') AS IsIdentity,
|
54
|
+
COLUMNPROPERTY(object_id('[' + TABLE_SCHEMA + '].[' + TABLE_NAME + ']'), COLUMN_NAME, 'IsComputed') as IsComputed
|
55
|
+
FROM INFORMATION_SCHEMA.COLUMNS
|
56
|
+
WHERE TABLE_NAME=@tableName
|
57
|
+
ORDER BY OrdinalPosition ASC";
|
58
|
+
|
59
|
+
|
60
|
+
List<SPParam> GetSPParams(string spName){
|
61
|
+
var result=new List<SPParam>();
|
62
|
+
|
63
|
+
string dbName = null;
|
64
|
+
|
65
|
+
if(!String.IsNullOrEmpty(DatabaseName))
|
66
|
+
dbName = DatabaseName;
|
67
|
+
|
68
|
+
string[] restrictions = new string[4] { dbName , null, spName, null };
|
69
|
+
|
70
|
+
using(SqlConnection conn=new SqlConnection(ConnectionString)){
|
71
|
+
conn.Open();
|
72
|
+
var sprocs=conn.GetSchema("ProcedureParameters", restrictions);
|
73
|
+
conn.Close();
|
74
|
+
foreach(DataRow row in sprocs.Select("", "ORDINAL_POSITION")){
|
75
|
+
SPParam p=new SPParam();
|
76
|
+
p.SysType=GetSysType(row["DATA_TYPE"].ToString());
|
77
|
+
p.DbType=GetDbType(row["DATA_TYPE"].ToString()).ToString();
|
78
|
+
p.Name=row["PARAMETER_NAME"].ToString().Replace("@","");
|
79
|
+
p.CleanName=CleanUp(p.Name);
|
80
|
+
result.Add(p);
|
81
|
+
}
|
82
|
+
|
83
|
+
|
84
|
+
}
|
85
|
+
return result;
|
86
|
+
}
|
87
|
+
List<SP> GetSPs(){
|
88
|
+
var result=new List<SP>();
|
89
|
+
//pull the SPs
|
90
|
+
|
91
|
+
DataTable sprocs=null;
|
92
|
+
DataTable parameters=null;
|
93
|
+
|
94
|
+
using(SqlConnection conn=new SqlConnection(ConnectionString)){
|
95
|
+
conn.Open();
|
96
|
+
sprocs=conn.GetSchema("Procedures");
|
97
|
+
conn.Close();
|
98
|
+
}
|
99
|
+
|
100
|
+
foreach(DataRow row in sprocs.Rows){
|
101
|
+
string spType=row["ROUTINE_TYPE"].ToString();
|
102
|
+
var sp=new SP();
|
103
|
+
sp.Name=row["ROUTINE_NAME"].ToString();
|
104
|
+
|
105
|
+
if(spType=="PROCEDURE" &! sp.Name.StartsWith("sp_")){
|
106
|
+
|
107
|
+
sp.CleanName=CleanUp(sp.Name);
|
108
|
+
|
109
|
+
sp.Parameters=GetSPParams(sp.Name);
|
110
|
+
result.Add(sp);
|
111
|
+
}
|
112
|
+
}
|
113
|
+
return result;
|
114
|
+
|
115
|
+
}
|
116
|
+
|
117
|
+
|
118
|
+
List<Table> LoadTables(){
|
119
|
+
var result=new List<Table>();
|
120
|
+
|
121
|
+
//pull the tables in a reader
|
122
|
+
using(IDataReader rdr=GetReader(TABLE_SQL)){
|
123
|
+
while(rdr.Read()){
|
124
|
+
Table tbl=new Table();
|
125
|
+
tbl.Name=rdr["TABLE_NAME"].ToString();
|
126
|
+
tbl.Schema=rdr["TABLE_SCHEMA"].ToString();
|
127
|
+
tbl.Columns=LoadColumns(tbl);
|
128
|
+
tbl.PrimaryKey=GetPK(tbl.Name);
|
129
|
+
tbl.CleanName=CleanUp(tbl.Name);
|
130
|
+
tbl.ClassName=Inflector.MakeSingular(tbl.CleanName);
|
131
|
+
tbl.QueryableName=Inflector.MakePlural(tbl.ClassName);
|
132
|
+
|
133
|
+
//set the PK for the columns
|
134
|
+
var pkColumn=tbl.Columns.SingleOrDefault(x=>x.Name.ToLower().Trim()==tbl.PrimaryKey.ToLower().Trim());
|
135
|
+
if(pkColumn!=null)
|
136
|
+
pkColumn.IsPK=true;
|
137
|
+
|
138
|
+
tbl.FKTables=LoadFKTables(tbl.Name);
|
139
|
+
|
140
|
+
result.Add(tbl);
|
141
|
+
}
|
142
|
+
}
|
143
|
+
|
144
|
+
foreach(Table tbl in result){
|
145
|
+
//loop the FK tables and see if there's a match for our FK columns
|
146
|
+
foreach(Column col in tbl.Columns){
|
147
|
+
col.IsForeignKey=tbl.FKTables.Any(
|
148
|
+
x=>x.ThisColumn.Equals(col.Name,StringComparison.InvariantCultureIgnoreCase)
|
149
|
+
);
|
150
|
+
}
|
151
|
+
}
|
152
|
+
return result;
|
153
|
+
}
|
154
|
+
|
155
|
+
List<Column> LoadColumns(Table tbl){
|
156
|
+
var result=new List<Column>();
|
157
|
+
var cmd=GetCommand(COLUMN_SQL);
|
158
|
+
cmd.Parameters.AddWithValue("@tableName",tbl.Name);
|
159
|
+
|
160
|
+
using(IDataReader rdr=cmd.ExecuteReader(CommandBehavior.CloseConnection)){
|
161
|
+
while(rdr.Read()){
|
162
|
+
Column col=new Column();
|
163
|
+
col.Name=rdr["ColumnName"].ToString();
|
164
|
+
col.CleanName=CleanUp(col.Name);
|
165
|
+
col.DataType=rdr["DataType"].ToString();
|
166
|
+
col.SysType=GetSysType(col.DataType);
|
167
|
+
col.DbType=GetDbType(col.DataType);
|
168
|
+
col.AutoIncrement=rdr["IsIdentity"].ToString()=="1";
|
169
|
+
col.IsNullable=rdr["IsNullable"].ToString()=="YES";
|
170
|
+
int.TryParse(rdr["MaxLength"].ToString(),out col.MaxLength);
|
171
|
+
|
172
|
+
result.Add(col);
|
173
|
+
}
|
174
|
+
|
175
|
+
}
|
176
|
+
|
177
|
+
return result;
|
178
|
+
}
|
179
|
+
|
180
|
+
List<FKTable> LoadFKTables(string tableName){
|
181
|
+
|
182
|
+
//this is a "bi-directional" scheme
|
183
|
+
//which pulls both 1-many and many-1
|
184
|
+
|
185
|
+
var result=new List<FKTable>();
|
186
|
+
var cmd=GetCommand(FKSql);
|
187
|
+
cmd.Parameters.AddWithValue("@tableName",tableName);
|
188
|
+
using(IDataReader rdr=cmd.ExecuteReader(CommandBehavior.CloseConnection)){
|
189
|
+
while(rdr.Read()){
|
190
|
+
FKTable fk=new FKTable();
|
191
|
+
string thisTable=rdr["ThisTable"].ToString();
|
192
|
+
|
193
|
+
if(tableName.ToLower()==thisTable.ToLower()){
|
194
|
+
fk.ThisTable=rdr["ThisTable"].ToString();
|
195
|
+
fk.ThisColumn=rdr["ThisColumn"].ToString();
|
196
|
+
fk.OtherTable=rdr["OtherTable"].ToString();
|
197
|
+
fk.OtherColumn=rdr["OtherColumn"].ToString();
|
198
|
+
|
199
|
+
}else{
|
200
|
+
fk.ThisTable=rdr["OtherTable"].ToString();
|
201
|
+
fk.ThisColumn=rdr["OtherColumn"].ToString();
|
202
|
+
fk.OtherTable=rdr["ThisTable"].ToString();
|
203
|
+
fk.OtherColumn=rdr["ThisColumn"].ToString();
|
204
|
+
|
205
|
+
}
|
206
|
+
|
207
|
+
fk.OtherClass=Inflector.MakeSingular(CleanUp(fk.OtherTable));
|
208
|
+
fk.OtherQueryable=Inflector.MakePlural(fk.OtherClass);
|
209
|
+
|
210
|
+
result.Add(fk);
|
211
|
+
}
|
212
|
+
}
|
213
|
+
return result;
|
214
|
+
|
215
|
+
}
|
216
|
+
|
217
|
+
string GetPK(string table){
|
218
|
+
|
219
|
+
string pk="";
|
220
|
+
DataTable pkTable=new DataTable();
|
221
|
+
string sql=@"SELECT KCU.COLUMN_NAME
|
222
|
+
FROM INFORMATION_SCHEMA.KEY_COLUMN_USAGE KCU
|
223
|
+
JOIN INFORMATION_SCHEMA.TABLE_CONSTRAINTS TC
|
224
|
+
ON KCU.CONSTRAINT_NAME=TC.CONSTRAINT_NAME
|
225
|
+
WHERE TC.CONSTRAINT_TYPE='PRIMARY KEY'
|
226
|
+
AND KCU.TABLE_NAME=@tableName";
|
227
|
+
|
228
|
+
var cmd=GetCommand(sql);
|
229
|
+
cmd.Parameters.AddWithValue("@tableName",table);
|
230
|
+
var result=cmd.ExecuteScalar();
|
231
|
+
cmd.Dispose();
|
232
|
+
if(result!=null)
|
233
|
+
pk=result.ToString();
|
234
|
+
|
235
|
+
return pk;
|
236
|
+
}
|
237
|
+
|
238
|
+
string GetSysType(string sqlType){
|
239
|
+
string sysType="string";
|
240
|
+
switch (sqlType) {
|
241
|
+
case "bigint":
|
242
|
+
sysType = "long";
|
243
|
+
break;
|
244
|
+
case "smallint":
|
245
|
+
sysType= "short";
|
246
|
+
break;
|
247
|
+
case "int":
|
248
|
+
sysType= "int";
|
249
|
+
break;
|
250
|
+
case "uniqueidentifier":
|
251
|
+
sysType= "Guid";
|
252
|
+
break;
|
253
|
+
case "smalldatetime":
|
254
|
+
case "datetime":
|
255
|
+
case "date":
|
256
|
+
sysType= "DateTime";
|
257
|
+
break;
|
258
|
+
case "float":
|
259
|
+
sysType="double";
|
260
|
+
break;
|
261
|
+
case "real":
|
262
|
+
case "numeric":
|
263
|
+
case "smallmoney":
|
264
|
+
case "decimal":
|
265
|
+
case "money":
|
266
|
+
sysType= "decimal";
|
267
|
+
break;
|
268
|
+
case "tinyint":
|
269
|
+
sysType = "byte";
|
270
|
+
break;
|
271
|
+
case "bit":
|
272
|
+
sysType= "bool";
|
273
|
+
break;
|
274
|
+
case "image":
|
275
|
+
case "binary":
|
276
|
+
case "varbinary":
|
277
|
+
case "timestamp":
|
278
|
+
sysType= "byte[]";
|
279
|
+
break;
|
280
|
+
}
|
281
|
+
return sysType;
|
282
|
+
}
|
283
|
+
|
284
|
+
DbType GetDbType(string sqlType){
|
285
|
+
switch(sqlType)
|
286
|
+
{
|
287
|
+
case "varchar":
|
288
|
+
return DbType.AnsiString;
|
289
|
+
case "nvarchar":
|
290
|
+
return DbType.String;
|
291
|
+
case "int":
|
292
|
+
return DbType.Int32;
|
293
|
+
case "uniqueidentifier":
|
294
|
+
return DbType.Guid;
|
295
|
+
case "datetime":
|
296
|
+
return DbType.DateTime;
|
297
|
+
case "bigint":
|
298
|
+
return DbType.Int64;
|
299
|
+
case "binary":
|
300
|
+
return DbType.Binary;
|
301
|
+
case "bit":
|
302
|
+
return DbType.Boolean;
|
303
|
+
case "char":
|
304
|
+
return DbType.AnsiStringFixedLength;
|
305
|
+
case "decimal":
|
306
|
+
return DbType.Decimal;
|
307
|
+
case "float":
|
308
|
+
return DbType.Double;
|
309
|
+
case "image":
|
310
|
+
return DbType.Binary;
|
311
|
+
case "money":
|
312
|
+
return DbType.Currency;
|
313
|
+
case "nchar":
|
314
|
+
return DbType.String;
|
315
|
+
case "ntext":
|
316
|
+
return DbType.String;
|
317
|
+
case "numeric":
|
318
|
+
return DbType.Decimal;
|
319
|
+
case "real":
|
320
|
+
return DbType.Single;
|
321
|
+
case "smalldatetime":
|
322
|
+
return DbType.DateTime;
|
323
|
+
case "smallint":
|
324
|
+
return DbType.Int16;
|
325
|
+
case "smallmoney":
|
326
|
+
return DbType.Currency;
|
327
|
+
case "sql_variant":
|
328
|
+
return DbType.String;
|
329
|
+
case "sysname":
|
330
|
+
return DbType.String;
|
331
|
+
case "text":
|
332
|
+
return DbType.AnsiString;
|
333
|
+
case "timestamp":
|
334
|
+
return DbType.Binary;
|
335
|
+
case "tinyint":
|
336
|
+
return DbType.Byte;
|
337
|
+
case "varbinary":
|
338
|
+
return DbType.Binary;
|
339
|
+
case "xml":
|
340
|
+
return DbType.Xml;
|
341
|
+
default:
|
342
|
+
return DbType.AnsiString;
|
343
|
+
}
|
344
|
+
|
345
|
+
}
|
346
|
+
|
347
|
+
#>
|