none
VB.NET 2008 連結資料庫多主鍵問題。 RRS feed

  • 問題

  • 請教各位高手,
    以下是小妹的程式


    Imports System.Data.OleDb
    Public Class Form5
        Private WithEvents currManager As CurrencyManager
        Private Sub Form5_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
            Dim objDataSet As DataSet = getWineDataSet("wines")
            NowineTextBox.DataBindings.Add("Text", objDataSet.Tables("wines"), "Nowine")
            CountryTextBox.DataBindings.Add("Text", objDataSet.Tables("wines"), "country")
            PlaceTextBox.DataBindings.Add("Text", objDataSet.Tables("wines"), "place")
            ManorTextBox.DataBindings.Add("Text", objDataSet.Tables("wines"), "manor")
            YearTextBox.DataBindings.Add("Text", objDataSet.Tables("wines"), "year")
            GrapesTextBox.DataBindings.Add("Text", objDataSet.Tables("wines"), "grapes")
            EvaluationTextBox.DataBindings.Add("Text", objDataSet.Tables("wines"), "evaluation")
            AwardTextBox.DataBindings.Add("Text", objDataSet.Tables("wines"), "award")
            WineTextBox.DataBindings.Add("Text", objDataSet.Tables("wines"), "wine")
            PurchasedateTextBox.DataBindings.Add("Text", objDataSet.Tables("wines"), "purchasedate")
            currManager = DirectCast(Me.BindingContext(objDataSet.Tables("wines")), CurrencyManager)
            currManager_PositionChanged(Me, New System.EventArgs)
        End Sub
        Function getWineDataSet(ByVal tableName As String) As DataSet

            Dim str As String = "Provider=Microsoft.Jet.Oledb.4.0;Data source=D:\蓉\專題\wineok(1).mdb"

            Dim str1 As String = "Select * From country,evaluation,wine WHERE country.Nowine = evaluation.Nowine AND country.Nowine = wine.Nowine"

            Dim conn As OleDbConnection = New OleDbConnection(str)

            conn.Open()
            Dim dataset1 As DataSet = New DataSet()

            Dim adapter1 As OleDbDataAdapter = New OleDbDataAdapter(str1, conn)

            adapter1.Fill(dataset1, tableName)
            Return dataset1
        End Function
        Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click

            currManager.Position = 0
        End Sub
        Private Sub Button2_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button2.Click
            If currManager.Position = 0 Then
                Beep()
            Else
                currManager.Position -= 1
            End If
        End Sub
        Private Sub Button3_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button3.Click
            If currManager.Position >= currManager.Count - 1 Then
                Beep()
            Else
                currManager.Position += 1
            End If
        End Sub
        Private Sub Button4_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button4.Click
            currManager.Position = currManager.Count - 1
        End Sub
        Private Sub currManager_PositionChanged(ByVal sender As Object, ByVal e As System.EventArgs) Handles currManager.PositionChanged
            ' 顯示目前記錄編號/記錄總數
            lblPosition.Text = currManager.Position + 1 & _
                               "/" & currManager.Count
        End Sub
    End Class

    在此小妹有個問題,
    我的問題在於說我想要的TEXT的內容
    是在多個表單
    但是他們有著相同的主鍵(主鍵是:Nowine)
    所以當我把紅色(加粗)的地方加上去的時候,
    他就會出現錯誤
    拿掉便OK!

    請問一下這個要如何解決呢?

    謝謝各位!!!
    2010年12月17日 下午 02:56

解答

  • Dim str1 As String = "Select wine.Nowine, wine.你要顯示的欄位,wine.你要顯示的欄位,country.你要顯示的欄位, evaluation.* From country,evaluation,wine WHERE country.Nowine = evaluation.Nowine AND country.Nowine = wine.Nowine"

    類推


    歡迎參觀我的Blog.NET菜鳥自救會
    • 已標示為解答 斯麥兒 2010年12月18日 上午 01:11
    • 已取消標示為解答 斯麥兒 2010年12月18日 上午 04:13
    • 已提議為解答 Bill ChungMVP, Moderator 2010年12月18日 上午 04:18
    • 已標示為解答 斯麥兒 2010年12月19日 上午 08:59
    2010年12月17日 下午 03:27
    版主
  • 有一個可能是

    Level 是 Access的關鍵字或保留字

    試試看

    Select
    
     wine.Nowine,wine.wine,wine.purchasedate,wine.amount,wine.Nomoney,country.country, country.place,country.manor,country.year,country.grapes,evaluation.evaluation,
    evaluation.award,characteristic.smell,characteristic.mouthfeel,characteristic.color,
    characteristic.alcohol,characteristic.Nolevel,characteristic.thermometer,characteristic.food,[level].[level] From
    
     (((wine LEFT
    
     OUTER
    
     JOIN
    
     country ON
    
     wine.Nowine = country.Nowine)LEFT
    
     OUTER
    
     JOIN
    
     evaluation ON
    
     country.Nowine = evaluation.Nowine)LEFT
    
     OUTER
    
     JOIN
    
     characteristic ON
    
     wine.Nowine = characteristic.Nowine)LEFT
    
     OUTER
    
     JOIN
    
     [level] ON
    
     characteristic.Nolevel = [level].Nolevel
    

     


    先查MSDN文件庫
    再用GOOGLE搜尋
    才到論壇來發問

     

    這是論壇不是技術支援中心
    沒有人得無償解答你的問題

     

    在標題或文章註明很急
    不會增加網友回覆速度
    • 已標示為解答 斯麥兒 2010年12月19日 上午 09:00
    2010年12月18日 下午 01:53

