Blog Stats
  • Posts - 171
  • Articles - 1
  • Comments - 197
  • Trackbacks - 5

 

SubSonic 2.1 Stored Procedure Bug

SubSonic è un tool open(ci sono i sorgenti inclusi nel package di installazione) che fornisce un framework di accesso ai dati basato sul pattern ActiveRecords.

Risulta quindi una soluzione molto utile, veloce e semplice da utilizzare in progetti in cui non è un requisito l'avere una architettura per forza di cose "loosely coupled"(anche se da questo post l'autore dimostra come anche con SubSonic posso comunque realizzare architetture basate per esempio sul pattern Repository e mantenendo le indipendenze tra i vari layers).

L'ultima versione, la 2.1, presenta un bug durante l'esecuzione di stored procedures che abbiano parametri di tipo decimal con impostati lo "scale"(es. decimal(18,2)).

Qui c'e' il post relativo alla segnalazione, con relativa conferma di fix.

Purtroppo non ho trovato i sorgenti di queste ultime modifiche, che sembra saranno rilasciati in una futura versione 2.1.1.

La soluzione più veloce per me è stata quella di caricare con VS2008 i sorgenti di SubSonic(caricati come dicevo all'inizio durante l'installazione) e cercare di trovare il rimedio al bug in questione. Ecco dove correggere(la parte in bold), nella classe SubSonic.SqlDataProvider:

    private static void AddParams(SqlCommand cmd, QueryCommand qry)
        {
            if(qry.Parameters != null)
            {
                foreach(QueryParameter param in qry.Parameters)
                {
                    SqlParameter sqlParam = new SqlParameter(param.ParameterName, Utility.GetSqlDBType(param.DataType));
                    sqlParam.Direction = param.Mode;

                    //output parameters need to define a size
                    //our default is 50
                    if(sqlParam.Direction == ParameterDirection.Output || sqlParam.Direction == ParameterDirection.InputOutput)
                        sqlParam.Size = param.Size;

                    if(param.Precision != null)
                        sqlParam.Precision = Convert.ToByte(param.Precision);
                    if(param.Scale != null)
                        sqlParam.Scale = Convert.ToByte(param.Scale);

                    //fix for NULLs as parameter values
                    if(param.ParameterValue == null || Utility.IsMatch(param.ParameterValue.ToString(), "null"))
                        sqlParam.Value = DBNull.Value;
                    else if(param.DataType == DbType.Guid)
                    {
                        string paramValue = param.ParameterValue.ToString();
                        if(!String.IsNullOrEmpty(paramValue))
                        {
                            if(!Utility.IsMatch(paramValue, SqlSchemaVariable.DEFAULT))
                                sqlParam.Value = new Guid(param.ParameterValue.ToString());
                        }
                        else
                            sqlParam.Value = DBNull.Value;
                    }
                    else
                        sqlParam.Value = param.ParameterValue;

                    cmd.Parameters.Add(sqlParam);
                }
            }
        }

 

E' sufficiente ricompilare ed utilizzare il nuovo assembly.

del.icio.us Tags:

Comments have been closed on this topic.
 

 

Copyright © Luca Mauri