大家好,來請教各位
我要撈資料庫畫一個長條圖
SQL連線OK
長條圖顯示OK
但從SQL抓資料顯示到長條圖中(X)
都會跟我說
我試著要把值抓出來但都失敗.....
以下程式碼
@ManagedBean
public class ChartView implements Serializable {
private BarChartModel barModel;
private HorizontalBarChartModel horizontalBarModel;
public int a[];
public int b[];
public int i=0;
/*
set/get
*/
@PostConstruct
public void init() {
createBarModels();
}
private void createBarModels() {
createBarModel();
}
private void createBarModel() {
barModel = initBarModel();
Axis xAxis = barModel.getAxis(AxisType.X);
Axis yAxis = barModel.getAxis(AxisType.Y);
yAxis.setMin(0);
yAxis.setMax(200);
}
private BarChartModel initBarModel() {
BarChartModel model = new BarChartModel();
ChartSeries boys = new ChartSeries();
for(int j=0;j<a.length;j++)
{
boys.set(a[j], b[j]);//畫長條圖
}
model.addSeries(boys);
return model;
}
public List<Purtxt> getPurData()
{
List<Purtxt> purlist=new LinkedList<Purtxt>();
try
{
Class.forName("oracle.jdbc.driver.OracleDriver");
Connection con=DriverManager.getConnection(....);
Statement st=con.createStatement();
System.out.println(st);
ResultSet rs=st.executeQuery(
"select pmn20,pmn31 from pmn_file where pmn31>0 and rownum<10");
while(rs.next())
{
a[i]=rs.getInt("pmn31");
b[i]=rs.getInt("pmn20");//存SQL數據
/*問題主要在這裡,想把值放進去,但發現他放不進去.....
a[i],b[i]依舊是空值
我有試著將a[i],b[i]直接存入數字(不使用SQL)她就可以顯示.....
求把rs.getInt("pmn31")值存入a[i]的方法...感謝
*/
i++;
}
rs.close();
st.close();
con.close();
}
//catch.....
return purlist;
}
}
感謝
如果你要使用int[], 就必須要先分配固定的記憶體空間(分配記憶體並非初始化), 假設各分配10個int:
public int a[]=new int[10];
public int b[]=new int[10];
但是, 你面對的可能是不一定長度的資料庫資料, 建議您使用List, Map,..., 例如,
List<Integer> a = new ArrayList<Integer>();
List<Integer> b = new ArrayList<Integer>();
然後
a.add(rs.getInt("pmn31"));
b.add(rs.getInt("pmn20"));
"我試過將陣列初始化a[i]={0}"
{0}的大括號等於是記憶體分配(new), 而且初始化a[0]為0
bizpro你好
試了您的方法,發現還是無法傳值......
.......
private BarChartModel initBarModel() {
BarChartModel model = new BarChartModel();
getPurData();
ChartSeries boys = new ChartSeries();
boys.setLabel("Boys");
for(int j=0;j<a.length;j++)
{
boys.set(c.get(j), d.get(j));
}
model.addSeries(boys);
return model;
}
public List<Purtxt> getPurData()
{
List<Purtxt> purlist=new LinkedList<Purtxt>();
try
{
//connect sql
ResultSet rs=st.executeQuery(
"select pmn20,pmn31 from pmn_file where pmn31>0 and rownum<10 ");
for(i=0;i<10;i++)
{rs.next();
Purtxt e=new Purtxt();
purlist.add(e);
c.add(rs.getInt("pmn31"));
d.add(rs.getInt("pmn20"));
//我值放進去他還是無法顯示...
e.setCoun(rs.getInt("pmn31"));**
//一定要這樣才能顯示到網頁,但這樣只能用table方式呈現
無法畫長條圖.......
}
//connect close
}
您有配置記憶體給c和d嗎?
List<Integer> c = new ArrayList<Integer>()
List<Integer> d = new ArrayList<Integer>()
如果你讀長條圖資料非得用int[],那再把c跟d轉回來就好了啊?
這樣可以嗎?
public int a[]=new int[10];
public int b[]=new int[10];
List<Integer> c = new ArrayList<Integer>(10);
List<Integer> d = new ArrayList<Integer>(10);
之前只有a和b, 現在多出c和d...
如果您要配置記憶體給int[] a和b, 需設定固定數量的記憶體空間:
public int a[]=new int[10];
public int b[]=new int[10];
如果您要配置記憶體給ArrayList c和d, 不需設定固定數量的記憶體空間:
List<Integer> c = new ArrayList<Integer>();
List<Integer> d = new ArrayList<Integer>();
bizpro
現在有畫出東西了,謝謝
想問一下
那這樣我一定要先規定陣列大小
那如果我每天的資料量不一樣
(例如推出新產品,10樣變12樣)
是不是就只能自己改a[10]==>a[12]阿
還是我可以自動偵測資料庫的筆數去畫
所以我才建議要用不固定長度的ArrayList<Integer>
, 而不是固定長度的int[]
List<Integer> c = new ArrayList<Integer>();
List<Integer> d = new ArrayList<Integer>();
//draw chart
.....
ChartSeries boys = new ChartSeries();
boys.setLabel("Boys");
for(int j=0;j<a.length;j++)
{
//boys.set(a[j], b[j]);
boys.set(c.get(j), d.get(j));
}
.....
c.add(rs.getInt("pmn31"));
d.add(rs.getInt("pmn20"));//store data
結果圖就出不來了.......
請問我有那裡沒寫到嗎?謝謝
可以不用ArrayList, int[],...:
ChartSeries boys = new ChartSeries();
boys.setLabel("Boys");
while(rs.next())
{
boys.set(new Integer(rs.getInt("pmn31")).toString, new Integer(rs.getInt("pmn20")));
}
rs.close();
st.close();
con.close();
如果您要先取值給ArrayList以供後續利用, 也可:
//先取值:
//...資料庫ResultSet操作...
ArrayList<String> pmn31 = new ArrayList<String>();
ArrayList<Integer> pmn20 = new ArrayList<Integer>();
while(rs.next())
{
pmn31.add(new Integer(rs.getInt("pmn31")).toString());
pmn20.add(new Integer(rs.getInt("pmn20")));
}
rs.close();
st.close();
con.close();
//...
//之後利用:
ChartSeries boys = new ChartSeries();
boys.setLabel("Boys");
for (int i = 0; i < pmn31.size(); i++) {
boys.set(pmn31.get(i), pmn20.get(i));
}
以上程式碼只做描述用. 請自行除錯.
bizpro
OK啦!!
感謝大大