練功房推薦書單

  • 猛虎出柙雙劍合璧版--最新 OCA / OCP Java SE 7 Programmer 專業認證 (電子書)
  • 流浪教師存零股存到3000萬(全新增修版)(書+DVD)
  • 開始在關西自助旅行(京都‧大阪‧神戶‧奈良)(全新增訂版)
  • 不敗教主的300張股票存股術
在ACCESS 2007裡面的VBA一個問題? RSS feed
Forum Index » SQL Server
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: 706
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] [MSN]
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: 706
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] [MSN]
 
Forum Index » SQL Server
Go to:   
Mobile view