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()));
}
2 réponses
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 delinq
.
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
avecnew
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 });
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.
De nouvelles questions
c#
C # (prononcé "see sharp") est un langage de programmation multi-paradigme de haut niveau, typé statiquement développé par Microsoft. Le code C # cible généralement la famille d'outils et d'exécutions Microsoft .NET, notamment le .NET Framework, .NET Core et Xamarin. Utilisez cette balise pour les questions sur le code écrit en C # ou en spécification formelle de C #.