public string BuildType(SqlDataType type)
            {
                // workaround toolkit bug, when money generates with precision and scale, as Money(19,4)
                if (type.SqlDbType == SqlDbType.Money || type.SqlDbType == SqlDbType.SmallMoney)
                {
                    return(type.SqlDbType.ToString());
                }
                var sb = new StringBuilder();

                BuildDataType(sb, type);
                // fix incorrect length
                string result = sb.ToString();

                switch (type.SqlDbType)
                {
                case SqlDbType.NText:
                    return(result.Replace(String.Format("({0})", type.Length), ""));

                case SqlDbType.VarBinary:
                case SqlDbType.VarChar:
                case SqlDbType.NVarChar:
                    if (type.Length == SqlDataType.GetMaxLength(type.SqlDbType))
                    {
                        return(result.Replace(String.Format("({0})", type.Length), "(MAX)"));
                    }
                    break;
                }
                return(result);
            }
        static SqlDataType TypeSqlToDbsm(string typeName, int size, int decimalPrecision, int decimalScale)
        {
            switch (typeName.ToUpper(CultureInfo.CurrentCulture))
            {
            case "BIT":
                return(SqlDataType.DbBit);

            case "BIGINT":
                return(SqlDataType.DbBigInt);

            case "BINARY":
                return(new SqlDataType(SqlDbType.Binary, size));

            case "CHAR":
                return(new SqlDataType(SqlDbType.Char, size));

            case "CURSOR":
                return(SqlDataType.DbStructured);

            case "DATETIME":
                return(SqlDataType.DbDateTime);

            case "NUMERIC":
            case "DECIMAL":
                return(new SqlDataType(SqlDbType.Decimal, decimalPrecision, decimalScale));

            case "INT":
                return(SqlDataType.DbInt);

            case "IMAGE":
                return(new SqlDataType(SqlDbType.Image, size));

            case "FLOAT":
                return(SqlDataType.DbFloat);

            case "MONEY":
                return(new SqlDataType(SqlDbType.Money, decimalPrecision, decimalScale));

            case "NCHAR":
                return(new SqlDataType(SqlDbType.NChar, size));

            case "NVARCHAR":
                return(new SqlDataType(SqlDbType.NVarChar, size <= 0 ? SqlDataType.GetMaxLength(SqlDbType.NVarChar) : size));

            case "NTEXT":
                return(new SqlDataType(SqlDbType.NText));

            case "REAL":
                return(SqlDataType.DbReal);

            case "SMALLMONEY":
                return(new SqlDataType(SqlDbType.SmallMoney, decimalPrecision, decimalScale));

            case "SMALLDATETIME":
                return(SqlDataType.DbSmallDateTime);

            case "SMALLINT":
                return(SqlDataType.DbSmallInt);

            case "SQL_VARIANT":
                return(SqlDataType.DbVariant);

            case "TABLE":
                return(SqlDataType.DbStructured);

            case "TEXT":
                return(new SqlDataType(SqlDbType.Text, size));

            case "TIMESTAMP":
                return(SqlDataType.DbTimestamp);

            case "TINYINT":
                return(SqlDataType.DbTinyInt);

            case "UNIQUEIDENTIFIER":
                return(SqlDataType.Guid);

            case "VARBINARY":
                return(new SqlDataType(SqlDbType.VarBinary, size <= 0 ? SqlDataType.GetMaxLength(SqlDbType.VarBinary) : size));

            case "VARCHAR":
                return(new SqlDataType(SqlDbType.VarChar, size <= 0 ? SqlDataType.GetMaxLength(SqlDbType.VarChar) : size));

            case "XML":
                return(SqlDataType.DbXml);

            default:
                throw new ArgumentException("Unsupported data type for " + MssqlDriver.DriverName);
            }
        }