Java odbc database, sql statements find en update

Pagina: 1
Acties:

  • William/Ax3
  • Registratie: Augustus 2000
  • Laatst online: 13-09 00:35

William/Ax3

We are Starstuff

Topicstarter
Kan iemand mij helpen met deze opdracht want ik snap er namelijk de ballen van. De bestanden die er bij horen staan op de link.

De opdracht is als volgt.

Implementeer de methoden find() en update() van klasse DbSession.

public boolean find( String strSelect )
Deze methode voert een SELECT * FROM WHERE opdracht uit. De conditie achter het keyword WHERE wordt bepaald door het argument strSelect. De methode find levert true op als de de SELECT slaagt, anders wordt de waarde false teruggeven.

public int update( String strSelect, String strValues )
Deze methode voert een UPDATE SET WHERE opdracht uit. De conditie achter het keyword WHERE wordt ingevuld door het argument strSelect. De nieuwe recordwaarden achter het keyword SET wordt ingevuld door het argument strValues.


En dan als tweede:

Implementeer de functionaliteit achter de knoppen Find en Update van DbApplet. De overige knoppen zijn reeds geïmplementeerd en dienen als voorbeeld.

Knop Find
De Find werkt op basis van query-by-example (QBE). Dit betekent dat het record wordt gezocht dat voldoet aan alle ingevulde waarden van de schermvelden.
Voorbeeld: het tekstveld LastName is gevuld met de waarde Staartjes en het tekstveld FirstName is gevuld met de waarde Aart. De overige tekstvelden zijn leeg. Find toont dan het record dat voldoet aan beide condities.

Knop Update
Nadat een record met behulp van Find is getoond, kunnen de waarden in de tekstvelden worden gewijzigd. De nieuwe waarden worden vervolgens met de knop Update teruggeschreven naar de database. Gebruik als selectiecriterium voor de update het ID-veld. Dit is een niet-invoerveld waarvan de waarde door Access wordt gegenereerd.

Het probleem bij mij is dat find altijd een false uitslag geeft. En nee het ligt niet aan dat de odbc koppeling niet werkt, want ik kan namelijk wel de add uitvoeren en dan wordt de database ook daadwerkelijk aangepast.

de link:
http://rendo.dekooi.nl/~william/opdr.zip

|WOW Daggerspine | Troll Hunter Axejess |


  • MisterData
  • Registratie: September 2001
  • Laatst online: 07-09 20:23
Welke DB gebruik je ??? Welke query wordt er gegenereerd door de Find knop ?? Graag wat meer info dan kan ik je proberen te helpen :)

  • MisterData
  • Registratie: September 2001
  • Laatst online: 07-09 20:23
Ik zie het al, de odbc-jdbc bridge. Op zich nix mis mee, maar werkt trager dan direct JDBC en werkt niet met alle drivers :( Heb al es probleempjes gehad met MS Acces, maar ik gebruik nu MySQL en dat is een heel stuk stabieler :)

  • William/Ax3
  • Registratie: Augustus 2000
  • Laatst online: 13-09 00:35

William/Ax3

We are Starstuff

Topicstarter
db is een addresbook met firstname, lastname e mial ect in acces.

De query in dbsession:
public boolean find( String strSelect )
{
try
{
statement = connection.createStatement();
String sqlCommand = "SELECT * FROM " + tableName +
"WHERE " + strSelect;


statement.executeQuery( sqlCommand );
statement.close();
return true;
}
catch( SQLException se )
{
se.printStackTrace();
return false;
}

En de applet moet dan als je firstname en/of lastname invuld true of false geven.

|WOW Daggerspine | Troll Hunter Axejess |


  • Alarmnummer
  • Registratie: Juli 2001
  • Laatst online: 09-07-2024

Alarmnummer

-= Tja =-

Vind het wel behoorlijk klinken als: dit is mijn huiswerk, willen jullie het maken? Probeer zelf eerst eens wat, en geef ons daar de source van. Kunnen wij ook zien dat je er zelf iets aan doet.

en ik zal niet helemaal de boeman uithangen:
http://java.sun.com/j2se/1.4/docs/api/java/sql/Statement.html

succes ermee :)

[edit]heb er (te) lang over gedaan om dit mailtje te typen :)

  • Alarmnummer
  • Registratie: Juli 2001
  • Laatst online: 09-07-2024

Alarmnummer

-= Tja =-

Aha... dat ziet er beter uit.. Je weet dat je als gevolg van je select query een resultset terug krijgt? Deze resultset is dus een lijst van records die voldoet aan je wensen. Misschien kan je iets doen met de lengte ivm find methode?

  • Alarmnummer
  • Registratie: Juli 2001
  • Laatst online: 09-07-2024

Alarmnummer

-= Tja =-

