0

我在訪問2010年中創建了一個ado創建的記錄集,它從sql server 2008 r2上的存儲過程返回9個不同的字段。如何在兩個字段中包含逗號時使用ADO將多個字段插入到表中

我想使用這個記錄集(填充)將所有記錄插入匹配輸出的表中。我的問題是,兩個字段是名稱字段,其中包含逗號。例如,史密斯約瑟夫 - 我需要將該逗號插入相應的字段。現在它由於字段中的逗號而引發錯誤。

這裏是我使用的代碼:

Option Compare Database 

'Executes the filtering routine 
Private Sub cmdApplyFilter_Click() 

'If txtStartDate.Value And txtEndDate.Value Is Not Null Then 
' QuickFilter 
'Else 
' DefaultRun 
'End If 
QuickFilter 
'********** Filter as you type ********** 

'Private Sub txtFilter_Change() 
' QuickFilter 
'End Sub 


End Sub 

'Perform the actual filtering on the subform 
Private Sub QuickFilter() 

Dim Sql As String 
Dim filter As String 

If txtStartDate = vbNullString Then 
    'Reset the filter if the textbox is empty 
    'This will be the default sql statement to fill the subreport 
    SubForm.Form.FilterOn = False 
Else 
    'Some common substitutions that users may have already inserted as wildchars 
    filter = Replace(txtStartDate, "%", "*") 
    filter = Replace("*" & filter & "*", "**", "*") 
    'Construct the filter for the sql statement 
    '/*********** GROUP BY GOES HERE ***********/ 

    'Assign the filter to the subform 
    'SubForm.Form.filter = Sql 
    'SubFomr.Form.FilterOn = True 
End If 
End Sub 


Private Sub Form_Load() 
    'Sets up the connection with the sql server database retrieves the stored procedure,  executes it and puts the result set into a table 
    Dim Conn As ADODB.Connection 
    Dim Cmd As ADODB.Command 
    Dim Rs As ADODB.Recordset 
    Dim rs1 As ADODB.Recordset 
    Dim Connect As String 
    Dim filter As String 


    Connect = "Provider =SQLNCLI10; Data Source=10.50.50.140; Initial Catalog=CCVG; User Id = oe; Password = Orth03c0; " 

    'Establish the connection with sql server 
    Set Conn = New ADODB.Connection 
    Conn.ConnectionString = Connect 
    Conn.Open 

    'Open the recorset 
    Set Cmd = New ADODB.Command 
    Cmd.ActiveConnection = Conn 
    Cmd.CommandText = "dbo.cusGenNoNotesReport" 
    Cmd.CommandType = adCmdStoredProc 

    Set Rs = Cmd.Execute() 








    Dim x As Integer 

    If Not Rs.BOF And Not Rs.EOF Then 
    If Not Rs.BOF Then Rs.MoveFirst 
    Do Until Rs.EOF 
     For x = 0 To Rs.Fields.Count - 1 
      MsgBox Rs.Fields(x) 
      'DoCmd.RunSQL "INSERT INTO tblNoNotes (Provider, Facility, TicketNumber,  Charges, FinancialClass, CPT, CPTDescription, PatientFullName, DateOfEntry) SELECT " & Rs.Fields(x).Value & "" 
     Next x 
      Rs.MoveNext 
    Loop 
End If 


    'Process results from recordset, then close it. 
    'DoCmd.RunSQL "INSERT INTO tblNoNotes (Provider, Facility, TicketNumber, Charges,  FinancialClass, CPT, CPTDescription, PatientFullName, DateOfEntry) VALUES (""" & Rs![Provider] & """,""" & Rs![Facility] & """ & Rs![TicketNumber] & """, """ & Rs![Charges] & """, """ & Rs![FinancialClass] & """, """ & Rs![CPT] & """, """ & Rs![CPTDescription] & """, """ & Rs![PatientFullName] & """, """ & Rs![DateOfEntry] & """)" 

    Rs.Open 
    Rs.Close 
    Conn.Close 
    Set Rs = Nothing 
    Set Cmd = Nothing 
    Set Conn = Nothing 


End Sub 
+0

ADO.Net如何參與這個問題? – HansUp

+0

這是我創建記錄集的方式,我想也許它會與答案有關。只是想通過 – MaximusPrime

+0

