練功房推薦書單

  • 猛虎出柙雙劍合璧版--最新 OCA / OCP Java SE 7 Programmer 專業認證 (電子書)
  • 流浪教師存零股存到3000萬(全新增修版)(書+DVD)
  • 開始在關西自助旅行(京都‧大阪‧神戶‧奈良)(全新增訂版)
  • 不敗教主的300張股票存股術

在ACCESS 2007裡面的VBA一個問題? RSS feed
Forum Index » Database
Author Message
crc2121

九級學員

Joined: 2011/1/17
Messages: 10
Offline
原本是依賴拉物件方式搭SQL去做,後來伺服器掛點,最新一次的備份出來用CSV的;所以想問若是用Office 2007裡面ACCESS,用ACCESS去做每一行(即每一行筆資料)查詢的SQL語法應該怎麼下?或是怎麼寫支程式進去下達?如下:


原始資料表 ALL_TABLE

索引_欄位1_欄位2_欄位3_欄位4

01_XXXX1_YYYY1_ZZZZ1_WWWW1

02_XXXX2_YYYY2_ZZZZ2_WWWW2
.  . .  . .
.  . .  . .
.  . .  . .
.  . .  . .
.  . .  . .
NN_XXXXN_YYYYN_ZZZZN_WWWWN

每一行各別轉如下:

01_TABLE

索引_欄位1_欄位2_欄位3_欄位4

01_XXXX1_YYYY1_ZZZZ1_WWWW1

02_TABLE

索引_欄位1_欄位2_欄位3_欄位4

02_XXXX2_YYYY2_ZZZZ2_WWWW2

........一直到

NN_TABLE

索引_欄位1_欄位2_欄位3_欄位4

NN_XXXXN_YYYYN_ZZZZN_WWWWN


~以上~

有這樣子SQL語法嗎?或是VBA應該怎麼寫?還是java可以做到?

懇請賜教,感激不盡~
andowson

七段學員
[Avatar]

Joined: 2007/1/2
Messages: 710
Location: 台北
Offline
這個問題我看很久還是沒什麼頭緒,如果要寫支Java程式透過 JDBC 去存取 Microsoft Access 2007 的資料表可以參考這個範例程式:

import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.ResultSetMetaData;

public class DBAccess {

/**
* @param args
*/
public static void main(String[] args) {
try {

Class.forName("sun.jdbc.odbc.JdbcOdbcDriver");
String url = "jdbc:odbc:Driver={Microsoft Access Driver (*.mdb, *.accdb)};DBQ=C:/test/Database1.accdb";
Connection conn = DriverManager.getConnection(url, "", "");
PreparedStatement pstmt = conn.prepareStatement("SELECT * FROM ALL_TABLE");

ResultSet rs = pstmt.executeQuery();
ResultSetMetaData rsmd = rs.getMetaData();
int i = 0;
while (rs.next()) {
String column1 = rs.getString("欄位1");
String column2 = rs.getString("欄位2");
String column3 = rs.getString("欄位3");
String column4 = rs.getString("欄位4");
i++;
System.out.println(i+"_TABLE: ");
for (int j = 1; j < rsmd.getColumnCount(); j++) {
System.out.print(rsmd.getColumnName(j) + "_");
}
System.out.println(rsmd.getColumnName(rsmd.getColumnCount()));
System.out.println(i+"_"+column1+"_"+column2+"_"+column3+"_"+column4);
}
rs.close();
pstmt.close();
conn.close();
} catch (Exception e) {
System.err.println("Got an exception!");
System.err.println(e.getMessage());
}
}

}

 Filename DBAccess.java [Disk] Download
 Description Use JDBC to access MS Access2007 db
 Filesize 1 Kbytes
 Downloaded:  3 time(s)


分享經驗 累積智慧
[WWW]
crc2121

九級學員

Joined: 2011/1/17
Messages: 10
Offline
我用圖來解釋一下好了。

圖中的ACCESS2007建立的資料庫中的test資料表(如紅線上方),透過SQL或是VBA在或者是JAVA都可,能否把圖中的綠藍紫框個別製作成資料表且每個資料表由001一直至做到XXX為止。
http://img200.imageshack.us/f/002wui.jpg/
其中ID欄位重複是和段欄位做分段用。

