private void GetSchemaRowType (TdsColumnType ctype, int csize,
short precision, short scale,
out int dbType, out Type fieldType,
out bool isLong, out string typeName)
{
dbType = -1;
typeName = string.Empty;
isLong = false;
fieldType = typeof (Type);
switch (ctype) {
case TdsColumnType.Int1:
case TdsColumnType.Int2:
case TdsColumnType.Int4:
case TdsColumnType.IntN:
case TdsColumnType.BigInt:
switch (csize) {
case 1:
typeName = "tinyint";
dbType = (int) SqlDbType.TinyInt;
fieldType = typeof (byte);
isLong = false;
break;
case 2:
typeName = "smallint";
dbType = (int) SqlDbType.SmallInt;
fieldType = typeof (short);
isLong = false;
break;
case 4:
typeName = "int";
dbType = (int) SqlDbType.Int;
fieldType = typeof (int);
isLong = false;
break;
case 8:
typeName = "bigint";
dbType = (int) SqlDbType.BigInt;
fieldType = typeof (long);
isLong = false;
break;
}
break;
case TdsColumnType.Real:
case TdsColumnType.Float8:
case TdsColumnType.FloatN:
switch (csize) {
case 4:
typeName = "real";
dbType = (int) SqlDbType.Real;
fieldType = typeof (float);
isLong = false;
break;
case 8:
typeName = "float";
dbType = (int) SqlDbType.Float;
fieldType = typeof (double);
isLong = false;
break;
}
break;
case TdsColumnType.Image :
typeName = "image";
dbType = (int) SqlDbType.Image;
fieldType = typeof (byte[]);
isLong = true;
break;
case TdsColumnType.Text :
typeName = "text";
dbType = (int) SqlDbType.Text;
fieldType = typeof (string);
isLong = true;
break;
case TdsColumnType.UniqueIdentifier :
typeName = "uniqueidentifier";
dbType = (int) SqlDbType.UniqueIdentifier;
fieldType = typeof (Guid);
isLong = false;
break;
case TdsColumnType.VarBinary :
case TdsColumnType.BigVarBinary :
typeName = "varbinary";
dbType = (int) SqlDbType.VarBinary;
fieldType = typeof (byte[]);
isLong = false;
break;
case TdsColumnType.VarChar :
case TdsColumnType.BigVarChar :
typeName = "varchar";
dbType = (int) SqlDbType.VarChar;
fieldType = typeof (string);
isLong = false;
break;
case TdsColumnType.Binary :
case TdsColumnType.BigBinary :
typeName = "binary";
dbType = (int) SqlDbType.Binary;
fieldType = typeof (byte[]);
isLong = false;
break;
case TdsColumnType.Char :
case TdsColumnType.BigChar :
typeName = "char";
dbType = (int) SqlDbType.Char;
fieldType = typeof (string);
isLong = false;
break;
case TdsColumnType.Bit :
case TdsColumnType.BitN :
typeName = "bit";
dbType = (int) SqlDbType.Bit;
fieldType = typeof (bool);
isLong = false;
break;
case TdsColumnType.DateTime4 :
case TdsColumnType.DateTime :
case TdsColumnType.DateTimeN :
switch (csize) {
case 4:
typeName = "smalldatetime";
dbType = (int) SqlDbType.SmallDateTime;
fieldType = typeof (DateTime);
isLong = false;
break;
case 8:
typeName = "datetime";
dbType = (int) SqlDbType.DateTime;
fieldType = typeof (DateTime);
isLong = false;
break;
}
break;
case TdsColumnType.Money :
case TdsColumnType.MoneyN :
case TdsColumnType.Money4 :
switch (csize) {
case 4:
typeName = "smallmoney";
dbType = (int) SqlDbType.SmallMoney;
fieldType = typeof (decimal);
isLong = false;
break;
case 8:
typeName = "money";
dbType = (int) SqlDbType.Money;
fieldType = typeof (decimal);
isLong = false;
break;
}
break;
case TdsColumnType.NText :
typeName = "ntext";
dbType = (int) SqlDbType.NText;
fieldType = typeof (string);
isLong = true;
break;
case TdsColumnType.NVarChar :
typeName = "nvarchar";
dbType = (int) SqlDbType.NVarChar;
fieldType = typeof (string);
isLong = false;
break;
case TdsColumnType.Decimal :
case TdsColumnType.Numeric :
// TDS 7.0 returns bigint as decimal(19,0)
if (precision == 19 && scale == 0) {
typeName = "bigint";
dbType = (int) SqlDbType.BigInt;
fieldType = typeof (long);
} else {
typeName = "decimal";
dbType = (int) SqlDbType.Decimal;
fieldType = typeof (decimal);
}
isLong = false;
break;
case TdsColumnType.NChar :
typeName = "nchar";
dbType = (int) SqlDbType.NChar;
fieldType = typeof (string);
isLong = false;
break;
case TdsColumnType.SmallMoney :
typeName = "smallmoney";
dbType = (int) SqlDbType.SmallMoney;
fieldType = typeof (decimal);
isLong = false;
break;
default :
typeName = "variant";
dbType = (int) SqlDbType.Variant;
fieldType = typeof (object);
isLong = false;
break;
}
}