練功房推薦書單

  • 猛虎出柙雙劍合璧版:最新 OCA / OCP Java SE 7 Programmer 專業認證
  • 流浪教師存零股存到3000萬
  • SCJP 6.0認證教戰手冊(第二版)Oracle Certified Professional Java Programmer(附光碟)
  • 小資女艾蜜莉:我的資產翻倍存股筆記
在ACCESS 2007裡面的VBA一個問題?  RSS feed
討論區首頁 » SQL Server
發表人 內容
crc2121

九級學員

註冊時間: 2011-01-17 16:28:20
文章: 10
離線
原本是依賴拉物件方式搭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]

註冊時間: 2007-01-02 22:20:40
文章: 704
來自: 台北
離線
這個問題我看很久還是沒什麼頭緒,如果要寫支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());
		}
	}

}

 檔案名稱 DBAccess.java [Disk] 下載
 描述 Use JDBC to access MS Access2007 db
 檔案大小 1 Kbytes
 下載次數:  3 次


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

九級學員

註冊時間: 2011-01-17 16:28:20
文章: 10
離線
我用圖來解釋一下好了。

圖中的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]

註冊時間: 2007-01-02 22:20:40
文章: 704
來自: 台北
離線
假設您已經把所有的資料由一個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
 檔案名稱 DBAccess.java [Disk] 下載
 描述 動態建立table之程式
 檔案大小 3 Kbytes
 下載次數:  7 次

 檔案名稱 Database1.accdb [Disk] 下載
 描述 測試用的Access資料庫檔
 檔案大小 932 Kbytes
 下載次數:  6 次


分享經驗 累積智慧
[WWW] [MSN]
 
討論區首頁 » SQL Server
前往: