| 0 | 1 <# | 
|  | 2 	ConnectionType = "Sybase.Data.AseClient.AseConnection, Sybase.AdoNet2.AseClient"; | 
|  | 3 #><#+ | 
|  | 4 | 
|  | 5 bool GenerateSybaseSystemTables = false; | 
|  | 6 | 
|  | 7 private void LoadServerMetadata() | 
|  | 8 { | 
|  | 9 	var tables  = CreateList(new { ID = 0, Table  = new Table()  }); | 
|  | 10 	var columns = CreateList(new { ID = 0, Column = new Column() }); | 
|  | 11 | 
|  | 12 	using (var conn = GetConnection()) | 
|  | 13 	using (var cmd  = conn.CreateCommand()) | 
|  | 14 	{ | 
|  | 15 		// Load tables & vies. | 
|  | 16 		// | 
|  | 17 		cmd.CommandText = @" | 
|  | 18 			SELECT | 
|  | 19 				id, | 
|  | 20 				USER_NAME(uid), | 
|  | 21 				name, | 
|  | 22 				type | 
|  | 23 			FROM | 
|  | 24 				sysobjects | 
|  | 25 			WHERE | 
|  | 26 				type IN ('U','V')"; | 
|  | 27 | 
|  | 28 		using (var rd = cmd.ExecuteReader()) | 
|  | 29 		{ | 
|  | 30 			while (rd.Read()) | 
|  | 31 			{ | 
|  | 32 				var t = new | 
|  | 33 				{ | 
|  | 34 					ID    = Convert.ToInt32(rd[0]), | 
|  | 35 					Table = new Table | 
|  | 36 					{ | 
|  | 37 						Owner         = rd[1].ToString(), | 
|  | 38 						TableName     = rd[2].ToString(), | 
|  | 39 						ClassName     = rd[2].ToString(), | 
|  | 40 						IsView        = rd[3].ToString()[0] == 'V', | 
|  | 41 						BaseClassName = BaseEntityClass, | 
|  | 42 					} | 
|  | 43 				}; | 
|  | 44 | 
|  | 45 				tables.Add(t); | 
|  | 46 			} | 
|  | 47 		} | 
|  | 48 | 
|  | 49 		// Load columns. | 
|  | 50 		// | 
|  | 51 		cmd.CommandText = @" | 
|  | 52 			SELECT | 
|  | 53 				o.id, | 
|  | 54 				c.colid, | 
|  | 55 				c.name, | 
|  | 56 				c.status, | 
|  | 57 				c.usertype, | 
|  | 58 				t.type, | 
|  | 59 				c.length, | 
|  | 60 				c.prec, | 
|  | 61 				c.scale, | 
|  | 62 				t.name as typename, | 
|  | 63 				Convert(bit, c.status & 0x08) isNullable, | 
|  | 64 				Convert(bit, c.status & 0x80) isIdentity | 
|  | 65 			FROM | 
|  | 66 				syscolumns c | 
|  | 67 					JOIN sysobjects o ON c.id       = o.id | 
|  | 68 					JOIN systypes   t ON c.usertype = t.usertype | 
|  | 69 			WHERE | 
|  | 70 				o.type IN ('U','V')"; | 
|  | 71 | 
|  | 72 		using (var rd = cmd.ExecuteReader()) | 
|  | 73 		{ | 
|  | 74 			while (rd.Read()) | 
|  | 75 			{ | 
|  | 76 				var col = new | 
|  | 77 				{ | 
|  | 78 					ID     = Convert.ToInt32(rd["id"]), | 
|  | 79 					Column = new Column | 
|  | 80 					{ | 
|  | 81 						ID         = Convert.ToInt16  (rd["colid"]), | 
|  | 82 						ColumnName = Convert.ToString (rd["name"]), | 
|  | 83 						MemberName = Convert.ToString (rd["name"]), | 
|  | 84 						ColumnType = Convert.ToString (rd["typename"]), | 
|  | 85 						IsNullable = Convert.ToBoolean(rd["isNullable"]), | 
|  | 86 						IsIdentity = Convert.ToBoolean(rd["isIdentity"]), | 
|  | 87 						Length     = rd.IsDBNull(rd.GetOrdinal("length")) ? 0 : Convert.ToInt64(rd["length"]), | 
|  | 88 						Precision  = rd.IsDBNull(rd.GetOrdinal("prec"))   ? 0 : Convert.ToInt32(rd["prec"]), | 
|  | 89 						Scale      = rd.IsDBNull(rd.GetOrdinal("scale"))  ? 0 : Convert.ToInt32(rd["scale"]), | 
|  | 90 					} | 
|  | 91 				}; | 
|  | 92 | 
|  | 93 				var c = col.Column; | 
|  | 94 | 
|  | 95 				switch (Convert.ToInt32(rd["type"])) | 
|  | 96 				{ | 
|  | 97 					case  34 /* image         */ : c.Type = "byte[]";   c.DbType = DbType.Binary;    c.SqlDbType = SqlDbType.Image;         break; | 
|  | 98 					case  35 /* text          */ : c.Type = "string";   c.DbType = DbType.String;    c.SqlDbType = SqlDbType.Text;          break; | 
|  | 99 					case  45 /* binary        */ : c.Type = "byte[]";   c.DbType = DbType.Binary;    c.SqlDbType = SqlDbType.Binary;        break; | 
|  | 100 					case  48 /* tinyint       */ : c.Type = "byte";     c.DbType = DbType.Byte;      c.SqlDbType = SqlDbType.TinyInt;       break; | 
|  | 101 					case  49 /* date          */ : c.Type = "DateTime"; c.DbType = DbType.Date;      c.SqlDbType = SqlDbType.Date;          break; | 
|  | 102 					case  50 /* bit           */ : c.Type = "bool";     c.DbType = DbType.Boolean;   c.SqlDbType = SqlDbType.Bit;           break; | 
|  | 103 					case  51 /* time          */ : c.Type = "DateTime"; c.DbType = DbType.Time;      c.SqlDbType = SqlDbType.Time;          break; | 
|  | 104 					case  52 /* smallint      */ : c.Type = "short";    c.DbType = DbType.Int16;     c.SqlDbType = SqlDbType.SmallInt;      break; | 
|  | 105 					case  55 /* decimal       */ : c.Type = "decimal";  c.DbType = DbType.Decimal;   c.SqlDbType = SqlDbType.Decimal;       break; | 
|  | 106 					case  56 /* int           */ : c.Type = "int";      c.DbType = DbType.Int32;     c.SqlDbType = SqlDbType.Int;           break; | 
|  | 107 					case  58 /* smalldatetime */ : c.Type = "DateTime"; c.DbType = DbType.DateTime;  c.SqlDbType = SqlDbType.SmallDateTime; break; | 
|  | 108 					case  59 /* real          */ : c.Type = "float";    c.DbType = DbType.Single;    c.SqlDbType = SqlDbType.Real;          break; | 
|  | 109 					case  60 /* money         */ : c.Type = "decimal";  c.DbType = DbType.Currency;  c.SqlDbType = SqlDbType.Money;         break; | 
|  | 110 					case  61 /* datetime      */ : c.Type = "DateTime"; c.DbType = DbType.DateTime;  c.SqlDbType = SqlDbType.DateTime;      break; | 
|  | 111 					case  62 /* float         */ : c.Type = "double";   c.DbType = DbType.Double;    c.SqlDbType = SqlDbType.Float;         break; | 
|  | 112 					case  63 /* numeric       */ : c.Type = "decimal";  c.DbType = DbType.Decimal;   c.SqlDbType = SqlDbType.Decimal;       break; | 
|  | 113 					case  65 /* usmallint     */ : c.Type = "ushort";   c.DbType = DbType.UInt16;    c.SqlDbType = SqlDbType.SmallInt;      break; | 
|  | 114 					case  66 /* uint          */ : c.Type = "uint";     c.DbType = DbType.UInt32;    c.SqlDbType = SqlDbType.Int;           break; | 
|  | 115 					case  67 /* ubigint       */ : c.Type = "ulong";    c.DbType = DbType.UInt64;    c.SqlDbType = SqlDbType.BigInt;        break; | 
|  | 116 					case 122 /* smallmoney    */ : c.Type = "decimal";  c.DbType = DbType.Currency;  c.SqlDbType = SqlDbType.SmallMoney;    break; | 
|  | 117 					case 174 /* unitext       */ : c.Type = "string";   c.DbType = DbType.String;    c.SqlDbType = SqlDbType.NText;         break; | 
|  | 118 					case 189 /* bigdatetime   */ : c.Type = "DateTime"; c.DbType = DbType.DateTime2; c.SqlDbType = SqlDbType.DateTime2;     break; | 
|  | 119 					case 190 /* bigtime       */ : c.Type = "DateTime"; c.DbType = DbType.DateTime2; c.SqlDbType = SqlDbType.DateTime2;     break; | 
|  | 120 					case 191 /* bigint        */ : c.Type = "long";     c.DbType = DbType.Int64;     c.SqlDbType = SqlDbType.BigInt;        break; | 
|  | 121 | 
|  | 122 					case  37 /* varbinary     */ | 
|  | 123 					         /* timestamp     */ : | 
|  | 124 						c.Type      = "byte[]"; | 
|  | 125 						c.DbType    = DbType.Binary; | 
|  | 126 						c.SqlDbType = Convert.ToString(rd["typename"]) == "timestamp" ? SqlDbType.Timestamp : SqlDbType.VarBinary; | 
|  | 127 						break; | 
|  | 128 | 
|  | 129 					case  39 /* sysname       */ | 
|  | 130 					         /* longsysname   */ | 
|  | 131 					         /* varchar       */ | 
|  | 132 					         /* nvarchar      */ : | 
|  | 133 | 
|  | 134 						c.Type = "string"; | 
|  | 135 | 
|  | 136 						if (Convert.ToString(rd["typename"]) == "nvarchar") | 
|  | 137 						{ | 
|  | 138 							c.DbType    = DbType.String; | 
|  | 139 							c.SqlDbType = SqlDbType.NVarChar; | 
|  | 140 						} | 
|  | 141 						else | 
|  | 142 						{ | 
|  | 143 							c.DbType    = DbType.AnsiString; | 
|  | 144 							c.SqlDbType = SqlDbType.VarChar; | 
|  | 145 						} | 
|  | 146 | 
|  | 147 						break; | 
|  | 148 | 
|  | 149 					case  47 /* char          */ | 
|  | 150 					         /* nchar         */ : | 
|  | 151 | 
|  | 152 						c.Type      = Convert.ToInt32 (rd["length"])   == 1      ? "char" : "string"; | 
|  | 153 						c.DbType    = Convert.ToString(rd["typename"]) == "char" ? DbType.AnsiStringFixedLength : DbType.StringFixedLength; | 
|  | 154 						c.SqlDbType = Convert.ToString(rd["typename"]) == "char" ? SqlDbType.Char : SqlDbType.NChar; | 
|  | 155 						break; | 
|  | 156 | 
|  | 157 					case 135 /* unichar       */ : | 
|  | 158 						c.Type      = Convert.ToInt32 (rd["length"]) == 1 ? "char" : "string"; | 
|  | 159 						c.DbType    = DbType.StringFixedLength; | 
|  | 160 						c.SqlDbType = SqlDbType.NChar; | 
|  | 161 						break; | 
|  | 162 | 
|  | 163 					case 155 /* univarchar    */ : | 
|  | 164 						c.Type      = Convert.ToInt32 (rd["length"]) == 1 ? "char" : "string"; | 
|  | 165 						c.DbType    = DbType.String; | 
|  | 166 						c.SqlDbType = SqlDbType.NVarChar; | 
|  | 167 						break; | 
|  | 168 | 
|  | 169 					case  36 /* extended type */ : | 
|  | 170 					case  38 /* intn          */ : | 
|  | 171 					case  68 /* uintn         */ : | 
|  | 172 					case 106 /* decimaln      */ : | 
|  | 173 					case 108 /* numericn      */ : | 
|  | 174 					case 109 /* floatn        */ : | 
|  | 175 					case 110 /* moneyn        */ : | 
|  | 176 					case 111 /* datetimn      */ : | 
|  | 177 					case 123 /* daten         */ : | 
|  | 178 					case 147 /* timen         */ : | 
|  | 179 					case 187 /* bigdatetimen  */ : | 
|  | 180 					case 188 /* bigtimen      */ : c.Type = "byte[]";   c.DbType = DbType.Binary;    c.SqlDbType = SqlDbType.Binary;        break; | 
|  | 181 				} | 
|  | 182 | 
|  | 183 				switch (c.Type) | 
|  | 184 				{ | 
|  | 185 					case "string" : | 
|  | 186 					case "byte[]" : c.IsClass = true; break; | 
|  | 187 				} | 
|  | 188 | 
|  | 189 				if (c.IsNullable && !c.IsClass) | 
|  | 190 					c.Type += "?"; | 
|  | 191 | 
|  | 192 				columns.Add(col); | 
|  | 193 			} | 
|  | 194 		} | 
|  | 195 | 
|  | 196 		// Load PKs. | 
|  | 197 		// | 
|  | 198 		cmd.CommandText = @" | 
|  | 199 			SELECT | 
|  | 200 				i.id, | 
|  | 201 				i.name, | 
|  | 202 				INDEX_COL(USER_NAME(o.uid) + '.' + o.name, i.indid, c.colid) AS colname, | 
|  | 203 				INDEX_COLORDER(USER_NAME(o.uid) + '.' + o.name, i.indid, c.colid) AS [order], | 
|  | 204 				c.colid | 
|  | 205 			FROM | 
|  | 206 				sysindexes i | 
|  | 207 					JOIN sysobjects o ON i.id = o.id | 
|  | 208 					JOIN syscolumns c ON i.id = c.id | 
|  | 209 			WHERE | 
|  | 210 				i.status2 & 2 = 2 AND | 
|  | 211 				i.status & 2048 = 2048 AND | 
|  | 212 				i.indid > 0 AND | 
|  | 213 				c.colid < i.keycnt + CASE WHEN i.indid = 1 THEN 1 ELSE 0 END"; | 
|  | 214 | 
|  | 215 		using (var rd = cmd.ExecuteReader()) | 
|  | 216 		{ | 
|  | 217 			while (rd.Read()) | 
|  | 218 			{ | 
|  | 219 				var id      = Convert.ToInt32 (rd["id"]); | 
|  | 220 				var colid   = Convert.ToInt32 (rd["colid"]); | 
|  | 221 				var colname = Convert.ToString(rd["colname"]); | 
|  | 222 | 
|  | 223 				columns.Single(_ => _.ID == id && _.Column.ColumnName == colname).Column.PKIndex = colid; | 
|  | 224 			} | 
|  | 225 		} | 
|  | 226 | 
|  | 227 		// Load FKs. | 
|  | 228 		// | 
|  | 229 		cmd.CommandText = @" | 
|  | 230 			SELECT | 
|  | 231 				o.name     as Name, | 
|  | 232 				c.tableid  as ThisTable, | 
|  | 233 				r.reftabid as OtherTable, | 
|  | 234 				COL_NAME(c.tableid, r.fokey1) as ThisColumn1, | 
|  | 235 				COL_NAME(c.tableid, r.fokey2) as ThisColumn2, | 
|  | 236 				COL_NAME(c.tableid, r.fokey3) as ThisColumn3, | 
|  | 237 				COL_NAME(c.tableid, r.fokey4) as ThisColumn4, | 
|  | 238 				COL_NAME(c.tableid, r.fokey5) as ThisColumn5, | 
|  | 239 				COL_NAME(c.tableid, r.fokey6) as ThisColumn6, | 
|  | 240 				COL_NAME(c.tableid, r.fokey7) as ThisColumn7, | 
|  | 241 				COL_NAME(c.tableid, r.fokey8) as ThisColumn8, | 
|  | 242 				COL_NAME(c.tableid, r.fokey9) as ThisColumn9, | 
|  | 243 				COL_NAME(c.tableid, r.fokey10) as ThisColumn10, | 
|  | 244 				COL_NAME(c.tableid, r.fokey11) as ThisColumn11, | 
|  | 245 				COL_NAME(c.tableid, r.fokey12) as ThisColumn12, | 
|  | 246 				COL_NAME(c.tableid, r.fokey13) as ThisColumn13, | 
|  | 247 				COL_NAME(c.tableid, r.fokey14) as ThisColumn14, | 
|  | 248 				COL_NAME(c.tableid, r.fokey15) as ThisColumn15, | 
|  | 249 				COL_NAME(c.tableid, r.fokey16) as ThisColumn16, | 
|  | 250 				COL_NAME(r.reftabid, r.refkey1) as OtherColumn1, | 
|  | 251 				COL_NAME(r.reftabid, r.refkey2) as OtherColumn2, | 
|  | 252 				COL_NAME(r.reftabid, r.refkey3) as OtherColumn3, | 
|  | 253 				COL_NAME(r.reftabid, r.refkey4) as OtherColumn4, | 
|  | 254 				COL_NAME(r.reftabid, r.refkey5) as OtherColumn5, | 
|  | 255 				COL_NAME(r.reftabid, r.refkey6) as OtherColumn6, | 
|  | 256 				COL_NAME(r.reftabid, r.refkey7) as OtherColumn7, | 
|  | 257 				COL_NAME(r.reftabid, r.refkey8) as OtherColumn8, | 
|  | 258 				COL_NAME(r.reftabid, r.refkey9) as OtherColumn9, | 
|  | 259 				COL_NAME(r.reftabid, r.refkey10) as OtherColumn10, | 
|  | 260 				COL_NAME(r.reftabid, r.refkey11) as OtherColumn11, | 
|  | 261 				COL_NAME(r.reftabid, r.refkey12) as OtherColumn12, | 
|  | 262 				COL_NAME(r.reftabid, r.refkey13) as OtherColumn13, | 
|  | 263 				COL_NAME(r.reftabid, r.refkey14) as OtherColumn14, | 
|  | 264 				COL_NAME(r.reftabid, r.refkey15) as OtherColumn15, | 
|  | 265 				COL_NAME(r.reftabid, r.refkey16) as OtherColumn16 | 
|  | 266 			FROM | 
|  | 267 				sysreferences r | 
|  | 268 					JOIN sysconstraints c ON r.constrid = c.constrid | 
|  | 269 						JOIN sysobjects o  ON c.constrid = o.id | 
|  | 270 						JOIN sysobjects o3 ON c.tableid  = o3.id | 
|  | 271 					LEFT JOIN sysobjects o2 ON r.reftabid = o2.id | 
|  | 272 					JOIN sysreferences r2 ON r.constrid = r2.constrid | 
|  | 273 						LEFT JOIN sysindexes i ON r2.indexid = i.indid AND r2.reftabid = i.id | 
|  | 274 			WHERE | 
|  | 275 				c.status = 64"; | 
|  | 276 | 
|  | 277 		using (var rd = cmd.ExecuteReader()) | 
|  | 278 		{ | 
|  | 279 			while (rd.Read()) | 
|  | 280 			{ | 
|  | 281 				var name            = Convert.ToString(rd["Name"]); | 
|  | 282 				var thisTableID     = Convert.ToInt32 (rd["ThisTable"]); | 
|  | 283 				var otherTableID    = Convert.ToInt32 (rd["OtherTable"]); | 
|  | 284 | 
|  | 285 				var thisTable   = (from t in tables  where t.ID == thisTableID  select t.Table).Single(); | 
|  | 286 				var otherTable  = (from t in tables  where t.ID == otherTableID select t.Table).Single(); | 
|  | 287 | 
|  | 288 				thisTable.ForeignKeys.Add(name, new ForeignKey { KeyName = name, MemberName = name, OtherTable = otherTable }); | 
|  | 289 | 
|  | 290 				for (int i = 1; i <= 16; i++) | 
|  | 291 				{ | 
|  | 292 					if (rd.IsDBNull(rd.GetOrdinal("ThisColumn"  + i))) | 
|  | 293 						break; | 
|  | 294 | 
|  | 295 					var thisColumnName  = Convert.ToString(rd["ThisColumn"  + i]); | 
|  | 296 					var otherColumnName = Convert.ToString(rd["OtherColumn" + i]); | 
|  | 297 | 
|  | 298 					var thisColumn  = (from c in columns where c.ID == thisTableID  && c.Column.ColumnName == thisColumnName  select c.Column).Single(); | 
|  | 299 					var otherColumn = (from c in columns where c.ID == otherTableID && c.Column.ColumnName == otherColumnName select c.Column).Single(); | 
|  | 300 | 
|  | 301 					var key = thisTable.ForeignKeys[name]; | 
|  | 302 | 
|  | 303 					key.ThisColumns. Add(thisColumn); | 
|  | 304 					key.OtherColumns.Add(otherColumn); | 
|  | 305 				} | 
|  | 306 			} | 
|  | 307 		} | 
|  | 308 	} | 
|  | 309 | 
|  | 310 	var qc = | 
|  | 311 		from c in columns | 
|  | 312 		group c by c.ID into gr | 
|  | 313 		join t in tables on gr.Key equals t.ID | 
|  | 314 		select new { t.Table, gr }; | 
|  | 315 | 
|  | 316 	foreach (var c in qc) | 
|  | 317 	{ | 
|  | 318 		foreach (var col in from col in c.gr orderby col.Column.ID select col.Column) | 
|  | 319 			c.Table.Columns.Add(col.ColumnName, col); | 
|  | 320 | 
|  | 321 		if (c.Table.Owner == "dbo") | 
|  | 322 		{ | 
|  | 323 			c.Table.Owner = null; | 
|  | 324 			Tables.Add(c.Table.TableName, c.Table); | 
|  | 325 		} | 
|  | 326 		else | 
|  | 327 		{ | 
|  | 328 			Tables.Add(c.Table.Owner + "." + c.Table.TableName, c.Table); | 
|  | 329 		} | 
|  | 330 	} | 
|  | 331 | 
|  | 332 	if (GenerateSybaseSystemTables) | 
|  | 333 	{ | 
|  | 334 		Tables.Add("sysobjects", new Table | 
|  | 335 		{ | 
|  | 336 			TableName     = "sysobjects", | 
|  | 337 			ClassName     = "SysObject", | 
|  | 338 			BaseClassName = BaseEntityClass, | 
|  | 339 			Columns       = | 
|  | 340 			{ | 
|  | 341 				{ "name",      new VarCharColumn  { ColumnName = "name", Length = 255 }}, | 
|  | 342 				{ "id",        new IntColumn      { ColumnName = "id"  }}, | 
|  | 343 				{ "uid",       new IntColumn      { ColumnName = "uid" }}, | 
|  | 344 				{ "type",      new Column { | 
|  | 345 					ColumnName = "type", | 
|  | 346 					Type       = "string", | 
|  | 347 					ColumnType = "char", | 
|  | 348 					DbType     = DbType.AnsiStringFixedLength, | 
|  | 349 					SqlDbType  = SqlDbType.Char, | 
|  | 350 					Length     = 2, | 
|  | 351 				}}, | 
|  | 352 				{ "userstat",  new SmallIntColumn { ColumnName = "userstat"  }}, | 
|  | 353 				{ "sysstat",   new SmallIntColumn { ColumnName = "sysstat"   }}, | 
|  | 354 				{ "indexdel",  new SmallIntColumn { ColumnName = "indexdel"  }}, | 
|  | 355 				{ "schemacnt", new SmallIntColumn { ColumnName = "schemacnt" }}, | 
|  | 356 				{ "sysstat2",  new IntColumn      { ColumnName = "sysstat2"  }}, | 
|  | 357 				{ "crdate",    new DateTimeColumn { ColumnName = "crdate"    }}, | 
|  | 358 				{ "expdate",   new DateTimeColumn { ColumnName = "expdate"   }}, | 
|  | 359 				{ "deltrig",   new IntColumn      { ColumnName = "deltrig"   }}, | 
|  | 360 				{ "instrig",   new IntColumn      { ColumnName = "instrig"   }}, | 
|  | 361 				{ "updtrig",   new IntColumn      { ColumnName = "updtrig"   }}, | 
|  | 362 				{ "seltrig",   new IntColumn      { ColumnName = "seltrig"   }}, | 
|  | 363 				{ "ckfirst",   new IntColumn      { ColumnName = "ckfirst"   }}, | 
|  | 364 				{ "cache",     new SmallIntColumn { ColumnName = "cache"     }}, | 
|  | 365 				{ "audflags",  new IntColumn      { ColumnName = "audflags", IsNullable = true }}, | 
|  | 366 				{ "objspare",  new IntColumn      { ColumnName = "objspare"  }}, | 
|  | 367 				{ "versionts", new Column { | 
|  | 368 					ColumnName = "versionts", | 
|  | 369 					IsNullable = true, | 
|  | 370 					Type       = "byte[]", | 
|  | 371 					ColumnType = "binary", | 
|  | 372 					IsClass    = true, | 
|  | 373 					DbType     = DbType.Binary, | 
|  | 374 					SqlDbType  = SqlDbType.Binary, | 
|  | 375 					Length     = 6, | 
|  | 376 				}}, | 
|  | 377 				{ "loginame", new VarCharColumn   { ColumnName = "loginame", Length = 30 }}, | 
|  | 378 			} | 
|  | 379 		}); | 
|  | 380 | 
|  | 381 		int n = 1; | 
|  | 382 | 
|  | 383 		foreach (var col in Tables["sysobjects"].Columns) | 
|  | 384 		{ | 
|  | 385 			var c = col.Value; | 
|  | 386 | 
|  | 387 			c.ID         = n++; | 
|  | 388 			c.MemberName = c.ColumnName; | 
|  | 389 | 
|  | 390 			if (c.IsNullable && !c.IsClass) | 
|  | 391 				c.Type = c.Type + "?"; | 
|  | 392 		} | 
|  | 393 	} | 
|  | 394 } | 
|  | 395 | 
|  | 396 class VarCharColumn : Column | 
|  | 397 { | 
|  | 398 	public VarCharColumn() | 
|  | 399 	{ | 
|  | 400 		Type       = "string"; | 
|  | 401 		ColumnType = "varchar"; | 
|  | 402 		IsClass    = true; | 
|  | 403 		DbType     = DbType.AnsiString; | 
|  | 404 		SqlDbType  = SqlDbType.VarChar; | 
|  | 405 	} | 
|  | 406 } | 
|  | 407 | 
|  | 408 class IntColumn : Column | 
|  | 409 { | 
|  | 410 	public IntColumn() | 
|  | 411 	{ | 
|  | 412 		Type       = "int"; | 
|  | 413 		ColumnType = "int"; | 
|  | 414 		DbType     = DbType.Int32; | 
|  | 415 		SqlDbType  = SqlDbType.Int; | 
|  | 416 		Length     = 4; | 
|  | 417 	} | 
|  | 418 } | 
|  | 419 | 
|  | 420 class SmallIntColumn : Column | 
|  | 421 { | 
|  | 422 	public SmallIntColumn() | 
|  | 423 	{ | 
|  | 424 		Type       = "short"; | 
|  | 425 		ColumnType = "smallint"; | 
|  | 426 		DbType     = DbType.Int16; | 
|  | 427 		SqlDbType  = SqlDbType.SmallInt; | 
|  | 428 		Length     = 2; | 
|  | 429 	} | 
|  | 430 } | 
|  | 431 | 
|  | 432 class DateTimeColumn : Column | 
|  | 433 { | 
|  | 434 	public DateTimeColumn() | 
|  | 435 	{ | 
|  | 436 		Type       = "DateTime"; | 
|  | 437 		ColumnType = "datetime"; | 
|  | 438 		DbType     = DbType.DateTime; | 
|  | 439 		SqlDbType  = SqlDbType.DateTime; | 
|  | 440 		Length     = 8; | 
|  | 441 	} | 
|  | 442 } | 
|  | 443 | 
|  | 444 #> |