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.
Files changed (44) hide show
  1. data/lib/LICENSE.txt +41 -0
  2. data/lib/SubSonic.Core.dll +0 -0
  3. data/lib/T4 Templates/ActiveRecord/ActiveRecord.tt +620 -0
  4. data/lib/T4 Templates/ActiveRecord/Context.tt +295 -0
  5. data/lib/T4 Templates/ActiveRecord/SQLServer.ttinclude +347 -0
  6. data/lib/T4 Templates/ActiveRecord/Settings.ttinclude +552 -0
  7. data/lib/T4 Templates/ActiveRecord/StoredProcedures.tt +30 -0
  8. data/lib/T4 Templates/ActiveRecord/Structs.tt +67 -0
  9. data/lib/T4 Templates/LinqTemplates/Classes.tt +117 -0
  10. data/lib/T4 Templates/LinqTemplates/Context.tt +276 -0
  11. data/lib/T4 Templates/LinqTemplates/SQLServer.ttinclude +349 -0
  12. data/lib/T4 Templates/LinqTemplates/Settings.ttinclude +551 -0
  13. data/lib/T4 Templates/LinqTemplates/StoredProcedures.tt +30 -0
  14. data/lib/T4 Templates/LinqTemplates/Structs.tt +67 -0
  15. data/lib/T4 Templates/README.txt +7 -0
  16. data/lib/T4 Templates/SubSonic.TemplatesVB/ActiveRecord/ActiveRecord.tt +560 -0
  17. data/lib/T4 Templates/SubSonic.TemplatesVB/ActiveRecord/ActiveRecord.vb +6447 -0
  18. data/lib/T4 Templates/SubSonic.TemplatesVB/ActiveRecord/Context.tt +258 -0
  19. data/lib/T4 Templates/SubSonic.TemplatesVB/ActiveRecord/Context.vb +349 -0
  20. data/lib/T4 Templates/SubSonic.TemplatesVB/ActiveRecord/SQLServer.ttinclude +332 -0
  21. data/lib/T4 Templates/SubSonic.TemplatesVB/ActiveRecord/Settings.ttinclude +550 -0
  22. data/lib/T4 Templates/SubSonic.TemplatesVB/ActiveRecord/StoredProcedures.tt +30 -0
  23. data/lib/T4 Templates/SubSonic.TemplatesVB/ActiveRecord/StoredProcedures.vb +55 -0
  24. data/lib/T4 Templates/SubSonic.TemplatesVB/ActiveRecord/Structs.tt +57 -0
  25. data/lib/T4 Templates/SubSonic.TemplatesVB/ActiveRecord/Structs.vb +1478 -0
  26. data/lib/T4 Templates/SubSonic.TemplatesVB/ActiveRecord/Tests/FetchTests.vb +52 -0
  27. data/lib/T4 Templates/SubSonic.TemplatesVB/App.config +9 -0
  28. data/lib/T4 Templates/SubSonic.TemplatesVB/My Project/Application.Designer.vb +13 -0
  29. data/lib/T4 Templates/SubSonic.TemplatesVB/My Project/Application.myapp +10 -0
  30. data/lib/T4 Templates/SubSonic.TemplatesVB/My Project/AssemblyInfo.vb +35 -0
  31. data/lib/T4 Templates/SubSonic.TemplatesVB/My Project/Resources.Designer.vb +63 -0
  32. data/lib/T4 Templates/SubSonic.TemplatesVB/My Project/Resources.resx +117 -0
  33. data/lib/T4 Templates/SubSonic.TemplatesVB/My Project/Settings.Designer.vb +73 -0
  34. data/lib/T4 Templates/SubSonic.TemplatesVB/My Project/Settings.settings +7 -0
  35. data/lib/T4 Templates/SubSonic.TemplatesVB/SubSonic.TemplatesVB.vbproj +171 -0
  36. data/lib/T4 Templates/SubSonic.TemplatesVB/SubSonic.TemplatesVB.vbproj.user +5 -0
  37. data/lib/T4 Templates/TemplateProviders/MySQL.ttinclude +278 -0
  38. data/lib/T4 Templates/TemplateProviders/MySQL.ttinclude.orig +303 -0
  39. data/lib/T4 Templates/TemplateProviders/MySQLTest.tt +27 -0
  40. data/lib/T4 Templates/TemplateProviders/SQLite.ttinclude +194 -0
  41. data/lib/T4 Templates/TemplateProviders/SQLite.ttinclude.orig +236 -0
  42. data/lib/T4 Templates/TemplateProviders/SQLiteTest.tt +27 -0
  43. data/lib/T4 Templates/TemplateProviders/Settings.ttinclude +551 -0
  44. 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
+ #>