Eh bien, j'ai utilisé le modèle de cadre d'entité pour connecter mon application à ma base de données et généré le contrôleur et les vues pour les opérations CRUD.

Mais maintenant, je dois exécuter cette requête:

select preco_hora, hora_adicional
from dbo.Precos
where dt_ini_vgcia <= '05/08/2016'
and   dt_fim_vgcia >= '05/08/2016'

Et mettre le retour de ces deux colonnes (preco_hora et hora_adicional) dans une variable (ou un objet, tout ce que je peux gérer).

Donc, j'ai des problèmes avec cette chose simple ... je n'arrive pas à faire fonctionner le code. Il compile, mais ne fonctionne pas.

J'ai essayé quelque chose comme ça:

//get the context of the table from the database
private EstacionamentoContext db = new EstacionamentoContext();

string hentrada = "05/08/2016";

        var results = db.Precos.SqlQuery(
            "select preco_hora, hora_adicional " +
            "from db.Precos " +
            "where dt_ini_vgcia <= @p0 " +
            "and dt_fim_vgcia >= @p0", hentrada
            );
    return Content("Resultado: = {0}", results.ToString());

Mais je n'obtiens aucune valeur sur la variable «résultats». J'ai essayé de déboguer pour voir si les "résultats" obtiennent une certaine valeur mais j'ai eu une erreur quand j'ai essayé de voir à l'intérieur de la variable.

Alors, comment puis-je résoudre ce problème? comment puis-je créer un objet (ou une variable) pouvant recevoir ce retour?

MODIFIER AVEC LA SOLUTION:

Le code a été modifié et LINQ a été utilisé pour obtenir un meilleur code. Merci pour @Jaya et @Jeric Cruz pour toute l'aide avec le code.

Le code final était le suivant:

var hentrada = DateTime.Parse("05/08/2016");

            var results = db.Precos.Where(p => p.dt_ini_vgcia <= hentrada
            && p.dt_fim_vgcia >= hentrada).Select(p => new { p.preco_hora, p.hora_adicional }).FirstOrDefault();

            if (results == null)
            {
                return Content("Não há preço registrado para este período de vigência");
            }
            else
            {
                return Content(String.Format("Preço por Hora = {0} e Hora Adicional = {1}", results.preco_hora.ToString(), results.hora_adicional.ToString()));
            }
0
Lucas Barreto 10 juil. 2017 à 02:13

2 réponses

Meilleure réponse

Veuillez vérifier les colonnes sélectionnées dans votre requête. Je pense que vous avez manqué le trait de soulignement.

preco_hora, hora_adicional

Vous pouvez essayer d'ajouter un nouveau SqlParameters lors de l'insertion de la valeur de votre paramètre dans votre SqlQuery

nouveau SqlParameter ("@ p1", hentrada)

var results = db.Precos.SqlQuery(
            "select preco_hora, hora_adicional " +
            "from db.Precos " +
            "where dt_ini_vgcia <= @p1 " +
            "and dt_fim_vgcia >= @p1", new SqlParameter("@p1", hentrada)
            );

Reportez-vous au lien ICI pour plus de détails sur SqlQuery.

Et aussi, cette requête se traduira par une valeur multiple basée sur vos colonnes.

======= UPDATED ====== basé sur la réponse de @ Jaya, vient de modifier l'instruction linq:

Premièrement: est d'analyser la valeur de la chaîne de date et assignée à la variable pour éviter une exception linq puisque DateTime.Parse ne fait pas partie du code de linq.

var hentrada = DateTime.Parse("05/08/2016");

Deuxièmement: affectez la variable dans votre instruction linq.

var results = db.Precos.Where(p => p.dt_ini_vgcia >= hentrada && p.dt_ini_vgcia <= hentrada);

Troisièmement: il faut faire Select avec new et ne pas le mettre en chaîne.

.Select(p => new {p.preco_hora, p.hora_adicional});

Alors sortira sera:

var hentrada = DateTime.Parse("05/08/2016");
var results = db.Precos
.Where(p => p.dt_ini_vgcia >= hentrada && p.dt_ini_vgcia <= hentrada)
.Select(p => new { p.preco_hora, p.hora_adicional });
2
Jeric Cruz 10 juil. 2017 à 01:07

Le problème est logique, vous devez en savoir plus sur les connexions de données et la liaison. Utilisation d'un paramètre pour déclarer vos variables comme (@ p1). Les exemples sont les meilleurs explicatifs. Essayez d'utiliser cette méthode:

     //Connections methods vary use whatever you like 
    string connectionString = WebConfigurationManager.ConnectionStrings["Your_String_Name"].ConnectionString;
    SqlConnection conn = new SqlConnection(connectionString);

    SqlCommand cmd = new SqlCommand(conn);
    cmd.CommandType = CommandType.Text;
    conn.open();
    string hentrada = "05/08/2016";
    cmd.CommandText = "SELECT preco_hora, hora_adicional FROM db.Precos where 
    dt_ini_vgcia <= @p1 AND dt_fim_vgcia >= @p2";
    cmd.Parameters.Add("@p1", hentrada);
    cmd.Parameters.Add("@p2", somthingelse);

//to view the results of select query 
 DataSet exampledataset = new DataSet(); //data set to hold the data
 SqlDataAdapter adapt = new SqlDataAdapter(cmd); // will put the results from cmd inside an adaprter.
 adapt.Fill(exampledataset); // data moved from adapter to data set 
 Gridview1.DataSource = exampledataset; //you can use gridview to present the data or any other tool.
 Gridview1.DataBind();

 conn.Close();

Ce n'est qu'une des nombreuses façons d'interroger en utilisant C #. Je vous encourage à en savoir plus sur SqlCommand.Parameters. Non pas que ce ne soit pas la meilleure pratique. La bonne pratique consistera à utiliser une méthode plus sécurisée comme la procédure stockée ici.

Non: pardonnez ma brève venue, l'anglais n'est pas ma langue maternelle.

0
Gham 10 juil. 2017 à 00:27