2014-10-20 52 views
1

我有一個數據庫,其中包含水井的位置和與這些井相關的大量屬性。從我所知道的所有表格都與WELL_ID(井的名稱)關聯,這是「短文本」數據類型。在數據庫內部,我正在嘗試獲取數據的現有查詢(如果我犯了一個錯誤並且弄亂了某些內容,我不想混淆這些表)。功能MS Access VBA數據類型不匹配

我已經創建了一個表單,用戶輸入東,北的UTM座標以及搜索半徑,然後單擊「搜索」按鈕。點擊搜索後,程序會創建[qryUTM_NAD83]的記錄集,然後計算每個井的徑向距離,如果它位於指定的搜索範圍內,則使用INSERT INTO將其存儲在新的[Search_Results]表中。

現在,一旦井被識別爲符合搜索條件,WELL_ID就被存儲,並被傳遞到一個函數,該函數搜索不同查詢[qryFormation]的記錄集。該查詢具有一對多關係,每個地質層都有一個記錄,每個地理層具有相同的WELL_ID(即每個井具有多個層,但所有這些層具有相同的WELL_ID)。我需要將這些圖層連接成一個字符串,將它們傳遞迴搜索函數並將其添加到[Search_Results]表中。但是,我在SQL語句中遇到數據類型不匹配錯誤。

這裏是我的代碼: (我省略了一些代碼的部分,以保持它的短爲你所有)

Private Sub SearchButton_Click() 

Dim WellID As String, mySQL As String, NewLitho As String 

'Creating new recordsets from [qryUTM_NAD83] table 
Dim rs1 As DAO.Recordset 
'[ZONE] is just user specified, helps me narrow the search a little 
Set rs1 = CurrentDb.OpenRecordset("SELECT [qryUTM_NAD83].* " & _ 
            "FROM [qryUTM_NAD83] " & _ 
            "WHERE [ZONE] = " & frmZone, dbOpenDynaset) 
'Moving through the recordset 
rs1.MoveFirst 
Do While Not rs1.EOF 
    'calculated radius, r , for this well (omitted) 
    If r < SearchRadius Then 
     WellID = Val(rs1.Fields("WELL_ID").Value) 
     NewLitho = LithoTransform(WellID) 
     mySQL = "INSERT INTO [Search_Results] " & _ 
       "([WELL_ID], [Easting], [Northing], [Radius], [Lithology]) " & _ 
       "VALUES (" & WellID & ", " & x & ", " & y & ", " & r & ", " & NewLitho & ")" 
     CurrentDb.Execute mySQL 
     rs1.MoveNext 
    End If 
Loop 
End Sub 

功能:在發生 (錯誤「設置RS2 ......」 - 數據類型不匹配)

Public Function LithoTransform(CurrentID As String) As String 

'CurrentID is the well which was identified as being within the search radius 
Dim rs2 As DAO.Recordset 
Dim mySQL2 As String 

'SQL statement and new recordset of the well we are looking at in the search 
Debug.Print CurrentID 
mySQL2 = "SELECT [qryFormation].* " & _ 
     "FROM [qryFormation] " & _ 
     "WHERE [WELL_ID] = " & CurrentID 
Set rs2 = CurrentDb.OpenRecordset(mySQL2, dbOpenDynaset) 

'Move through recordset rs2 and concatenating into new string 
'Bunch of code here 

'Close recordset set it to 'nothing' 

End Function 

回答

1

由於WELL_ID是文本類型,包括周圍的CurrentID價值的報價,當你將其包含在WHERE條款。所以最快的修復大概是這樣的......

mySQL2 = "SELECT [qryFormation].* " & _ 
     "FROM [qryFormation] " & _ 
     "WHERE [WELL_ID] = '" & CurrentID & "'" 

但是,您可以切換到參數查詢代替,從而避免報價的問題。下面是一個未經測試的例子...

Dim db As DAO.Database 
Dim qdf AS DAO.QueryDef 
Dim rs2 As DAO.Recordset 
Dim mySQL2 As String 

mySQL2 = "SELECT [qryFormation].* " & _ 
     "FROM [qryFormation] " & _ 
     "WHERE [WELL_ID] = [which_id]" 
Set db = CurrentDb 
Set qdf = db.CreateQueryDef(vbNullString, mySQL2) 
qdf.Parameters("which_id") = CurrentID 
Set rs2 = qdf.OpenRecordset 

使用Access幫助系統檢查功能,語法等,在該代碼的情況下,我做了錯誤。由於您是Access的新手,因此您可以輕鬆使用其幫助系統。

+0

非常感謝,我有一種感覺,它會像這樣簡單。我一直在使用Access幫助和網絡搜索,只有很多東西可以包裹我的頭。我會嘗試進行參數查詢。再次感謝! – Sashman 2014-10-20 18:14:09