none
VB2008 Access跨資料庫查詢方式 RRS feed

  • 問題

  • 請教各位大大 小弟想在資料庫的應用有這個疑問

    使用語言:VB2008

    資料庫:Access

    功能 :同時對2個資料庫作查詢並將結果顯示在同一個Table中

    這是我查的資料語法如下:

    Dim Sql As String
                Dim SqlConn As New OleDbConnection
                Dim STR As String
                Dim mycom As OleDbCommand
                Dim ds As DataSet
                       STR = "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=C:\ALARM.mdb;User ID=Admin;Password=;"
                SqlConn = New OleDbConnection(STR)
                SqlConn.Open()
                Sql = "select * from ALARM union (Select *  from [Provider=Microsoft.Jet.OLEDB.4.0;Data Source=C:\ALARM1.mdb;User ID=Admin;Password=;].ALARM )"
    
                           mycom = New OleDbCommand(Sql, SqlConn)
                Using OleDbda As New OleDbDataAdapter(Sql, SqlConn)
    
                    ds = New DataSet()
                    OleDbda.Fill(ds, "ALM_table")
                       DataGridView1.DataSource = ds.Tables("ALM_table")
                End Using
                SqlConn.Close()
                SqlConn.Dispose()

    Error Message = "無效的引數。"

    請教各位大大對於跨資料庫查詢應該如何做呢?若我還要加入時間區塊查詢應該加哪?


    新手上路

    2012年2月24日 上午 01:46

解答

  • 我直覺是覺得這個做法一定不行. 因為要兩個不同的 connection .

    如果硬要用兩個 mdb 檔, 看來就是分開讀, 然後用 DataTable.Merge 方法 併成一個 DataTable


    在現實生活中,你和誰在一起的確很重要,甚至能改變你的成長軌跡,決定你的人生成敗。 和什麼樣的人在一起,就會有什麼樣的人生。 和勤奮的人在一起,你不會懶惰; 和積極的人在一起,你不會消沈; 與智者同行,你會不同凡響; 與高人為伍,你能登上巔峰。

    • 已標示為解答 eblue 2012年2月24日 上午 11:20
    2012年2月24日 上午 07:10

