[C#] WHERE stuk problemen...

Pagina: 1
Acties:

  • Raenius
  • Registratie: December 2003
  • Laatst online: 20-08-2021
Hey mensen,

Ik zit al een tijdje te zwoegen op een ogenschijnlijk simpel stukje van een functie...het is een simpele check in de database om te zien of een bepaald ip adres erin staat.

Ik gebruik de volgende code:

code:
1
2
3
4
5
6
7
8
9
10
11
string e = @"^\s+";
Regex rx = new Regex(e);
string new_rip = rx.Replace(rip,"");

SqlConnection myConnection = new SqlConnection(Globals.sqlserverconn);

              try
    {
    myConnection.Open();

string sql = "SELECT routerID FROM ROUTERS WHERE (ip='" + new_rip.ToString() + "')";


Eerst haal ik de leading / trailing spaces weg, van een ip adres die ik krijg als ik de functie aanroep. Dan voeg ik hem in SQL query om met de volgende code te kijken of hij bestaat:

code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
while (reader.Read())
    {

// MessageBox.Show("hello");
// Check if an element exists..

    if(reader[0].ToString()== null)
        {
        MessageBox.Show("It does not exist!");
        }
        else
        {
        MessageBox.Show("It does exist!");
        }
    }


Maar het blijkt dus zo te zijn dat hij nooit verder komt dan de query, hij geeft niet aan of hij bestaat of niet en hij geeft ook geen foutmelding aan. Ook de messagebox met hello wordt nite weergegeven. Alles buiten de while loop gaat wel goed.

Ik heb het op veel andere manieren geprobeerd (" ' " ' '" ' ',etc) en met geparametriseerde queries maar ik krijg het nog steeds niet voor elkaar.

De enige manier waarop ik hem zo ver kan krijgen dat hij een "It does exist!" messagebox geeft is door een ip adres te hardcoden, zoals:

code:
1
string sql = "SELECT routerID FROM ROUTERS WHERE (ip='xxx.xxx.xxx.xxx')";


Dan doet hij het wel, maar alleen als ik en IP adres invoer wat wel in de database staat. Wanneer deze niet in de database staat geeft hij geen enkele melding weer..dit maakt het nog vreemder...

Heeft iemand ideeën of suggesties om dit goed te krijgen?

Alvast bedankt voor de moeite...

[edit: iets meer info]

[ Voor 12% gewijzigd door Raenius op 12-08-2004 16:51 ]

http://www.catalogged.net/


  • whoami
  • Registratie: December 2000
  • Laatst online: 09:01
Er zal dus niets opgehaald worden, aangezien ie niet eens in de while loop komt.
Je kan ook eens de debugger gebruiken om te kijken wat er allemaal gebeurt, en je kan ook met de SQL Server profiler je query onderscheppen, zodat je kan kijken hoe die naar de DB gestuurd wordt.

Tip: gebruik parametrized queries

Trouwens, om te kijken of een IP adres in je DB bestaat, kan je dat ook checken dmv een COUNT query, en dan roep je de ExecuteScalar method aan van het Command object. Als dat resultaat groter is dan 0, dan bestaat dat IP adres in je DB.

[ Voor 28% gewijzigd door whoami op 12-08-2004 16:53 ]

https://fgheysels.github.io/


  • Raenius
  • Registratie: December 2003
  • Laatst online: 20-08-2021
Ik werk met Borland, als ik hem run geeft hij geen foutmeldingen aan hij runt gewoon hij toont alleen geen messageboxes...

Zoals gezegt in de TS heb ik ook al geparametriseerde functies geprobeerd....

Dat laatste is misschien iets waar ik naar kan kijken, maar ik zit nog steeds met hetzelfde probleem dat ik blijkbaar de string niet goed aan SQL toevoeg...

http://www.catalogged.net/


  • whoami
  • Registratie: December 2000
  • Laatst online: 09:01
Die Parametrized queries gaan (waarschijnlijk, in dit geval) je probleem niet oplossen, het maakt je code alleen maar leesbaarder en veiliger.

Of je nu met Borland werkt of niet: gebruik je debugger, en kijk wat er gebeurt.
Als je messageBox niet wordt weergegeven, wil dat zo goed als zeker zeggen dat hij niet in de while - lus komt, en dat wil dan weer zeggen dat je Reader geen resultaten bevat.

https://fgheysels.github.io/


  • whoami
  • Registratie: December 2000
  • Laatst online: 09:01
Tip: leer debuggen.
Gebruik System.Diagnostics.Debug.WriteLine statements om te kijken welke waarde je query-string bevat, gebruik breakpoints, gebruik watches, stap door je code en kijk wat er gebeurt.

https://fgheysels.github.io/


  • Raenius
  • Registratie: December 2003
  • Laatst online: 20-08-2021
*leert debuggen* straks meer...

[ Voor 88% gewijzigd door Raenius op 12-08-2004 17:04 ]

http://www.catalogged.net/


  • curry684
  • Registratie: Juni 2000
  • Laatst online: 12-05 22:23

curry684

left part of the evil twins

Les 1 debuggen: dump je query even snel in een messagebox.

Professionele website nodig?


Verwijderd

Jouw regex ript alleen leading spaces

  • JeroenTheStig
  • Registratie: Mei 2000
  • Laatst online: 02:25
curry684 schreef op 12 augustus 2004 @ 17:05:
Les 1 debuggen: dump je query even snel in een messagebox.
hint: bij c#builder of vs.net kun je bij de opties van je gemaakte windows applicatie aangeven dat het een 'console application' is. Naast je windows application draait er ook een console boxje. Dan kun je weer heerlijk fijn debuggen met behulp van System.Console.Writeline("blaat") :)

[ Voor 11% gewijzigd door JeroenTheStig op 12-08-2004 19:21 ]


  • whoami
  • Registratie: December 2000
  • Laatst online: 09:01
Boktor: dat kan je beter doen dmv System.Diagnostics.Debug.WriteLine.
Die statements worden dan enkel uitgevoerd in debug-builds, en die write-lines worden ook naar een soort console (in je IDE) geschreven.

https://fgheysels.github.io/


  • JeroenTheStig
  • Registratie: Mei 2000
  • Laatst online: 02:25
whoami schreef op 12 augustus 2004 @ 19:26:
Boktor: dat kan je beter doen dmv System.Diagnostics.Debug.WriteLine.
Die statements worden dan enkel uitgevoerd in debug-builds, en die write-lines worden ook naar een soort console (in je IDE) geschreven.
ik zag het hierboven ook al staan, dus ben even op zoek gegaan :) Alleen vreemd dat m'n c#builder de system.diagnostics namespace niet kent in de autocompletion :(
hmm, en nu doet ie t ineens wel? :?

Maar dit is idd een hele goeie tip, thanx! :)

[ Voor 5% gewijzigd door JeroenTheStig op 12-08-2004 19:32 ]


  • curry684
  • Registratie: Juni 2000
  • Laatst online: 12-05 22:23

curry684

left part of the evil twins

whoami schreef op 12 augustus 2004 @ 19:26:
Boktor: dat kan je beter doen dmv System.Diagnostics.Debug.WriteLine.
Die statements worden dan enkel uitgevoerd in debug-builds, en die write-lines worden ook naar een soort console (in je IDE) geschreven.
Mjah om alleen even de query te checken pak ik lekker een messagebox hoor :)

