修改CodeSmith中的SchemaExplorer.MySQLSchemaProvider

修改C:\Program Files (x86)\CodeSmith\v6.5\Samples\Projects\CSharp\MySQLSchemaProvider\MySQLSchemaProvider.cs

修改GetCommandParameters方法,原本是没有实现的。一直报错误信息:GetCommandParameters() is not supported in this release.

        /// <summary>
        /// Gets the parameters for a given command.
        /// </summary>
        /// <param name="connectionString">The connection string used to connect to the target database.</param>
        /// <param name="command"></param>
        /// <returns></returns>
        public ParameterSchema[] GetCommandParameters( string connectionString, CommandSchema command )
        {
            // MySQL does not yet implement INFORMATION_SCHEMA.PARAMETERS
            // MySQL Connector/Net 1.0.7 is supposed to support DeriveParameters()
            // However, in my testing there appears to be a bug (throws a NULL reference exception)
            // This method will be unsupported until a subsequent release of DeriverParameters()
            // is working.

            // throw new NotSupportedException( "GetCommandParameters() is not supported in this release." );

            /*
            ArrayList a = new ArrayList();
            ParameterSchema ps;
            DbConnection cnx = null;
            DbCommand cmd = null;
            try
            {
                cnx = new DbConnection(connectionString);

                cmd = new DbCommand(command.Name, cnx);
                cmd.CommandType = CommandType.StoredProcedure;

                cnx.Open();
                IDbCommandBuilder.DeriveParameters(cmd);
                cnx.Close();

                foreach(MySqlParameter param in cmd.Parameters)
                {
                    ps = new ParameterSchema(command, param.ParameterName, param.Direction, param.DbType,
                        param.MySqlDbType.ToString(), param.Size, param.Precision, param.Scale, param.IsNullable);

                    a.Add(ps);
                }

            }
            catch
            {
                throw;
            }
            finally
            {
                if (cnx != null)
                    cnx.Close();
            }

            return (ParameterSchema[]) a.ToArray(typeof (ParameterSchema));
            */

            string commandText = string.Format("SELECT PARAMETER_NAME, DATA_TYPE, CHARACTER_OCTET_LENGTH, NUMERIC_PRECISION,"
                + " NUMERIC_SCALE, 0 IS_NULLABLE, PARAMETER_MODE"
                + " FROM INFORMATION_SCHEMA.PARAMETERS WHERE SPECIFIC_SCHEMA = ‘{0}‘ AND SPECIFIC_NAME = ‘{1}‘ AND ROUTINE_TYPE = ‘PROCEDURE‘ ORDER BY ORDINAL_POSITION", command.Database.Name, command.Name);
            List<ParameterSchema> parameterSchema = new List<ParameterSchema>();

            using (DbConnection connection = CreateConnection(connectionString))
            {
                connection.Open();

                DbCommand cmd = connection.CreateCommand();
                cmd.CommandText = commandText;
                cmd.Connection = connection;

                using (IDataReader reader = cmd.ExecuteReader(CommandBehavior.CloseConnection))
                {
                    while (reader.Read())
                    {
                        string name = reader.GetString( 0 );
                        string nativeType = reader.GetString( 1 );
                        long longSize = ( reader.IsDBNull( 2 ) == false ) ? reader.GetInt64( 2 ) : 0;
                        byte precision = ( byte ) ( ( reader.IsDBNull( 3 ) == false ) ? reader.GetInt32( 3 ) : 0 );
                        int scale = ( reader.IsDBNull( 4 ) == false ) ? reader.GetInt32( 4 ) : 0;
                        bool isNullable = ( reader.IsDBNull( 5 ) == false ) && reader.GetBoolean( 5 );
                        string direction = reader.GetString( 6 );
                        ParameterDirection paramDirection = ParameterDirection.Input;
                        switch(direction)
                        {
                            case "IN":
                                paramDirection = ParameterDirection.Input;
                                break;
                            case "OUT":
                                paramDirection = ParameterDirection.Output;
                                break;
                            case "INOUT":
                                paramDirection = ParameterDirection.InputOutput;
                                break;
                            default:
                                paramDirection = ParameterDirection.Input;
                                break;
                        }
                        int size = ( longSize < int.MaxValue ) ? ( int ) longSize : int.MaxValue;

                        bool isUnsigned = ( nativeType.IndexOf( "unsigned" ) > -1 );
                        DbType type = GetDbType( nativeType, isUnsigned );

                        parameterSchema.Add(new ParameterSchema(command,name,paramDirection,type,nativeType,size,precision,scale,isNullable));
                    }

                    if (!reader.IsClosed)
                        reader.Close();
                }

                if (connection.State != ConnectionState.Closed)
                    connection.Close();
            }

            return parameterSchema.ToArray();
        }

