|
|
Working with ASP.NET Core and OData v4
I get a
Quote:
InvalidOperationException: The path template 'Classes({key})/Bookings({bookingKey})' on the action 'GetBooking' in controller 'Classes' is not a valid OData path template. Bad Request - Error in query syntax.
I don't see the error in query syntax. Here is the full code of this method in my controller 'Classes'
[HttpGet]
[ODataRoute("Classes({key})/Bookings({bookingKey})")]
public async Task<IActionResult> GetBooking([FromODataUri] Guid key, [FromODataUri] Guid bookingKey)
{
var @class = await _context.Classes.FirstOrDefaultAsync(y => y.Id == key);
if (@class == null)
{
return NotFound();
}
var booking = _context.Bookings.Where(y => y.Class.Id == key && y.Id == bookingKey);
if (!booking.Any())
{
return NotFound();
}
return Ok(SingleResult.Create(booking));
}
This method is defined in 'Classes' Controller. I also have a GeBookings method and 2 actions methods defined that cause no issue. When I comment my GetBooking() method I don't have any error.
Booking is a [Contained] ICollection of Booking
public class Class
{
[Key]
public Guid Id { get; set; }
[Contained]
public ICollection<Booking> Bookings {get; set;}
}
Maybe I need to do a pause but I really cannot see my error. Were should I look?
Bastien
|
|
|
|
|
Asking for trouble:
public class Class
"(I) am amazed to see myself here rather than there ... now rather than then".
― Blaise Pascal
|
|
|
|
|
C# is not case-sensitive.
Bastard Programmer from Hell
If you can't read my code, try converting it here[^]
"If you just follow the bacon Eddy, wherever it leads you, then you won't have to think about politics." -- Some Bell.
|
|
|
|
|
It gets fun if you try and consume it in a language like VB.NET though.
This space for rent
|
|
|
|
|
Pete O'Hanlon wrote: It gets fun if you try and consume it in a language like VB.NET though. Not really, there's a special syntax to use those.
Bastard Programmer from Hell
If you can't read my code, try converting it here[^]
"If you just follow the bacon Eddy, wherever it leads you, then you won't have to think about politics." -- Some Bell.
|
|
|
|
|
|
I meant that C# nicely distinguishes between a classname with uppercase and lowercase. "Class" is not treated as "class".
Not sure if that is sensitive of insensitive.
Bastard Programmer from Hell
If you can't read my code, try converting it here[^]
"If you just follow the bacon Eddy, wherever it leads you, then you won't have to think about politics." -- Some Bell.
|
|
|
|
|
Yes, C# is case sensitive. That is it is sensitive to the difference between class and Class. If it was insensitive then it would be happy with cLAss, CLAss, clAsS, or any variation thereof, and take them all to mean the same as class .
|
|
|
|
|
You're right, of course
Bastard Programmer from Hell
If you can't read my code, try converting it here[^]
"If you just follow the bacon Eddy, wherever it leads you, then you won't have to think about politics." -- Some Bell.
|
|
|
|
|
The point was: a meaningless name that looks like a key word.
It's "confusing" (for the already confused); as indicated by this thread.
"(I) am amazed to see myself here rather than there ... now rather than then".
― Blaise Pascal
|
|
|
|
|
Looks like you are reusing web api routes and have not enabled custom routing for OData. Can you share the code where you define the routing? Right now, it is assuming Classes to be name of a controller which of course is not the case.
"It is easy to decipher extraterrestrial signals after deciphering Javascript and VB6 themselves.", ISanti[ ^]
|
|
|
|
|
All my other routes are working fine. GelAll is working, Post is working. I don't get it. Controller name is Classes. Only route that include the key of Booking are not working. What is the logic behind this?
using Microsoft.AspNet.OData;
using Microsoft.AspNet.OData.Routing;
using Microsoft.AspNetCore.Mvc;
using Microsoft.EntityFrameworkCore;
using Oyg.Domain.DataTypes;
using System;
using System.Linq;
using System.Threading.Tasks;
namespace Oyg.Api.Controllers
{
public partial class ClassesController : ODataController
{
[HttpGet]
[ODataRoute("Classes({classId})/Bookings")]
public async Task<IActionResult> GetBookings([FromODataUri] Guid classId)
{
return Ok(await _context.Bookings
.Where(y => y.Class.Id == classId)
.ToListAsync());
}
[HttpGet]
[ODataRoute("Classes({classId})/Bookings({bookingId})")]
public async Task<IActionResult> GetBooking([FromODataUri] Guid classId, [FromODataUri] Guid bookingId)
{
var @class = await _context.Classes.FirstOrDefaultAsync(y => y.Id == classId);
if (@class == null)
{
return NotFound();
}
var booking = _context.Bookings.Where(y => y.Class.Id == classId && y.Id == bookingId);
if (!booking.Any())
{
return NotFound();
}
return Ok(SingleResult.Create(booking));
}
[HttpPost]
[ODataRoute("Classes({classKey})/Bookings")]
public async Task<IActionResult> PostBooking([FromODataUri] Guid classKey, [FromBody] Booking booking)
{
if (!ModelState.IsValid)
{
return BadRequest(ModelState);
}
var @class = _context.Classes
.FindAsync(classKey);
if (@class == null)
{
return NotFound();
}
booking.Id = Guid.NewGuid();
booking.Position = _context.Bookings.Where(y => y.Class.Id == classKey).Count();
booking.ReservationTime = DateTime.UtcNow;
_context.Bookings.Add(booking);
await _context.SaveChangesAsync();
return Created(booking);
}
[HttpPost]
[ODataRoute("Classes({classKey})/Oyg.Actions.Register")]
public async Task<IActionResult> Register([FromODataUri] Guid classKey, ODataActionParameters parameters)
{
var @class = await _context.Classes.FindAsync(classKey);
if (@class == null)
{
return NotFound();
}
if (!parameters.TryGetValue("studentId", out object outputFromDictionary))
{
return NotFound();
}
if (!Guid.TryParse(outputFromDictionary.ToString(), out Guid studentId))
{
return NotFound();
}
var student = await _context.Students.FirstOrDefaultAsync(y => y.Id == studentId);
if (student == null)
{
return NotFound();
}
var booking = new Booking()
{
Id = Guid.NewGuid(),
Class = @class,
Student = student,
Position = _context.Bookings.Where(y => y.Class.Id == classKey).Count(),
ReservationTime = DateTime.UtcNow
};
_context.Bookings.Add(booking);
await _context.SaveChangesAsync();
return Ok(booking);
}
[HttpPost]
[ODataRoute("Classes({classKey})/Oyg.Actions.CancelRegistration")]
public async Task<IActionResult> CancelRegistration([FromODataUri] int classKey, ODataActionParameters parameters)
{
var @class = await _context.Classes.FindAsync(classKey);
if (@class == null)
{
return NotFound();
}
if (!parameters.TryGetValue("studentId", out object outputFromDictionary))
{
return NotFound();
}
if (!Guid.TryParse(outputFromDictionary.ToString(), out Guid studentId))
{
return NotFound();
}
var student = _context.Students.FirstOrDefault(y => y.Id == studentId);
if (student == null)
{
return NotFound();
}
var booking = await _context.Bookings.SingleOrDefaultAsync(y => y.Class.Id == @class.Id &&
y.Student.Id == student.Id && y.CancelTime == null);
if (booking == null)
{
return NotFound();
}
booking.CancelTime = DateTime.UtcNow;
await _context.SaveChangesAsync();
return NoContent();
}
}
}
|
|
|
|
|
Suppose I have a timekeeper, Ronald jack x628-C, I export time attendance data from the device, including two files: data.dat and device.dat because the old machine runs or crashes the device, I buy the device again If I restore the fingerprint from the old device, I added the remaining device.dat file, which was reported: "IP Error Input!" Restore the data to the device, and the data must be the backup BIN data passing the backup function before. Any of you know this error only helps with.
|
|
|
|
|
What does this have to do with C#? If you are having a problem with a piece of hardware or how it's configured, you should get in touch with the support department of the manufacturer. They are going to be much more capable of providing useful help than we are.
This space for rent
|
|
|
|
|
I look for example backup and restore code written in winform C#, do you have this example shared with
|
|
|
|
|
Why would you assume that a random website would know more about a specific piece of hardware and it's software interface than the people who made it?
Go talk to the manufacturers - they are the only ones who you can guarantee will know what you are talking about in any detail!
Sent from my Amstrad PC 1640
Never throw anything away, Griff
Bad command or file name. Bad, bad command! Sit! Stay! Staaaay...
AntiTwitter: @DalekDave is now a follower!
|
|
|
|
|
You should talk to the people who created it - they should provide technical support and will know more about their product than we will. If they don't, then find another supplier and demand your money back!
Sent from my Amstrad PC 1640
Never throw anything away, Griff
Bad command or file name. Bad, bad command! Sit! Stay! Staaaay...
AntiTwitter: @DalekDave is now a follower!
|
|
|
|
|
Hi
I have the following code and I am trying to export information from datagridview to an Access document based but when i have error that was :
System.Data.OleDb.OleDbException: 'Number of query values and destination fields are not the same.'
please help me to complited this.becouse i cant fix this error.
thank you
this is my project code:
private DataTable GetDataTableFromDGV(DataGridView dgv)
{
var dt = new DataTable();
foreach (DataGridViewColumn column in dgv.Columns)
{
if (column.Visible)
{
dt.Columns.Add();
}
}
object[] cellValues = new object[dgv.Columns.Count];
foreach (DataGridViewRow row in dgv.Rows)
{
for (int i = 0; i < row.Cells.Count; i++)
{
cellValues[i] = row.Cells[i].Value;
}
dt.Rows.Add(cellValues);
}
return dt;
}
private void Exportbutton_Click(object sender, EventArgs e)
{
openFileDialog1.ShowDialog();
if (KindcomboBox.SelectedIndex == 0)
{
OleDbConnection cn = new OleDbConnection(@"Provider=Microsoft.Ace.OLEDB.12.0;Data Source=" + openFileDialog1.FileName + ";Persist Security Info=True");
cn.Open();
DataTable dt = new DataTable();
dt = GetDataTableFromDGV(TtmsdataGridView);
OleDbCommand com = new OleDbCommand();
com.CommandType = CommandType.Text;
com.Connection = cn;
int dtc = dt.Rows.Count;
MessageBox.Show($"{dtc}");
for (int i = 0; i < (dt.Rows.Count); i++)
{
com.CommandText = "INSERT INTO Kharid_Detail(" + dt.Columns[i].ColumnName.Trim() + ")VALUES(" + (i++) + ",'" +
dt.Rows[i].ItemArray.GetValue(i) + "')";
com.ExecuteNonQuery();
}
modified 25-Mar-19 4:41am.
|
|
|
|
|
First off, as the discussion previous to this one states, you should never write a query like this without using SqlCommands and SqlParameters. PLEASE use that for production code.
If this is not for production, then please take a look at your loop. You are looping on the number of Rows in the table, yet you are using the variable i to index on the table's Columns.
I'm guessing you're trying to make the insert statement include all of the columns in the data table, and make a newly inserted row for each row in the data table. These would have to be two different for loops, concatenating to the same command string.
|
|
|
|
|
A couple of things:
1) As mentioned, you've made a lot of mistakes here. Read this: Re: Question about login form with access database - C# Discussion Boards[^] and apply it to your code for the same reasons!
2) Read the error message:
Number of query values and destination fields are not the same. Then look at your code:
com.CommandText = "INSERT INTO Kharid_Detail(" + dt.Columns[i].ColumnName.Trim() + ")VALUES(" + (i++) + ",'" +
dt.Rows[i].ItemArray.GetValue(i) + "')"; Lets make it a bit simpler to read:
com.CommandText = "INSERT INTO Kharid_Detail(" + x + ")VALUES(" + y + ",'" + z + "')"; You list one column, and provide two values ...
3) You have a DataTable. why not just use a DataAdapter to write them all in one go? Updating Data Sources with DataAdapters | Microsoft Docs[^]
Sent from my Amstrad PC 1640
Never throw anything away, Griff
Bad command or file name. Bad, bad command! Sit! Stay! Staaaay...
AntiTwitter: @DalekDave is now a follower!
|
|
|
|
|
Thanks for your help
i edit my loop code and it work but i have on other error that was when i copy the result of store procedure from sql and past it into access dont have any problem that worked but when i trying with c#
i see error that say
"<pre>System.Data.OleDb.OleDbException: 'You must enter a value in the 'Kharid_Detail.KalaKhadamatName' field.' "
when i print my result in c# every thing is true.
this is my new code:
<pre>for (int j = 0; j < (TtmsdataGridView.ColumnCount); j++)
for (int i = 0; i < (TtmsdataGridView.Rows.Count); i++)
{
com.CommandText = "INSERT INTO Kharid_Detail(" + TtmsdataGridView.Columns[j].Name.Trim() + ")VALUES(" + TtmsdataGridView.Rows[i].Cells[j].Value + ")";
com.ExecuteNonQuery();
}
about dataadapter i'm beginer in programing and don't understand how to change my code for use it.
thank you
|
|
|
|
|
WHat part of "never concatenate strings" is giving you problems? Or did you just not read what we told you?
Sent from my Amstrad PC 1640
Never throw anything away, Griff
Bad command or file name. Bad, bad command! Sit! Stay! Staaaay...
AntiTwitter: @DalekDave is now a follower!
|
|
|
|
|
Hi everyone i want to make an login form ...with user and password stored in .mdb access database
i found and sample code working very fine….but the problem i need with the login form to have an level permission...like simple user...admin or master admin…
i give you my sample code….i probably need to put other column to my code for grant value like 1-2 or 3
by this number we knows the grant of the login user
thanks a lot!!!
namespace test_passwor_logger
{
public partial class Form1 : Form
{
OleDbConnection cn = new OleDbConnection("Provider=Microsoft.Jet.OLEDB.4.0;Data Source=lampedb.mdb");
OleDbDataAdapter da;
DataTable dt = new DataTable();
public Form1()
{
InitializeComponent();
}
private void button1_Click(object sender, EventArgs e)
{
da = new OleDbDataAdapter("select * from mp where user='" + textBox1.Text + "' and pass='" + textBox2.Text + "'", cn);
da.Fill(dt);
if (dt.Rows.Count <= 0)
{
if (panel1.Height == 0)
{
label1.Text = "Email or password are invalid Please try again";
timer1.Start();
}
else if (panel1.Height == 100)
{
timer2.Start();
label1.Text = "";
}
}
else if (dt.Rows.Count > 0)
{
if (panel1.Height == 0)
{
label1.Text = "login sucessfull";
timer1.Start();
}
else if (panel1.Height == 100)
{
timer2.Start();
label1.Text = "";
}
}
dt.Clear();
}
private void button2_Click(object sender, EventArgs e)
{
timer2.Start();
}
private void timer1_Tick_1(object sender, EventArgs e)
{
if (panel1.Height != 100)
{
panel1.Height += 5;
if (panel1.Height == 100)
{
timer1.Stop();
}
}
}
private void timer2_Tick_1(object sender, EventArgs e)
{
if (panel1.Height != 0)
{
panel1.Height -= 5;
if (panel1.Height == 0)
{
timer2.Stop();
}
}
}
}
}
|
|
|
|
|
Before you start moving on to levels and rules, you have got to fix that first - it's very bad code.
1) Never concatenate strings to build a SQL command. It leaves you wide open to accidental or deliberate SQL Injection attack which can destroy your entire database. Always use Parameterized queries instead.
When you concatenate strings, you cause problems because SQL receives commands like:
SELECT * FROM MyTable WHERE StreetAddress = 'Baker's Wood' The quote the user added terminates the string as far as SQL is concerned and you get problems. But it could be worse. If I come along and type this instead: "x';DROP TABLE MyTable;--" Then SQL receives a very different command:
SELECT * FROM MyTable WHERE StreetAddress = 'x';DROP TABLE MyTable; Which SQL sees as three separate commands:
SELECT * FROM MyTable WHERE StreetAddress = 'x'; A perfectly valid SELECT
DROP TABLE MyTable; A perfectly valid "delete the table" command
And everything else is a comment.
So it does: selects any matching rows, deletes the table from the DB, and ignores anything else.
So ALWAYS use parameterized queries! Or be prepared to restore your DB from backup frequently. You do take backups regularly, don't you?
2) Never store passwords in clear text - it is a major security risk. There is some information on how to do it here: Password Storage: How to do it.[^]
3) Don't hardcode connections strings. If you do, then you have to change your code and rebuild for release, and potentially for every different installation. Use a configuration file instead, so it;s easy to update without changing your code.
4) Don't use SELECT * FROM ... - always name the columns you want to return. In this case, SELECT COUNT(User) FROM ... would have been sufficient. You are returning information you already have and that's wasteful. It's not a problem right now, but it will be in "real world" apps so it's worth getting into the habit of doing it correctly from the beginning.
5) Don't use a DataAdapter to return a single piece of info: use ExecuteScalar instead, which returns a single value.
When you have fixed that lot, then think about moving forward.
Sent from my Amstrad PC 1640
Never throw anything away, Griff
Bad command or file name. Bad, bad command! Sit! Stay! Staaaay...
AntiTwitter: @DalekDave is now a follower!
|
|
|
|