Zodra ik structureel iets moet debuggen worden logfiles/debugdiagnostics interessant.

Professionele website nodig?


  • whoami
  • Registratie: December 2000
  • Laatst online: 09:01
Een messagebox vind ik niet zo handig; met die Debug.WriteLine kan je direct copy / pasten mocht dat nodig zijn. :P

https://fgheysels.github.io/


  • gorgi_19
  • Registratie: Mei 2002
  • Laatst online: 06:53

gorgi_19

Kruimeltjes zijn weer op :9

Gekke vraag, maar waarom sla je het IP-adres niet op als LONG? Dat zal het zoeken bovendien ook nog stukken versnellen. :)

Digitaal onderwijsmateriaal, leermateriaal voor hbo


  • Raenius
  • Registratie: December 2003
  • Laatst online: 20-08-2021
Hmmm het is een import utility die werkt op een bestaande SQL server en een bijbehoreend programma. Een datatype veranderen is niet even snel te realiseren maar ik zal er zeker naar kijken...ik ga straks weer verder met (nogmaals en verder) debuggen...alvast bedankt voor de reacties tot nu toe..

http://www.catalogged.net/


  • gorgi_19
  • Registratie: Mei 2002
  • Laatst online: 06:53

gorgi_19

Kruimeltjes zijn weer op :9

Alleen trailing spaces verwijderen moet trouwens toch ook lukken met:
C#:
1
new_rip.ToString().Trim(" ")

Daar heb je toch geen regex voor nodig? :)

Digitaal onderwijsmateriaal, leermateriaal voor hbo


  • whoami
  • Registratie: December 2000
  • Laatst online: 09:01
Waarom geef jij een arugment mee aan die Trim functie gorgi? Dat gaat niet compilen. :P

https://fgheysels.github.io/


  • J27
  • Registratie: Januari 2003
  • Laatst online: 23-05 13:57

J27

De eerste regel van de eerste reply:

