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