Op maandag 03 december 2001 19:40 schreef MisterData het volgende:
Ik zie het al, de odbc-jdbc bridge. Op zich nix mis mee, maar werkt trager dan direct JDBC en werkt niet met alle drivers :( Heb al es probleempjes gehad met MS Acces, maar ik gebruik nu MySQL en dat is een heel stuk stabieler :)
De odbc-jdbd bridge is inderdaad een stukje trager dan rechtstreeks naar de db zelf toe te gaan. Maar de vraag is of dit voor je applicatie iets uitmaakt. De meeste apps die vragen geen tig records per sec. En access is inderdaad niet altijd even vriendelijk. Maar om nou access met MySQL te gaan vergelijken. MySQL is inderdaad een database, maar voor zover ik weet word daar veel funtionaliteit niet ondersteund. transacties, concurrency control etc (correct me if I`m wrong). En dat is de reden dat ik die niet gebruik. Heb hier meestal een sybase database draaien. Sybase 5 volledig (zat op cd`tje van school) en Sybase 7 trial versie en die bevallen met uitstekend. Gebruik verder ook access (omdat mensen bij ons het gebruiken, en het ontwerpen gaat zo lekker :P ) en Interbase van borland. Leuk ding. gratis, bloedsnel. Maar ondersteund geen concurrency control!

  • MisterData
  • Registratie: September 2001
  • Laatst online: 07-09 20:23
MySQL is bloedsnel en stabiel, i don't care over die functies die ik toch nooit gebruik :) Maareh, ik haal over m'n netwerk toch iets van 1ms/record (10000 records) met een select query. Ik weet niet hoe dat met odbc zit maar da's dus iig trager :)

  • MisterData
  • Registratie: September 2001
  • Laatst online: 07-09 20:23
Transacties geloof ik wel weet ik niet zeker :) Staat in de manual :)

  • Alarmnummer
  • Registratie: Juli 2001
  • Laatst online: 09-07-2024

Alarmnummer

-= Tja =-

Op maandag 03 december 2001 20:04 schreef MisterData het volgende:
Transacties geloof ik wel weet ik niet zeker :) Staat in de manual :)
Ook concurrency control? (Lijkt me wel makkelijk als je meerdere users er aan hebt hangen). En welke jdbc versie ondersteunt het?

  • MisterData
  • Registratie: September 2001
  • Laatst online: 07-09 20:23
Wat is concurrency control ?? Dat je tabelletjes kan locken ??? Ja dat kan. Ik heb driver 2.x van mark Matthews van http://www.mysql.com. Volgens mij werkt het, alleen sommige statements (helaas ook CREATE TABLE,ALTER TABLE) zitten er nog niet in :(

  • Alarmnummer
  • Registratie: Juli 2001
  • Laatst online: 09-07-2024

Alarmnummer

-= Tja =-

Ik bedoel niet zozeer een hele tabel locken, maar bijvoorbeeld alleen de records die door je select statement zijn geselecteerd. Een hele tabel locken is wel heel erg cru :)

  • William/Ax3
  • Registratie: Augustus 2000
  • Laatst online: 13-09 00:35

William/Ax3

We are Starstuff

Topicstarter
OK heb nu in die session class dit staan en dat moet wel goed zijn:
public boolean find( String strSelect )
{
try
{
statement = connection.createStatement();
String sqlCommand = "SELECT * FROM addresses " +
"WHERE lastname" + strSelect;

statement.executeQuery ( sqlCommand );
System.out.println( sqlCommand );
return true;
}
catch( SQLException se )
{
se.printStackTrace();
return false;
}


Allen volgens mij klopt er in de applet nu iets niet. kep nu:

private void performFind()
{
String strSelect = "";

if( !lstTextField[FIND_FIELD-1].getText().equals("") )
{
strSelect = lstKolomNaam[FIND_FIELD-1] + "=" + lstTextField[FIND_FIELD-1].getText();

//
if( dbSession.find( strSelect ) )
bericht( "true" );
else
bericht( "false" );
}
else bericht( "find: Geen record geselecteerd" );


Hij geeft bij alle namen die in de database aan dat het false is. En als je nix invuld zegt die inderdaad find: Geen record geselecteerd.

|WOW Daggerspine | Troll Hunter Axejess |


  • Alarmnummer
  • Registratie: Juli 2001
  • Laatst online: 09-07-2024

Alarmnummer

-= Tja =-

Als je een goed kijkt naar de docs, dan zie je dat bij de methode: executeQuery(sql) het volgende staat:
Executes the given SQL statement, which returns a single ResultSet object.

Parameters:
sql - an SQL statement to be sent to the database, typically a static SQL SELECT statement
Returns:
a ResultSet object that contains the data produced by the given query; never null
Throws:
SQLException - if a database access error occurs or the given SQL statement produces anything other than a single ResultSet object
voor volledige docs:
http://java.sun.com/j2se/1.4/docs/api/java/sql/Statement.html#executeQuery(java.lang.String)

En lees nu eens de docs door van ResultSet
http://java.sun.com/j2se/1.4/docs/api/java/sql/ResultSet.html

Misschien kun je iets met die resultset en zijn lengte doen. (niet misschien, maar wel zeker).

  • Alarmnummer
  • Registratie: Juli 2001
  • Laatst online: 09-07-2024

Alarmnummer

-= Tja =-

En als een select query niet lukt (omdat er geen 'geschikte' records zijn gevonden) dan word er geen SQLException opgeworpen! Dus die manier van aanpak is niet de juiste. Probeer iets met die resultset te doen. hint hint ;)

en bekijk dit ook maar eens:
http://java.sun.com/docs/books/tutorial/jdbc/basics/retrieving.html

Verwijderd

Op maandag 03 december 2001 19:54 schreef Alarmnummer het volgende:
Interbase van borland. Leuk ding. gratis, bloedsnel. Maar ondersteund geen concurrency control!
Echt wel, maar op een iets andere manier. :)

