主流資料庫欄位型別轉.Net型別的方法
最近在閱讀一些開源的程式碼,發現其中有些方法總結的很全面,至少在我做同樣的事情時候,需要抓破腦袋想活著google,現在看到了這個關於主流資料庫欄位型別轉.Net型別的方法,故收藏之,也順便分享給那些能看到這篇文章的同學。具體程式碼如下 :
/// <summary>
/// Default IDataType implementation (see IDataType for details)
/// </summary>
public class DataType : IDataType
{
public virtual string SqlType { get; set; }
public virtual string ManagedType { get; set; }
public virtual bool Nullable { get; set; }
public virtual long? Length { get; set; }
public virtual int? Precision { get; set; }
public virtual int? Scale { get; set; }
public virtual bool? Unsigned { get; set; }
public string FullType { get; set; }
}
protected virtual Type MapDbType(string columnName, IDataType dataType)
{
if (dataType == null)
throw new ArgumentNullException("dataType");
if (dataType.ManagedType != null)
return Type.GetType(dataType.ManagedType, true);
string dataTypeL = dataType.SqlType.ToLowerInvariant();
if (columnName != null && columnName.ToLower().Contains("guid"))
{
bool correctTypeAndLen =
((dataTypeL == "char" || dataTypeL == "varchar") && dataType.Length == 36)
|| ((dataTypeL == "binary") && dataType.Length == 16);
if (correctTypeAndLen)
{
Console.WriteLine("experimental support for guid--");
return typeof(Guid);
}
}
switch (dataTypeL)
{
// string
case "c":
case "char":
case "character":
case "character varying":
case "inet":
case "long":
case "longtext":
case "long varchar":
case "mediumtext":
case "nchar":
case "ntext":
case "nvarchar":
case "nvarchar2":
case "string":
case "text":
case "varchar":
case "varchar2":
case "clob": // oracle type
case "nclob": // oracle type
case "rowid": // oracle type
case "urowid": // oracle type
case "tinytext": // mysql type
return typeof(String);
// bool
case "bit":
case "bool":
case "boolean":
return typeof(Boolean);
// int8
case "tinyint":
if (dataType.Length == 1)
return typeof(Boolean);
// tinyint is supposed to be signed
// but we can have explicit sign
if (dataType.Unsigned ?? false)
return typeof(Byte);
// default case, unsigned
return typeof(SByte);
// int16
case "short":
case "smallint":
if (dataType.Unsigned ?? false)
return typeof(UInt16);
return typeof(Int16);
// int32
case "int":
case "integer":
case "mediumint":
if (dataType.Unsigned ?? false)
return typeof(UInt32);
return typeof(Int32);
// int64
case "bigint":
return typeof(Int64);
// single
case "float":
case "float4":
case "real":
case "binary_float": // oracle type
case "unsigned float": // mysql type
case "float unsigned": // mysql type
return typeof(Single);
// double
case "double":
case "double precision":
case "binary_double": // oracle type
case "unsigned double":// mysql type
case "double unsigned":// mysql type
return typeof(Double);
// decimal
case "decimal":
case "money":
case "numeric":
return typeof(Decimal);
case "number": // special oracle type
if (dataType.Precision.HasValue && (dataType.Scale ?? 0) == 0)
{
if (dataType.Precision.Value == 1)
return typeof(Boolean);
if (dataType.Precision.Value <= 4)
return typeof(Int16);
if (dataType.Precision.Value <= 9)
return typeof(Int32);
if (dataType.Precision.Value <= 19)
return typeof(Int64);
}
return typeof(Decimal);
// time interval
case "interval":
return typeof(TimeSpan);
//enum
case "enum":
case "set":
return MapEnumDbType(dataType);
// date
case "date":
case "datetime":
case "ingresdate":
case "timestamp":
case "timestamp without time zone":
case "timestamp with time zone":
case "time":
case "time without time zone": //reported by twain_bu...@msn.com,
case "time with time zone":
return typeof(DateTime);
// byte[]
case "binary":
case "blob":
case "bytea":
case "byte varying":
case "image":
case "longblob":
case "long byte":
case "oid":
case "sytea":
case "mediumblob":
case "tinyblob":
case "raw": // oracle type
case "long raw": // oracle type
case "varbinary":
return typeof(Byte[]);
// PostgreSQL, for example has an uuid type that can be mapped as a Guid
case "uuid":
return typeof(Guid);
case "void":
return null;
// if we fall to this case, we must handle the type
default:
throw new ArgumentException(
string.Format("Don't know how to convert the SQL type '{0}' into a managed type.", dataTypeL),
"dataType");
}
}
相關文章
- 保留兩位小數:資料庫欄位型別NUMBER,Java欄位型別Double型別資料庫型別Java
- 修改欄位資料型別的方法資料型別
- 【轉】修改表的欄位資料型別的方法資料型別
- 轉載:Oracle常用的資料庫欄位型別Oracle資料庫型別
- Java資料型別與資料庫欄位型別對應關係Java資料型別資料庫
- 資料欄位型別匹配型別
- MSSQL資料庫的欄位型別總結SQL資料庫型別
- oracle 修改欄位型別的方法Oracle型別
- 資料庫中欄位資料型別以及約束資料庫資料型別
- oracle的欄位型別Oracle型別
- 【mongo】mongo 欄位型別互轉Go型別
- [轉]MySQL 欄位型別參考MySql型別
- PHP 操作 mysql blob 資料型別的欄位PHPMySql資料型別
- 修復identity 型別欄位資料的跳躍(轉)IDE型別
- 欄位的資料型別隱式轉換有關係資料型別
- JS中其他資料型別轉為number資料型別的方法JS資料型別
- 資料型別,型別轉換資料型別
- 支援 enum 型別的欄位允許為空插入資料庫型別資料庫
- 修改表的欄位型別型別
- WHRER條件裡的資料型別必須和欄位資料型別一致資料型別
- MongoDB更改欄位型別MongoDB型別
- yii2 從資料庫獲取內容值型別與資料庫欄位型別問題解決資料庫型別
- SqlSugar code first 欄位為列舉型別,預設生成資料庫欄位為bigint如何設定為int型別SqlSugar型別資料庫
- 為什麼資料庫表的int型別欄位對映到實體類中要使用Integer型別,而不是int型別?...資料庫型別
- MongoDB中的欄位型別IdMongoDB型別
- Java資料型別及型別轉換Java資料型別
- MySQL欄位型別最全解析MySql型別
- date、timestamp欄位型別型別
- MySQL欄位型別小記MySql型別
- sqlite sql 修改欄位型別SQLite型別
- Oracle-不刪表資料,修改欄位型別Oracle型別
- 3. php資料型別、資料型別轉換PHP資料型別
- Mysql資料庫學習(二):資料型別(數值型別 日期和時間型別 字串型別)MySql資料庫資料型別字串
- sqlserver查詢一個庫所有表的欄位名及欄位型別SQLServer型別
- MySQL事務資料庫(InnoDB型別)的安裝方法(轉)MySql資料庫型別
- 物件型介面 / 定製操作型別和欄位物件型別
- [提問交流]建立模型,新增屬性,欄位型別如何設定2位小數的欄位型別模型型別
- 欄位型別檢測指令碼型別指令碼