0

Access 2010 で作成したレコードセットがあり、SQL サーバー 2008 r2 のストアド プロシージャから 9 つの異なるフィールドを返します。

このレコードセット (データを入力する) を使用して、すべてのレコードを出力に一致するテーブルに挿入しようとしています。私の問題は、フィールドの 2 つがカンマを含む名前フィールドであることです。たとえば、スミスさん、ジョセフさん、そのカンマを適切なフィールドに挿入する必要があります。現在、フィールドにコンマがあるため、エラーがスローされます。

私が使用しているコードは次のとおりです。

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
4

2 に答える 2

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 Server T-SQL などのオプションがない場合を除いて、基本的に SQL Insert ステートメントを使用することはありません。

挿入ステートメントを使用する場合は、次の使用を検討する必要があることに注意してください。

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

DoCmd.RunSQLこれは、Access インターフェイスではなく、基になるデータベース エンジンのコンテキストで実行されるため、よりも堅牢なソリューションであると考えられています。を使用すると、ステートメントCurrentDb.Executeを使用DoCmd.SetWarningして警告をオフにする必要がなくなります。

于 2013-10-09T01:21:44.097 に答える