p.s所有資料型態皆為備忘,如圖:http://img195.imageshack.us/f/001anpk.jpg/
andowson

七段學員
[Avatar]

Joined: 2007/1/2
Messages: 710
Location: 台北
Offline
假設您已經把所有的資料由一個csv檔案匯入到Access 2007中的一個table (table name是test),然後依據欄位ID的值之不同,將所有ID相同之紀錄分別插入(Insert)到相同的資料表,不同的ID則放到不同的資料表中(table name為三位數字,由001開始,依序遞增)。由於不知道資料表可能有多少個,所以採用由程式動態建立。參考範例程式如下:


import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.ResultSetMetaData;
import java.sql.SQLException;
import java.sql.Statement;
import java.sql.Timestamp;

public class DBAccess {

/**
* @param args
*/
public static void main(String[] args) {
try {
// Connect to database
Class.forName("sun.jdbc.odbc.JdbcOdbcDriver");
String url = "jdbc:odbc:Driver={Microsoft Access Driver (*.mdb, *.accdb)};DBQ=C:/test/Database1.accdb";
Connection conn = DriverManager.getConnection(url, "", "");
// Fetch data from table
PreparedStatement pstmt = conn.prepareStatement("SELECT * FROM test");
ResultSet rs = pstmt.executeQuery();
ResultSetMetaData rsmd = rs.getMetaData();
int i = 0;
String oldID = "";
String tableName = "";
while (rs.next()) {
// Fetch a record
String ID = rs.getString("ID");
Timestamp diagnoseDate = rs.getTimestamp("看診日期");
String pulseCondition = rs.getString("脈象");
int segment = rs.getInt("段");
String chiefComplaint = rs.getString("主訴");
String disease = rs.getString("病名");
String prescription = rs.getString("配方");
// Change tableName if ID change
if (!oldID.equals(ID)) {
i++;
oldID = ID;
tableName = String.format("%03d", i);
System.out.println(tableName);
Statement stmt = conn.createStatement();
try {
// We may need to run this program several times
stmt.execute("DROP TABLE " + tableName);
} catch (SQLException se) {
// Just ignore the table does not exist exception
}
stmt.execute("CREATE TABLE " + tableName + " ([ID] CHAR(10), [看診日期] DATETIME, [脈象] TEXT, [段] INTEGER, [主訴] TEXT, [病名] TEXT, [配方] TEXT)");
for (int j = 1; j < rsmd.getColumnCount(); j++) {
System.out.print(rsmd.getColumnName(j) + "_");
}
System.out.println(rsmd.getColumnName(rsmd.getColumnCount()));
}
// Store each record into new table
String sql = "INSERT INTO " + tableName + " ([ID], [看診日期], [脈象], [段], [主訴], [病名], [配方]) VALUES(?, ?, ?, ?, ?, ?, ?)";
PreparedStatement pstmt2 = conn.prepareStatement(sql);
pstmt2.setString(1, ID);
pstmt2.setTimestamp(2, diagnoseDate);
pstmt2.setString(3, pulseCondition);
pstmt2.setInt(4, segment);
pstmt2.setString(5, chiefComplaint);
pstmt2.setString(6, disease);
pstmt2.setString(7, prescription);
pstmt2.executeUpdate();
}
rs.close();
pstmt.close();
conn.close();
} catch (Exception e) {
System.err.println("Got an exception!");
System.err.println(e.getMessage());
}
}

}


參考資料:
http://msdn.microsoft.com/en-us/library/bb208866%28v=office.12%29.aspx
 Filename DBAccess.java [Disk] Download
 Description 動態建立table之程式
 Filesize 3 Kbytes
 Downloaded:  7 time(s)

 Filename Database1.accdb [Disk] Download
 Description 測試用的Access資料庫檔
 Filesize 932 Kbytes
 Downloaded:  6 time(s)


分享經驗 累積智慧
[WWW]
 
Forum Index » Database
Go to:   
Mobile view