|
Ralf Meier wrote: Have you ever checked with the Debugger wat kind of Data you get with yor Request which fails ? This would be my 1st approach to find out what happens ...
How do I do this? If I run the debugger, how would it show the problem point? Where do I have to look? I am sort of new to this thing.
|
|
|
|
|
you could set Breakpoints inside your Code which stops the Code at this point. Now you can see which values your different Variables have (by hovering with the Mouse over them).
|
|
|
|
|
I tried setting breakpoints, but then got an error which said something to the effect "break point won't break because some symbol isn't there". I couldn't do away with that error so I put some checks in the code itself, to make sure that the label86 was a proper integer, that there was actually data to be plotted etc, and I ran the new code. It never went to the coded error messages and still the charts were plotted blank. Is it possible the fault is somewhere in the chart settings? maybe the series become transparent or something? But why would this happen only when we use "Where" and try to plot a part of the table data?
void PlotChart()
{
try
{
if (!int.TryParse(label86.Text.Trim(), out int rawDataOrder))
{
MessageBox.Show("Invalid RawDataOrder value. Please enter a valid integer.", "Error PlotChart", MessageBoxButtons.OK, MessageBoxIcon.Error);
return;
}
using (SqlConnection connection = new SqlConnection(@"Data Source=(LocalDB)\MSSQLLocalDB;AttachDbFilename=|DataDirectory|\Database1.mdf;Integrated Security=True"))
{
using (SqlCommand command = new SqlCommand("SELECT * FROM SerialDataNIBP WHERE RawDataOrder = @RawDataOrder", connection))
{
if (connection.State != ConnectionState.Open)
{
connection.Open();
}
command.Parameters.AddWithValue("@RawDataOrder", rawDataOrder);
using (SqlDataReader reader = command.ExecuteReader())
{
if (!reader.HasRows)
{
MessageBox.Show("No data found for the given RawDataOrder.", "Error PlotChart", MessageBoxButtons.OK, MessageBoxIcon.Error);
return;
}
chart1.Series.Clear();
Series PulseCh1 = new Series("Series11");
Series PressureCh1 = new Series("Series12");
PulseCh1.ChartType = SeriesChartType.Spline;
PressureCh1.ChartType = SeriesChartType.Spline;
PulseCh1.Color = Color.Blue;
PressureCh1.Color = Color.Orange;
while (reader.Read())
{
var id = reader.GetInt32(0);
var value11 = reader.GetInt32(1);
var value12 = reader.GetInt32(8);
PulseCh1.Points.AddXY(id, value11);
PressureCh1.Points.AddXY(id, value12);
}
chart1.Series.Add(PulseCh1);
chart1.Series.Add(PressureCh1);
chart1.Titles.Clear();
chart1.Titles.Add(new Title("Channel 1"));
chart1.Update();
}
}
}
}
catch (Exception ex)
{
MessageBox.Show(ex.Message, "Error PlotChart", MessageBoxButtons.OK, MessageBoxIcon.Error);
}
}
|
|
|
|
|
You can only set a Breakpoint to a code-line.
I would in every case look with the Debugger - it's much better than a guesswork - but it's your decission.
I don't believe that the fault is inside the Chart-Settings - but perhaps inside the data you read from the table. Perhaps you don't get any data from it because your request isn't correct ...
|
|
|
|
|
Iskander12345 wrote:
string query = $"SELECT * FROM Data WHERE RawDataOrder = {Convert.ToInt32(label86.Text.Trim())}"; Whilst in this specific instance you're probably safe, this sample suggests you're writing code which would be vulnerable to SQL Injection[^].
And even in this case, your code will result in query plan cache pollution - every value for the parameter will result in a different plan being compiled and stored.
Rather than trying to work out whether your values are "safe" to inject into the query, adopt a simple strategy: always use parameters.
const string query = "SELECT * FROM Data WHERE RawDataOrder = @RawDataOrder";
using (SqlCommand command = new SqlCommand(query, connection))
{
command.Parameters.AddWithValue("@RawDataOrder", Convert.ToInt32(label86.Text.Trim()));
...
"These people looked deep within my soul and assigned me a number based on the order in which I joined."
- Homer
|
|
|
|
|
string query = $"SELECT * FROM Data WHERE RawDataOrder = {Convert.ToInt32(label86.Text.Trim())}";
You are trying to convert a string to an integer, just so it can be immediately converted back into a string. So remove the Convert.ToInt32 part. It is also not a good ide to use Convert as it will fail (maybe silently) if the text is not a pure number. Better to use Int32.TryParse .
|
|
|
|
|
tried both the suggestions above, it didn't work.
|
|
|
|
|
I did not say they would necessarily work, but they are things you need to consider when writing code. As to why your chart does not get created, there is only one way to make progress: debugging. You need to use the debugger to step through the code so you can see exactly what values are in all your variables as the code proceeds. Repeatedly trying random changes without understanding what is actually happening is just a waste of your time.
|
|
|
|
|
The way you've written your SQL code, specifically the parameter you put in the query string, makes it impossible to debug. It's not the existence of the WHERE clause that's the problem. It's that your WHERE clause condition doesn't match any records.
To be able to debug this, you have to rewrite the code so you can see what's going on with the debugger:
string query = "SELECT * FROM Data WHERE RawDataOrder = @orderId";
int orderId;
if (int.TryParse(label86.Text.Trim(), out orderId))
{
using (SqlConnection conn = new SqlConnection("... connection string ..."))
{
using (SqlCommand comm = new SqlCommand(query, conn))
{
SqlParameter orderIdParam = new SqlParameter("@orderId", SqlDbType.Int);
orderIdParam.Value = orderId;
comm.Parameters.Add(orderIdParam);
conn.Open();
using (SqlDataReader reader = comm.ExecuteReader())
{
while (reader.Read())
{
...
}
}
}
}
}
else
{
}
|
|
|
|
|
This is the correct answer, OP stated that when he runs the query without the WHERE clause, it displays the data fine, when using the WHERE clause it show blanks which leads me to believe that no record was returned. That then leads to the reason why nothing was returned - error must lie in the -
Quote: int.TryParse(label86.Text.Trim() part.
As per Dave's solution, first define the value - 'orderId' as a proper value which we know will return a record, then us that value in the sql select statement.
|
|
|
|
|
Iskander12345 wrote: but when I use this filter, it often leads to blank chart
That is your specific problem.
Presumably you do not see the MessageBox for the exception ever.
I doubt the suggestion that 'Convert.ToInt32' is relevant. If it was throwing an exception you would see it. It might however return zero which leads to the next problem. It might return zero because that is a valid value though also.
Your code assumes all of the following
- That there are rows of any sort that are returned.
- That the data in those rows is 'valid' (see above.) But also is zero a valid value?
So what happens for the following
1. There are no rows?
2. The data returned is null. Which means id, value1, value2 will be zero?
I am not saying that is what is happening but rather if does that you are not going to get anything. So you need to check for that.
Perhaps as a minimum you should check the following
1. If there are no rows returned post (new MessageBox) and error about that. You should probably also post 'RawDataOrder'
2. Check that at least one (maybe two) rows exist and that both have non-zero data. If not post a different MessageBox error.
|
|
|
|
|
(1) "Hard code" a "where query". When that works, make a "parm" version. At least you'll have a better idea of where the problem is.
(2)
Try {
MyStuff();
} catch (etc) {
... also works.
"Before entering on an understanding, I have meditated for a long time, and have foreseen what might happen. It is not genius which reveals to me suddenly, secretly, what I have to say or to do in a circumstance unexpected by other people; it is reflection, it is meditation." - Napoleon I
|
|
|
|
|
I just discovered the problem. It appears that the plotting of SQL ID on the x axi was encountering occasional problem depending on what the IDs were, so I set the plots to just have a sequential number starting from 0 and that works.
|
|
|
|
|
im a newbie to coding,,how can i get highest for the below code
private decimal Lowest(int bar, ValueDataSeries src, int length)
{
if (bar < length)
return (0.0m);
decimal res = decimal.MaxValue;
for (int index = bar; index >= bar - (length - 1); index--)
{
if (src[index] < res)
res = src[index];
}
return (res);
}
modified 30-Nov-23 3:08am.
|
|
|
|
|
Have you tried stepping through this code with a debugger so you know what each line is doing? The debugger will allow you to execute one line at the time and inspect all variable values as you do so.
When you are new to coding, debugging might seem to be an advanced topic you will learn later. This is a huge mistake. debugging is simple:
Tutorial: Debug C# code - Visual Studio (Windows) | Microsoft Learn[^] (if you do not use Visual Studio Google "tutorial debugging c# with xxxx" where xxxx is whatever you use to write code.
No matter if you are a professional or a beginner, the debugger is the tool that will save you the most time by far.
|
|
|
|
|
|
I upvoted the question because I cannot see any reason why anyone would down vote it.
|
|
|
|
|
One way to do this is to modify the 'Lowest' method you have used to find the highest value by initializing res to 'decimal.MinValue' and then checking if 'src[index]' is greater than 'res' -
private decimal Highest(int bar, ValueDataSeries src, int length)
{
if (bar < length)
return 0.0m;
decimal res = decimal.MinValue;
for (int index = bar; index >= bar - (length - 1); index--)
{
if (src[index] > res)
res = src[index];
}
return res;
}
|
|
|
|
|
it worked perfectly , thank you
|
|
|
|
|
|
Hello & Salutations to Everyone, using: Win Forms .NET 4.7.2
I have a set of Form buttons named button1, button2, button3,………
I have an array of strings BUTTON_LIST_str[] =” button1”, “button2”, “button3”,…
I have a function:
private void APPLY_BUTTON_CFG(Button b)
{ …………… }
What I need to do is loop through BUTTON_LIST_str[] and pass each button object to APPLY_BUTTON_CFG(Button b).
Basically for every string I need to use for pointing to a different type form object or its property of object, I get the error "String cannot be converted to the object required type/format (System.Form......)
I have searched every convoluted order of words for hours and cannot find a solution that matched my scenario of converting strings to all form object types (or specific ones either). With so many unique object specific variables how does one research the solution to convert a string to each type for each case?
Is there a ConvertToType universal function that solves this issue.
I also ran into same problem with:
FlatStyle P_STYLE = “Flat”;
Button1.FlatStyle = P_STYLE or FlatStyle.P_STYLE ; // error cannot convert string to…………..FlatStyle object type
I understand that a string name cannot point to a form object OOP when passing to a function. I’m not sure I can ask my question competently………….
With so many unique object specific variables how does one research the string conversion solution for each case?
Simply put, how would I research and find the solution for these types of problems:
Button1.FlatStyle = How to convert string to FlatStyle object reference, or Font, TextAlign when an error occurs?
I did find this translator for colors but not FlatStyle though or for any other applicable parameters.
P_COLOR = System.Drawing.ColorTranslator.FromHtml("White"); //"White" will be replaced with a string array element CFG_PARAM_PARSED[2]);
Button1.ForeColor = P_COLOR;
This is the real kicker: Button name as string (String_Array[x]) needs conversion (typecast?) to object name reference
var ButtonObject = String_Array[x]; or Button ButtonObject = String_Array[x];
APPLY_BUTTON_CFG(ButtonObject);
private void APPLY_BUTTON_CFG(Button b)
{
……………
}
Thank You So Much for your time and assistance…………………….
|
|
|
|
|
You would be much better off adding the controls themselves to the array, not the names of them. Those are bad control names by the way.
Why? Because if you go back and change the names of the controls to something sensible and debuggable, you need have to go through the code and find the control names you stuck in arrays and change those too.
Did you Google for "C# Windows Forms find control by name[^]"? There's plenty of results.
|
|
|
|
|
Hello Dave and Thank You very Much,
I understand and agree with you completely but I am taking an inverse approach due to my apps functionality. I am creating a SendKeys keyboard emulator which will have a pre compiled set of universal buttons all referenced by the simple button1-n name. I will have an excel config file with the button’s parameters (visibility, location, size, text, colors.... and key code) which will be loaded for each application I want to keyboard emulate. Instead of having to have multiple form layouts and keycodes for each interface application I will have a simple excel file to copy cut and paste parameters.
So from my excel config I can set number and string parameters but I can't store and retrieve object oriented parameters (def?), I have to store & retrieve them as strings.
The problem that hangs me up is when I have a parameter such as FlatStyle with has arguments of Standard, Flat, PopUp... that are not strings but some type of object property. So when I need to retrieve PopUp as a string I need to convert it to a type of object property.
var TypeOfStyleObject = convert-this-string-to-what-FlatStyle-wants("PopUp"); // PopUp will actually be a StringArray[x]
button1.FlatStyle = TypeOfStyleObject;
I studied the link you pointed out and it solved my problem, with an exception. I fetched the name of the CONTROL (not a specific control like Button) and changed my function input from BUTTON to CONTROL. It passed without error but I did find a catch....
In the function that I apply the configuration parameters to the generic buttons I successfully applied Text, BackColor, ForeColor as a quick test. When I was passing the Button control I was setting FlatStyle but getting a string to object error (above). Now that I am passing the Control control it is saying my "Control" does not have a parameter FlatStyle. I am interpreting this way..... the Control lets me work without specifying the type of object(button, label, RTBox) but I may lose access to some parameters??? Accurate??
I may need to still find a way of passing specific controls instead of generic control object so I don’t lose configurability. I could follow your lead of preloading a Button[] object array and trying see if I can use its index as an object.
Am going anywhere but backwards or circles…… I assuming there has to be some methods that allows you to convert-this-string-to-what-AnyObject-wants() so objects can be acted on in loops and sequences. You have to be able to store & retrieve non numeric config info (strings) that represent object.string.parameterss!!!!! read them & convert to string, save, retrieve, convert string back to object.
Thank You Again………….
|
|
|
|
|
If you look at the documentation for all these features you will see that they invariably have a numeric value which you can pass to the constructor, or set dynamically.
|
|
|
|
|
Your control is (still) also a button, and you can test for that using "is" and "as", and switch between them.
https://stackoverflow.com/questions/3786361/difference-between-is-and-as-keyword
"Before entering on an understanding, I have meditated for a long time, and have foreseen what might happen. It is not genius which reveals to me suddenly, secretly, what I have to say or to do in a circumstance unexpected by other people; it is reflection, it is meditation." - Napoleon I
|
|
|
|
|