CodeSmith中MySQLSchemaProvider支持GetCommandParameters

笔记 164 Views 0 Comments

修改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中。

如未说明则本站原创,转载请注明出处:ITYet » CodeSmith中MySQLSchemaProvider支持GetCommandParameters

表情

Hi,您需要填写昵称和邮箱!

  • 昵称 (必填)
  • 邮箱 (必填)
  • 网址