"Er zal dus niets opgehaald worden, aangezien ie niet eens in de while loop komt."

Is volgens mij de oplossing van je probleem, groote kans dat de de while(reader.read()) loop nooit word uitgevoerd, omdat er geen resultaten zijn van je query, wanneer je IP niet bestaat word er geen NULL teruggegeven, er word helemaal niets teruggegeven (reader.read() is meteen al false )

  • gorgi_19
  • Registratie: Mei 2002
  • Laatst online: 06:53

gorgi_19

Kruimeltjes zijn weer op :9

whoami schreef op 13 augustus 2004 @ 09:00:
Waarom geef jij een arugment mee aan die Trim functie gorgi? Dat gaat niet compilen. :P
Trim heeft een overloaded method :P
http://msdn.microsoft.com...mstringclasstrimtopic.asp

Digitaal onderwijsmateriaal, leermateriaal voor hbo


  • whoami
  • Registratie: December 2000
  • Laatst online: 09:01
:(
Check je mail trouwens. :P

[ Voor 88% gewijzigd door whoami op 13-08-2004 09:06 ]

https://fgheysels.github.io/


  • gorgi_19
  • Registratie: Mei 2002
  • Laatst online: 06:53

gorgi_19

Kruimeltjes zijn weer op :9

J27 schreef op 13 augustus 2004 @ 09:03:
De eerste regel van de eerste reply:

"Er zal dus niets opgehaald worden, aangezien ie niet eens in de while loop komt."

Is volgens mij de oplossing van je probleem, groote kans dat de de while(reader.read()) loop nooit word uitgevoerd, omdat er geen resultaten zijn van je query, wanneer je IP niet bestaat word er geen NULL teruggegeven, er word helemaal niets teruggegeven (reader.read() is meteen al false )
Nu je het zegt... :X
Visual Basic .NET:
1
2
3
4
5
If Reader.Read Then
    ' Gelukt
Else
    ' Niet gelukt
End if

Zou wel moeten werken.. :X Met grote aantallen lijkt me trouwens een Exists() beter werken dan een Count(), als je toch met een executescalar aan de gang wilt :)

@whoami :+
* gorgi_19 gaat het vanmiddag verwerken :)

[ Voor 4% gewijzigd door gorgi_19 op 13-08-2004 09:12 ]

Digitaal onderwijsmateriaal, leermateriaal voor hbo


  • whoami
  • Registratie: December 2000
  • Laatst online: 09:01
gorgi_19 schreef op 13 augustus 2004 @ 09:11:
[...]

Nu je het zegt... :X
Visual Basic .NET:
1
2
3
4
5
If Reader.Read Then
    ' Gelukt
Else
    ' Niet gelukt
End if
:z
Wat ik dus al in m'n eerste reply vermoedde. Als de TS idd eens z'n debugger gebruikt had, dan had ie het al van bij het begin geweten.

https://fgheysels.github.io/


  • Raenius
  • Registratie: December 2003
  • Laatst online: 20-08-2021
Bedankt voor de hulp mensen, het is nu opgelost aan de hand van de volgende code (die nog aangepast wordt met para-queries)..
code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
       SqlConnection myConnection = new SqlConnection(Globals.sqlserverconn);

        try
        {
        myConnection.Open();

        string sql = "SELECT routerID FROM ROUTERS WHERE (ip='" + rip.ToString() + "')";
        SqlCommand SelectCommand= new SqlCommand(sql, myConnection);

          SqlDataReader reader = null;
          reader = SelectCommand.ExecuteReader();

        // If there is data in the reader then the IP already exists in the db
        // If there is no data in the reader the IP does not exist in the db
        // so we can continue to import in the database

            if(reader.Read())
                {
                MessageBox.Show("It exists!");
                checkresult = true;
                // Do nothing skip to next one
                }
            else
                {
                MessageBox.Show("It does not exist!");
                checkresult = false;
                // Start import in the database
                }

http://www.catalogged.net/


Verwijderd

Dit lijkt me iets beter
code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
if (reader.HasRows()
{  if(reader.Read())
    {
       MessageBox.Show("It exists!");
       checkresult = true;
       // Do nothing skip to next one
    }
    else
    {
       MessageBox.Show("Error reading...");
       checkresult = false;
       // Start import in the database
    }
}
else
{
       MessageBox.Show("It does not exist!");
       checkresult = false;
       // Start import in the database
}

  • Raenius
  • Registratie: December 2003
  • Laatst online: 20-08-2021
Beetje laat, maar nog bedankt voor de laatste reply om het nog iets waterdichter te krijgen...

Ben nu bezig met een Class die de database connectie etc regelt...

http://www.catalogged.net/

Pagina: 1