Estoy actualizando rápidamente ServiceStack a la versión 4.5.4 y tengo un problema al intentar convertir mi servicio. Básicamente, ya no puedo devolver la respuesta sql como una cadena. ¿Alguien sabe la sintaxis correcta para esto?

He logrado cambiar a la nueva sintaxis, sin embargo, no puedo encontrar la forma correcta de cambiar la siguiente línea:

return new PostAccountResponse () {mensaje = cadena.Formato ("{0}", mensaje.Valor};

public object Post(Account.Model.Account request)
        {
            switch (request.Accounttype)
            {
                case "dview":
                    try
                    {
                        return dbFactory.Exec(dbCmd =>

                        {
                            dbCmd.CommandType = System.Data.CommandType.StoredProcedure;
                            dbCmd.CommandText = "stored procedure...";
                            dbCmd.Parameters.Add(new MySql.Data.MySqlClient.MySqlParameter("@mobile", request.mobile));
                            MySql.Data.MySqlClient.MySqlParameter message = new MySql.Data.MySqlClient.MySqlParameter("@message", "");
                            message.Direction = System.Data.ParameterDirection.Output;
                            dbCmd.Parameters.Add(message);
                            gender.Direction = System.Data.ParameterDirection.Output;
                            r = dbCmd.ExecuteReader();
                            return new PostAccountResponse() { message = string.Format("{0}", message.Value };
                        });
                    }
                    catch (Exception ex)
                    {
                       //
                    }
                    break;
            }
            return new object();

        }

¿Alguien sabe cómo devolver correctamente la respuesta de mi servicio? Muchas gracias. Experimenté con lo siguiente, pero tampoco funcionó:

    var rdr = dbCmd.ExecuteReader(CommandBehavior.CloseConnection);
                            var results = new List<Account.Model.PostAccountResponse>();
                            while (rdr.Read())
                            {
                                results.Add(new Account.Model.PostAccountResponse { message = string.Format("{0}", message.Value) });
                            }
return new PostAccountResponse { message = results };

ACTUALIZADA 1

Estoy intentando actualizar un servicio a la última versión y el código ya no se compila con esta nueva versión. Eso es lo que quiero decir con no funciona. El compilador arroja estos errores en la nueva línea de devolución de PostAccountResponse:

1.- La función anónima convertida en un delegado que regresa nulo no puede devolver un valor.

2.- No se puede convertir la expresión lambda al tipo de delegado deseado porque algunos de los tipos de retorno en el bloque no son convertibles implícitamente al tipo de retorno de delegado.

3.- No se puede convertir implícitamente el tipo 'Account.Model.PostAccountResponse' a 'System.Data.IDbCommand'. Existe una conversión explícita (¿le falta un elenco?)

4.- No se puede convertir implícitamente el tipo 'Account.Model.PostAccountResponse' a 'System.Threading.Tasks.Task'

2
carol1287 9 dic. 2016 a las 06:17
Puede devolver cadenas sin procesar en un servicio ServiceStack, pero como cuestión de buen diseño, sus servicios deben devolver el mismo tipo de respuesta en todas las rutas de código. Tampoco debería devolver object, puede devolver null si no desea una respuesta. Actualice su pregunta para aclarar exactamente lo que quiere decir con "no funciona", incluidos los seguimientos de pila de excepciones. Incluya también los encabezados de solicitud / respuesta HTTP sin procesar para que podamos ver exactamente lo que se devuelve frente a lo que espera.
 – 
mythz
9 dic. 2016 a las 06:52
Gracias @mythz por tu respuesta. Consulte la pregunta actualizada. Escribí este servicio hace años y siempre ha funcionado bien hasta ahora. El problema es que acabo de actualizar la pila de servicios y es por eso que la sintaxis ahora cambió. Solo quiero saber cómo puedo devolver la respuesta de MySQL en mi servicio. Si tiene alguna idea sobre lo anterior, estaré más que contento de escucharla, gracias de nuevo.
 – 
carol1287
9 dic. 2016 a las 07:04

1 respuesta

La mejor respuesta

En lugar de usar dbFactory.Exec(), debe usar una conexión de base de datos en una declaración de uso como:

using (var db = dbFactory.OpenDbConnection())
using (var dbCmd = db.CreateCommand())
{
    dbCmd.CommandType = System.Data.CommandType.StoredProcedure;
    dbCmd.CommandText = "stored procedure...";
    dbCmd.Parameters.Add(new MySql.Data.MySqlClient.MySqlParameter("@mobile", request.mobile));
    MySql.Data.MySqlClient.MySqlParameter message = new MySql.Data.MySqlClient.MySqlParameter("@message", "");
    message.Direction = System.Data.ParameterDirection.Output;
    dbCmd.Parameters.Add(message);
    gender.Direction = System.Data.ParameterDirection.Output;
    r = dbCmd.ExecuteReader();
    return new PostAccountResponse() { message = string.Format("{0}", message.Value };
}

Está intentando usar una conexión ADO.NET sin procesar aquí para llamar a un procedimiento almacenado de MySql, pero normalmente cuando accede a su base de datos usando API de OrmLite puede usar base.Db Conexión ADO.NET directamente, por ejemplo:

return Db.Select<Table>();
3
mythz 9 dic. 2016 a las 07:36
Gracias de nuevo @mythz, una pregunta muy estúpida lo siento, estoy reemplazando el retorno dbFactory.Exec (dbCmd => {...} con using (var db = dbFactory.OpenDbConnection ()) {...}, sin embargo me encontré con un error IDbConnection no contiene una definición para 'CommandType', 'CommandText' y 'Parameters'. ¿Alguna idea de lo que estoy haciendo mal? :(
 – 
carol1287
9 dic. 2016 a las 07:35
Lo siento volar a ciegas, debes crear el IDbCommand para ver la respuesta actualizada.
 – 
mythz
9 dic. 2016 a las 07:37