webForumDet fria alternativet

Problem med arv

2 svar · 217 visningar · startad av dho

dhoMedlem sedan aug. 20022 027 inlägg
#1

Hallå!

Jag har fått problem med ett arv som jag inte riktigt har klurat ut hur jag ska lösa. Tanken är att jag ska ha en superklass som ska innehålla den kod som krävs för att ansluta till en databas. I basklassen kommer då SQL-frågor och sånt att finnas. Anledningen till att jag vill ha den här uppdelningen är att vi är två stycken som arbetar på ett projekt där vi båda kommer att använda oss av samma databas men där SQL-frågorna kommer att skilja sig en del. Därför vore det smidigt med en superklass och varsin basklass.

Superklassen ser ut så här:

import java.sql.*;
import java.util.*;

class projektDB
{
	public projektDB(String dbHandle) throws SQLException
	{
		try 
		{
			Class.forName("sun.jdbc.odbc.JdbcOdbcDriver");  
			String url = "jdbc:odbc:projekt";
			
			Connection dbConnection = DriverManager.getConnection(url);
			Statement state = dbConnection.createStatement();
		} 
		
		catch(ClassNotFoundException exception)
		{
			System.err.println("Error loading JDBC driver: "+exception.toString());
		}
	}
}

Superklassen kompilerar iofs men det är en sak som jag undrar över. Den kräver att man antingen fångar eller kastar ett SQLException för att kompilera. Om jag nu väljer att kasta den (det finns ju ingen SQL-kod i superklassen) fångas den då av basklassen om jag har motsvarande catch där?

Basklassen:

import java.awt.*;
import java.sql.*;
import java.util.*;

class projektDBmusik extends projektDB
{	
	private String sql;
	
	public projektDBmusik(String dbHandle)
	{		
		super(dbHandle);
	}

	public void insertDB()
	{
		sql = "SELECT artistname FROM artist;";
		
		try
		{
		
			state.execute(sql);	
			ResultSet mySet = state.getResultSet(); 
		
			while(mySet.next())
			{
				System.out.println(mySet.getString("artistname"));
			}
		}
		
		catch (SQLException exception) 
		{
			System.out.println ("SQL Error: " + exception.toString());
		}
	}
}

Det är den här delen som är inte alls vill fungera. Det den klagar på är "cannot resolve symbol symbol : variable state". Var ska man skapa sitt Statement? Har prövat att lägga det i både superklass och basklass men jag har fått samma problem. Det känns som om jag missat något elementärt här så alla tips är välkommna. Om det är något jag behöver förtydliga så är det bara att säga till.

ViktorMedlem sedan aug. 20021 752 inlägg
#2

State är deklarerad bara innom funktionen (konstruktorn) projektDB (eller egentligen bara innom try blocket) utanför den, när den funktionen är avslutad så finns inte state längre, den är död. Deklarera state globalt för klassen så ska det fungera.

import java.sql.*;
import java.util.*;

class projektDB
{
                public Statement state=null;
	public projektDB(String dbHandle) throws SQLException
	{
		try 
		{
			Class.forName("sun.jdbc.odbc.JdbcOdbcDriver");  
			String url = "jdbc:odbc:projekt";
			
			Connection dbConnection = DriverManager.getConnection(url);
			state = dbConnection.createStatement();
		} 
		
		catch(ClassNotFoundException exception)
		{
			System.err.println("Error loading JDBC driver: "+exception.toString());
		}
	}
}

Om en funktion kastar ett exception så måste den anroppande klassen fånga det eller kasta det vidare.

En annan sak, själv skulle jag tycka att det vore trevligt om din super klass retunerade en connection istället för ett statement, då kan du även använda preparedstatments om du vill det osv, det ger mer frihet.

/Viktor

dhoMedlem sedan aug. 20022 027 inlägg
#3

Hmm.. klart det måste deklareras globalt. Ibland blir man blind. :)

Tack för svaret, det andra får jag testa imorrn (eller senare idag blir det visst :) )

126 ms totalt · 3 externa anrop · v20260731065814-full.3ab8d573
0 ms — hämta forumlista (cache)
0 ms — hämta statistik (cache)
123 ms — hämta tråd, inlägg och bilagor (db)