编译后生成SchemaExplorer.MySQLSchemaProvider.dll,覆盖程序安装目录中SchemaProviders目录的同名文件。

修改后替换目录(C:\Program Files (x86)\CodeSmith\v6.5\SchemaProviders\SchemaExplorer.MySQLSchemaProvider.dll)中的同名文件。

启动CodeSmith后,需要在Schema Explorer中删除原来的MySQL数据库,重新添加,不然会报错。

也可以先卸载GAC中的SchemaExplorer.MySQLSchemaProvider.dll,然后将自己修改、编译并签名后的SchemaExplorer.MySQLSchemaProvider.dll安装到GAC中。

时间: 2024-11-07 21:28:38

修改CodeSmith中的SchemaExplorer.MySQLSchemaProvider的相关文章

CodeSmith中SchemaExplorer属性的介绍

CodeSmith与数据库的联系,在CodeSmith中自带一个程序集SchemaExplorer.dll,这个程序集中的类主要用于获取数据库中各种对象的结构. <%@ Property Name="SourceDataTable" Type="SchemaExplorer.TableSchema"  Optional="False" Category="Context" Description="表名&quo

android:修改PagerTabStrip中的背景颜色,标题字体的样式、颜色和图标以及指示条的颜色

1.修改PagerTabStrip中的背景颜色 我们在布局中直接设置background属性即可: <android.support.v4.view.ViewPager android:id="@+id/pager" android:layout_width="fill_parent" android:layout_height="fill_parent" > <android.support.v4.view.PagerTabS

修改表中数据的两种方法(update改)

1.通过点击按钮来执行修改表中数据.(数据库和表的创建不在详细介绍,请自动阅读数据库和表的创建) 第一种方法:直接使用SQL来操作数据库,调用execSQL(sql)语句 public class MainActivity extends AppCompatActivity { private Button mPudateButton; private MySqliteHelper mMySqliteHelper; private SQLiteDatabase db; @Override pro

修改XAMPP中mysql数据库的密码

修改XAMPP中MySQL数据库的密码 XAMPP只为开发者服务,不可将其用于生产环境.首先,MySQL管理员(root)未设置密码,用户可以直接通过phpmyadmin访问mysql服务器,修改数据库中的数据,或者通过网络访问. 为确保MySQL数据库的安全,必须为MySQL管理员(root)设置密码,其方法如下: 以root用户的身份登录phpmyadmin,在phpmyadmin的权限中设置root用户的密码,操作界面如下: 图1 图2 更改MySQL数据库密码之后,还要更改phpmyad

java 利用反射修改对象中的list类型字段中的值。

这两天没事学习下了反射.通过反射我们可以修改对象中的字段的值. 就如下面这段代码 Grade grade=new Grade(); Field f=Grade.class.getDeclaredField("name"); f.setAccessible(true); f.set(grade, "三年级一班"); 这是so easy的,这时我想到了要是list类型的字段该怎么通过反射修改呢. 于是我就尝试了下,最终做了出来. 先准备两个类. public class

android 修改EditText 中光标

在使用EditText的XML 文件中加入一个属性: android:textCursorDrawable="@null" android:textCursorDrawable   这个属性是用来控制光标颜色的, "@null"   是作用是让光标颜色和text color一样 android:textCursorDrawable 的用法可以查看android sdk 另外可以用一个图片来修改光标的颜色大小 android:textCursorDrawable=&q

修改SQLServer中sa验证登录方法

转载请注明出自朱朱家园http://blog.csdn.net/zhgl7688 修改SQLServer中sa验证登录方法: 1.  在开始菜单中找到SQLServer Management Studio,双击打开,采用Windows身份验证进入. 2.  选中"服务器名称",点击右键,选择"属性",打开服务器属性窗口. 3.  在打开的窗口中左侧列表中找到"安全性"并选中,在窗口右侧出现的服务器身份验证中选中"SQL Server和W

SQL Server 2005中的分区表(二):如何添加、查询、修改分区表中的数据

在创建完分区表后,可以向分区表中直接插入数据,而不用去管它这些数据放在哪个物理上的数据表中.接上篇文章,我们在创建好的分区表中插入几条数据: 从以上代码中可以看出,我们一共在数据表中插入了13条数据,其中第1至3条数据是插入到第1个物理分区表中的:第4.5条数据是插入到第2个物理分区表中的:第6至8条数据是插入到第3个物理分区表中的:第9至11条数据是插入到第4个物理分区表中的:第12.13条数据是插入到第5个物理分区表中的. 从SQL语句中可以看出,在向分区表中插入数据方法和在普遍表中插入数据

修改Myeclipse中项目在tomcat上发布的名称

1.从网上找的,但是没有用 2.直接修改工作空间中的文件