抱歉,我迷路了。我不明白你是怎樣一起使用ADO.Net和Access VBA的。這可能有助於向我們展示代碼,以便我們可以看到您如何試圖將記錄集中的數據添加到表中。 (順便說一句,downvote不是從我。) – HansUp

回答

3

你有一個ADO記錄集,Rs,其中包含要添加到您的Access表中的數據。與其試圖修復INSERT語句來添加每一行,應該更容易爲目標表打開一個DAO記錄集,並通過添加一個新的DAO記錄集行來存儲每個ADO行的值。雖然這仍然是一種RBAR (row by agonizing row)方法,但它應該比構建和執行每行的INSERT語句快得多。

首先,請確保將Option Explicit添加到模塊的聲明部分。

Option Compare Database 
Option Explicit 

然後使用該代碼的ADO記錄集數據追加到表。

Dim db As DAO.Database 
Dim rsDao As DAO.Recordset 
Set db = CurrentDb 
Set rsDao = db.OpenRecordset("tblNoNotes", _ 
    dbOpenTable, dbAppendOnly + dbFailOnError) 

Do While Not Rs.EOF 
    rsDao.AddNew 
    rsDao!Provider.Value = Rs!Provider.Value 
    rsDao!Facility.Value = Rs!Facility.Value 
    rsDao!TicketNumber.Value = Rs!TicketNumber.Value 
    rsDao!Charges.Value = Rs!Charges.Value 
    rsDao!FinancialClass.Value = Rs!FinancialClass.Value 
    rsDao!CPT.Value = Rs!CPT.Value 
    rsDao!CPTDescription.Value = Rs!CPTDescription.Value 
    rsDao!PatientFullName.Value = Rs!PatientFullName.Value 
    rsDao!DateOfEntry.Value = Rs!DateOfEntry.Value 
    rsDao.Update 
    Rs.MoveNext 
Loop 

rsDao.Close 
Set rsDao = Nothing 
Set db = Nothing 

注意這種方法意味着你不必擔心PatientFullName是否包含逗號或撇號......或引用正確的字段值產生一個有效的INSERT聲明奮鬥。您只需將一個記錄集字段的值存儲到另一個記錄集中的相應字段。

+1

+ 1爲」Git '呃完成'的方法,對於「RBAR」(我會竊取那個表達式......)。 –

+0

我不能爲那個人聲稱,Gord,但我也喜歡。我以爲有一篇關於RBAR的維基百科文章,但現在我能找到的是[this](http://en.wikipedia.org/wiki/List_of_acronyms:_R#RB) – HansUp

+0

謝謝Hans!這是一個完美的解決方案! – MaximusPrime

1

我認爲你在這裏抱怨的真正問題是你的ADO Recordset中的數據有引號(有時候叫做撇號)。任何時候您的數據中可能都存在引號,您需要在使用SQL語句中的數據之前檢查並轉義它們。您不僅需要知道這些信息,還需要進行過濾和創建WHERE語句。例如:

Replace(Rs![PatientFullName], "'", "''") 

更簡單的方法是製作自己的小功能。 「PQ」代表填充引號。你可以任意命名。

PQ(rs![PatientFullName]) 

Public Function PQ(s as String) as String 
    PQ = Replace(s, "'", "''") 
End Function 

但我也同意HansUp的說法,使用插入記錄集更容易。我基本上從不再使用SQL插入語句,除了那些我沒有選擇的地方,例如SQL Server T-SQL。

請注意,如果你想使用INSERT語句,你應該考慮使用以下:

CurrentDb.Execute "INSERT INTO Statement Goes Here", dbFailOnError 

這被認爲是比DoCmd.RunSQL一個更強大的解決方案,主要是因爲它的上下文中運行底層數據庫引擎而不是Access接口。使用CurrentDb.Execute可防止您必須使用DoCmd.SetWarning語句來關閉警告。

+0

好點,哈倫。如果他想堅持'INSERT'語句,我認爲他應該使用參數查詢作爲'DAO.QueryDef',提供參數值並執行'QueryDef'。這樣引用的變化就會消失。 – HansUp

+0

@HansUp是否可以在代碼中爲DAO參數查詢提供值?我不能說我見過這樣做。出於某種原因,我的印象是,如果你想要真正的參數查詢,你必須使用ADO。 – HK1

+2

當然。有關示例,請參見[此SO回答](http://stackoverflow.com/a/15772749/77335)。你實際上並不需要顯式的'PARAMETERS'子句;它仍然可以沒有一個工作。 – HansUp

相關問題