subsonic 3.0.0.4

Sign up to get free protection for your applications and to get access to all the features.
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
+ #>