zoukankan      html  css  js  c++  java
  • 修改CodeSmith中的SchemaExplorer.MySQLSchemaProvider

    修改C:Program Files (x86)CodeSmithv6.5SamplesProjectsCSharpMySQLSchemaProviderMySQLSchemaProvider.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)CodeSmithv6.5SchemaProvidersSchemaExplorer.MySQLSchemaProvider.dll)中的同名文件。

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

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

  • 相关阅读:
    【c++】中文设置
    《谁动了我的奶酪》读后感
    KMP算法的C++实现
    我也说说中文分词(上:基于字符串匹配)
    删除字符串中的空格
    linux jdk bin安装
    笔试题汇总
    栈的压入、弹出序列
    顺序打印矩阵
    二叉树镜像
  • 原文地址:https://www.cnblogs.com/qiu2013/p/4268962.html
Copyright © 2011-2022 走看看