http://www.cvalde.com/document/InternalsOverview.htm

  • Alarmnummer
  • Registratie: Juli 2001
  • Laatst online: 09-07-2024

Alarmnummer

-= Tja =-

Ik zal er eens naar kijken (zogauw de dns server niet zo moeilijk zit te doen :( ) Voor een bedrijf waar ik een stuk software heb geschreven moet er nog een multi user variant worden gemaakt en moet gebruik worden gemaakt van dezelfde db. Ik gebruik (voor single user) ook interbase, en als dit iets is dan scheelt het me veel werk om een andere gratis db te vinden. thanx. (Jammer dan ze het niet gewoon netjes doen via jdbc en interclient).

Verwijderd

De grootste setup die we nu met IB hebben, is een conferentiecentrum met 100 zalen, 500 kamers en overdag zo'n 45 concurrent users. Draait op IB 5.6 onder Linux op een dual processor machine, en dat draait als een zonnetje.
IB is best wel aardig in te zetten in een multi user omgeving... :)

Is trouwens wel een Delphi/BDE app, dus geen jdbc en/of InterClient.

  • Alarmnummer
  • Registratie: Juli 2001
  • Laatst online: 09-07-2024

Alarmnummer

-= Tja =-

AARRGGHHHH Delphi ;)

(slechte ervaring in een ver ver verleden)

  • William/Ax3
  • Registratie: Augustus 2000
  • Laatst online: 13-09 00:35

William/Ax3

We are Starstuff

Topicstarter
Hmm begrijp nu dat 1: de sql query nog niet hellemaal goed is hij gooit bij where zowel de lastname als de ingevulde naam tussen accolades hiervoor moet ik dus hier iets veranandere.

En 2 ik moet er voor zorgen dat hij daarna nog wat met de resultset moet doen. Daar ga ik nu verder mee kep nu bij de finds:


Dbsession:
public boolean find( String strSelect )
{
String sqlCommand = "SELECT * " +
"FROM " + tableName +
" WHERE '" + strSelect + "'";

System.out.println( sqlCommand );

try
{
statement = connection.createStatement();
ResultSet rs = statement.executeQuery ( sqlCommand );
if (rs==null)
{
return false;
}
else
{
return true;
}
}
catch( SQLException se )
{
se.printStackTrace();
return false;
}
}
En ja weet het er moet nog een loopje in dat die ook de andere velden pakt.


kep nu in applet:


private void performFind()
{

String strSelect = "";

if( !lstTextField[FIND_FIELD-1].getText().equals("") )
{
strSelect = lstKolomNaam[FIND_FIELD-1] + "=" + lstTextField[FIND_FIELD-1].getText();

if( dbSession.find( strSelect ) == true)
bericht( "true" );
else
bericht( "false" );
}
else
bericht( "find: Geen record geselecteerd" );

}

|WOW Daggerspine | Troll Hunter Axejess |


  • Alarmnummer
  • Registratie: Juli 2001
  • Laatst online: 09-07-2024

Alarmnummer

-= Tja =-

Je krijgt altijd een resultset object terug (dus geen null) ook al zitten er geen records in. Je begint bij een resultset (wat dus een lijst met records is) altijd voor het 1e record. Je kunt dan met hasNext kijken of er nog volgende records zijn. In jouw geval hoef je alleen maar te controleren of er iets gevonden is, en zal je een rs.hasNext() kunnen gebruiken om aan te tonen of iets gevonden is of niet.

Tips:
1 gebruik code tags om je code vb
[ code ]
System.out.println("blablabla")
[/ code ]

en dan zonder spaties natuurlijk :) en dan krijg je
code:
1
System.out.println("blablabla");

Hierdoor wordt het een stuk leesbaarder.

2 ik gebruik altijd als laatste stuk van mijn variable naam de naam van de class. Vb.
code:
1
HashMap namenHashMap = new HashMap();

Hierdoor kun je altijd zien wat voor soort object je te pakken hebt.

  • prutsger
  • Registratie: Oktober 2001
  • Laatst online: 14-09 15:22
Tss William, heb je MUV en SQL niet gehaald? Probeer je op deze manier aan je studiepunten te komen? Haha...

  • Onno
  • Registratie: Juni 1999
  • Niet online
En de toegevoegde waarde van zo'n reactie in een thread van meer dan een week oud is...?

  • prutsger
  • Registratie: Oktober 2001
  • Laatst online: 14-09 15:22
FF omhoogschoppen. Mischien helpt het hem nog...
Pagina: 1