所有回覆

  • 您好

    在以下的 SQL 語法中,不要使用 *

    Dim str1 As String = "Select * From country,evaluation,wine WHERE country.Nowine = evaluation.Nowine AND country.Nowine = wine.Nowine"

    例如以下這樣,把你需要的欄位 SELECT 出來就好

    Dim str1 As String = "Select wine.Nowine, country.country, evaluation.* From country,evaluation,wine WHERE country.Nowine = evaluation.Nowine AND country.Nowine = wine.Nowine"



    歡迎參觀我的Blog.NET菜鳥自救會
    2010年12月17日 下午 03:05
    版主
  • 小歐您好:

    先謝謝您的解答

    但是小妹還有另一個問題

    就是其實我有一些需要顯示的資料

    是來自wine資料表中

    如果設定Select wine.Nowine

    這樣其它的資料就無法顯示了,

    那請問在這種情況下要怎麼下語法呢?

    謝謝您。


    我不太聰明 但是可以慢慢學習, 請點醒我的錯誤和迷思 謝謝!
    2010年12月17日 下午 03:10
  • Dim str1 As String = "Select wine.Nowine, wine.你要顯示的欄位,wine.你要顯示的欄位,country.你要顯示的欄位, evaluation.* From country,evaluation,wine WHERE country.Nowine = evaluation.Nowine AND country.Nowine = wine.Nowine"

    類推


    歡迎參觀我的Blog.NET菜鳥自救會
    • 已標示為解答 斯麥兒 2010年12月18日 上午 01:11
    • 已取消標示為解答 斯麥兒 2010年12月18日 上午 04:13
    • 已提議為解答 Bill ChungMVP, Moderator 2010年12月18日 上午 04:18
    • 已標示為解答 斯麥兒 2010年12月19日 上午 08:59
    2010年12月17日 下午 03:27
    版主
  • 好的,那我先試試看

    感謝您的回答˙ˇ˙。

    謝謝♥


    我不太聰明 但是可以慢慢學習, 請點醒我的錯誤和迷思 謝謝!
    2010年12月18日 上午 01:10
  • 小妹有另外一個問題想請教一下

    小歐的方法小妹已試過,可以用,非常感謝您。

    那小妹的另外一個問題是

    Dim str1 As String = "Select wine.Nowine,wine.wine,wine.purchasedate,wine.amount,wine.Nomoney,country.country, country.place,country.manor,country.year,country.grapes,evaluation.evaluation,
    evaluation.award,characteristic.smell,characteristic.mouthfeel,characteristic.color,
    characteristic.alcohol,characteristic.Nolevel,characteristic.thermometer,characteristic.food,level.level From (((wine LEFT OUTER JOIN country ON wine.Nowine = country.Nowine)LEFT OUTER JOIN evaluation ON country.Nowine = evaluation.Nowine)LEFT OUTER JOIN characteristic ON wine.Nowine = characteristic.Nowine)LEFT OUTER JOIN level ON characteristic.Nolevel = level.Nolevel "

    小妹標粗的地方

    因為Nolevel不是characteristic的主鍵

    卻有另外一個關聯表level是連至此(characteristic的主鍵為Nowine)

    那小妹想請教一下喔~

    因為只要是主鍵相聯都OK

    那這個部份的話要如何解決呢?


    我不太聰明 但是可以慢慢學習, 請點醒我的錯誤和迷思 謝謝!
    2010年12月18日 上午 04:16
  • 沒有規定一定要主鍵才能Join .

     

     


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

    恩,我查資料庫的書也OK

    可是不知道為什麼我跑程式的時候就會出現錯誤。


    我不太聰明 但是可以慢慢學習, 請點醒我的錯誤和迷思 謝謝!
    2010年12月18日 上午 06:56
  • 什麼樣的錯誤 ?

    在現實生活中,你和誰在一起的確很重要,甚至能改變你的成長軌跡,決定你的人生成敗。 和什麼樣的人在一起,就會有什麼樣的人生。 和勤奮的人在一起,你不會懶惰; 和積極的人在一起,你不會消沈; 與智者同行,你會不同凡響; 與高人為伍,你能登上巔峰。
    2010年12月18日 上午 07:26
    版主
  • 多主見表格用DataBinding 會使用 CommandBuilder ,在多主鍵的表格可能有這個問題:

    [VBNET] CommandBuilder 並未能正確以主鍵值為限制條件


    論壇是網友平等互助 保證解答請至 微軟技術支援服務
    提問時,錯誤情境描述與錯誤訊息很重要,情境描述包含你做了什麼,預期的結果與實際發生的結果。一個最爛的問法範例:「我的電腦電腦怎麼不能開機?」誰知道你家是不是沒電還是你根本找不到電源鈕。
    2010年12月18日 上午 10:38
  • TO Bill & 心冷

    他會出現FROM 子句中的語法錯誤。

    我看過您給的網站

    現在的問題是我適用ACCESS2003

    當初建置的時候好像就不能有雙主鍵

    但是關聯連結OK

    因此當時並未考慮太多

    那我看過那篇文章後也發現

    我沒有辦法去除主鍵(因為當初資料庫的建置方向是老師決定的,所以可能不能改)

    那請問如果參考以上問題那還有辦法解決嗎

    因為我看了一下網站微軟的解答

    The expected behaviour not supported in Access

    那是說這樣ACCESS就不能選擇主鍵之外的鍵來做JOIN了呢?

    謝謝:)


    我不太聰明 但是可以慢慢學習, 請點醒我的錯誤和迷思 謝謝!
    2010年12月18日 下午 12:36
  • 那篇其實是說單一表格有兩個唯一值以上,微軟承認他的 driver 都當成主鍵處理,然後就打架,所以唯一值一個以上的,應該自行程式控制,而非交由 .Net 自動控制。

    非主鍵仍可 Join ,有 Join 的欄位最好加索引,會比較快。


    論壇是網友平等互助 保證解答請至 微軟技術支援服務
    提問時,錯誤情境描述與錯誤訊息很重要,情境描述包含你做了什麼,預期的結果與實際發生的結果。一個最爛的問法範例:「我的電腦電腦怎麼不能開機?」誰知道你家是不是沒電還是你根本找不到電源鈕。
    2010年12月18日 下午 01:01
  • 我不清楚我的問題是否和文章的一樣

    我現在的情況是,當我下指令JOIN非主鍵的欄位時

    他就會出現FROM子句的錯誤

    就會變成非主鍵連結時我就無法成功開啟視窗

    我不知道是哪邊出了問題ˊˋ

    因為資料庫的書本上也沒說非主鍵不能下語法

    但是我實作的時候就是有語法上的錯誤

    謝謝您。


    我不太聰明 但是可以慢慢學習, 請點醒我的錯誤和迷思 謝謝!
    2010年12月18日 下午 01:24
  • 有一個可能是

    Level 是 Access的關鍵字或保留字

    試試看

    Select
    
     wine.Nowine,wine.wine,wine.purchasedate,wine.amount,wine.Nomoney,country.country, country.place,country.manor,country.year,country.grapes,evaluation.evaluation,
    evaluation.award,characteristic.smell,characteristic.mouthfeel,characteristic.color,
    characteristic.alcohol,characteristic.Nolevel,characteristic.thermometer,characteristic.food,[level].[level] From
    
     (((wine LEFT
    
     OUTER
    
     JOIN
    
     country ON
    
     wine.Nowine = country.Nowine)LEFT
    
     OUTER
    
     JOIN
    
     evaluation ON
    
     country.Nowine = evaluation.Nowine)LEFT
    
     OUTER
    
     JOIN
    
     characteristic ON
    
     wine.Nowine = characteristic.Nowine)LEFT
    
     OUTER
    
     JOIN
    
     [level] ON
    
     characteristic.Nolevel = [level].Nolevel
    

     


    先查MSDN文件庫
    再用GOOGLE搜尋
    才到論壇來發問

     

    這是論壇不是技術支援中心
    沒有人得無償解答你的問題

     

    在標題或文章註明很急
    不會增加網友回覆速度
    • 已標示為解答 斯麥兒 2010年12月19日 上午 09:00
    2010年12月18日 下午 01:53
  • ALEX您好:

    我照您的方式做了

    SELECT 陳述式含有保留字或是拼錯或漏掉的引數,或標點符號不正確。

    出現這樣的錯誤

    顯然可能不是保留字

    我自己在ACCESS中下同樣的語法也不能跑

    那會是這部份語法的問題嗎?

    還請各位對資料庫熟悉的高手解惑一下

    感激!


    我不太聰明 但是可以慢慢學習, 請點醒我的錯誤和迷思 謝謝!
    2010年12月18日 下午 02:04
  • 我用2003測試

    並不會有 Select 含有保留字或是拼錯或漏掉的引數,或標點符號不正確。 的問題

    請確認你的Select 子句是正確的

     


    先查MSDN文件庫
    再用GOOGLE搜尋
    才到論壇來發問

    這是論壇不是技術支援中心
    沒有人得無償解答你的問題

    在標題或文章註明很急
    不會增加網友回覆速度
    2010年12月18日 下午 03:14
  • 恩,我後來用了許多方法找到語法了

    謝謝各位的幫忙♥


    我不太聰明 但是可以慢慢學習, 請點醒我的錯誤和迷思 謝謝!
    2010年12月19日 上午 08:59