所有回覆

  • Select *  from [Provider=Microsoft.Jet.OLEDB.4.0;Data Source=C:\ALARM1.mdb;User ID=Admin;Password=;].ALARM


    這一句,你認為OK是嗎?

    另,為什麼要切 Alarm 與 Alarm1?

    不能同一DB多個Table處理嗎?


    blog.kkbruce.net
    Plurk
    Google+專頁

    春有百花秋有月,
    夏有涼風冬有雪,
    若無閒事在心頭,
    便是人間好時節。

    2012年2月24日 上午 03:14
  • 我直覺是覺得這個做法一定不行. 因為要兩個不同的 connection .

    如果硬要用兩個 mdb 檔, 看來就是分開讀, 然後用 DataTable.Merge 方法 併成一個 DataTable


    在現實生活中,你和誰在一起的確很重要,甚至能改變你的成長軌跡,決定你的人生成敗。 和什麼樣的人在一起,就會有什麼樣的人生。 和勤奮的人在一起,你不會懶惰; 和積極的人在一起,你不會消沈; 與智者同行,你會不同凡響; 與高人為伍,你能登上巔峰。

    • 已標示為解答 eblue 2012年2月24日 上午 11:20
    2012年2月24日 上午 07:10
  • 感謝大大的回應!

    會分2各MDB!因客戶端監控溫度希望每秒紀錄!目前監控點為20各故一天會產出172800筆資料!所以小弟想一天產出一個MDB檔1來比數不會太多2來也不用擔心超出2G的限制!這只是初步的想法!所以才試著做看看!

    Bill大大給的方向小弟來去試試!謝謝


    新手上路

    2012年2月24日 上午 09:11
  • 看看這篇:

    In 子句的使用範例

    ADO.NET 用 OleDB ,SQL 裡面用 ODBC


    論壇是網友平等互助 保證解答請至 微軟技術支援服務


    提問時,錯誤情境描述與錯誤訊息很重要,情境描述包含你做了什麼,預期的結果與實際發生的結果。一個最爛的問法範例:「我的電腦電腦怎麼不能開機?」誰知道你家是不是沒電還是你根本找不到電源鈕。

    2012年2月24日 下午 03:51
  • 題外話:

    每天都有這麼大的資料量,直覺應該考慮換成大型資料庫,例如SQL SERVER

    另外可能也要思考一下,針對太久的資料進行資料的轉移,這樣效能上也會比較好


    軟體開發領域裡區區一個迷途工程師
    MyBlog: http://www.dotblogs.com.tw/ian/
    開發ASP.NET您要瞭解的基楚


    • 已編輯 No.18MVP 2012年2月24日 下午 04:10
    2012年2月24日 下午 04:10
  • 這個功能是客戶也算是朋友要追加的功能!所以是Free 讓他們對上頭作績效!所以才用這個方法主要是他們想有歷史曲線圖的功能,所以我就當練功!所以小弟做法如下:

    建立一個Base檔僅有資料格式:為ITEM/S_TIME/W1/W2---/W20 共22個欄位

    每天另存出一個以日期為名的資料庫: ex:20120228.MDB

    資料庫查詢方面 我也只利用Bill大的方法

    EX:收尋區間 2012/02/26 00:00:00 ~2012/02/28 10:00:00

      Label1.Text = Now.ToString("HH:mm:ss")
            Dim buffer_Table As New DataTable
            Dim D_Cunt As Integer = DateDiff(DateInterval.Day, DateTimePicker1.Value, DateTimePicker2.Value)
            Dim Base_D As Date = DateTimePicker1.Value
            Dim FileMane As String
            For i As Integer = 0 To D_Cunt
                FileMane = "D:\資料庫測試\Data" & DateAdd(DateInterval.Day, i, Base_D).ToString("yyyyMMdd") & ".mdb"
                If My.Computer.FileSystem.FileExists(FileMane) Then
                    Try
                        Dim D_Table As New DataTable
                        Dim Sql As String
                        Dim SqlConn As New OleDbConnection()
                        Dim STR As String
                        Dim ds As New DataSet
                        Dim d1 As Date = DateTimePicker1.Value
                        Dim d2 As Date = DateTimePicker2.Value
                        STR = "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" & FileMane & ";User ID=Admin;Password=;"
                        SqlConn = New OleDbConnection(STR)
                        SqlConn.Open()
                        Sql = ("select * from REPORT where S_TIME BETWEEN @d1 AND @d2  ORDER BY ITEM")
                        Using OleDbda As New OleDbDataAdapter(Sql, SqlConn)
                            OleDbda.SelectCommand.Parameters.AddWithValue("@d1", (DateTimePicker1.Text))
                            OleDbda.SelectCommand.Parameters.AddWithValue("@d2", (DateTimePicker2.Text))
                            ds = New DataSet()
                            OleDbda.Fill(ds, "data_table")
                            D_Table = ds.Tables("data_table")
                            buffer_Table.Merge(D_Table)
                            DataGridView1.DataSource = buffer_Table
                        End Using
                        SqlConn.Close()
                    Catch ex As Exception
                        MessageBox.Show(ex.Message, "記錄", MessageBoxButtons.OK, MessageBoxIcon.Error)
                    End Try
                End If
            Next
            DataGridView1.ColumnHeadersDefaultCellStyle.Alignment = DataGridViewContentAlignment.MiddleCenter
            DataGridView1.Columns(1).DefaultCellStyle.Format = ("yyyy/MM/dd HH:mm:ss")
            Label2.Text = Now.ToString("HH:mm:ss")

    這樣就能取得所要的資料!

    相對的繪圖的作法 就用ExecuteReader的方式將值讀置陣列中 用OWC元件繪出!

    功能有!但相對的 速度就隨著資料筆數而變 目前主索引鍵=S_TIME

    若查詢27日10點-28日10點 表單匯出約9秒 匯出曲線圖為7秒

    顯然速度有些慢

    故小弟想再測試將20各點獨立出來變20個REPORT也就是表單格式修改為ITEM/S_TIME/SV/PV 試試

    耗時約縮短至3-4秒


    新手上路



    • 已編輯 eblue 2012年2月28日 上午 03:02
    2012年2月28日 上午 02:41
  • 2資料表欄位相同的話,將查詢改成這樣應該就沒問題(含密碼)。

    "select * from ALARM union All (Select *  from [C:\ALARM1.mdb;PWD=1234].ALARM )"

    資料插入(含密碼)

            Dim str As String = "Provider=Microsoft.Jet.Oledb.4.0;Data source=C:\db1.mdb;Jet OLEDB:Database Password=0926"   
            Dim conn As OleDbConnection = New OleDbConnection(str)  
            conn.Open()  
    
            Dim str1 As String = "insert into Table1 (col1, col2) select col1, col2 from [C:\db2.mdb;PWD=0926].Tabl2 "
            Dim cmd As OleDbCommand = New OleDbCommand(str1, conn)  
            cmd.ExecuteNonQuery()
            conn.close()

    資料查詢(含密碼)

            Dim str As String = "Provider=Microsoft.Jet.Oledb.4.0;Data source=C:\db1.mdb;Jet OLEDB:Database Password=0926"   
            Dim conn As OleDbConnection = New OleDbConnection(str)  
            conn.Open()  
            Dim str2 As String = "Select col1, col2 From Table1 Union All Select col1, col2 From [C:\db2.mdb;PWD=0926].Table2"
            Dim cmd As OleDbCommand = New OleDbCommand(str2, conn)
            Dim read As OleDbDataReader = cmd.ExecuteReader
            Dim table As DataTable = New DataTable
            table.Load(read)
    
            DataGridView1.DataSource = table


    • 已編輯 C.Kevin 2013年5月30日 上午 08:39
    2013年5月30日 上午 08:38