strSQL = "INSERT CLEAN_MILE_DUPES (" & vbCrLf _ & " CASE_IDENTIFIER" & vbCrLf _ & " ,DOCUMENT_TYPE" & vbCrLf _ & " ,DOCUMENT_NUMBER" & vbCrLf _ & " ,MILESTONE" & vbCrLf _ & " ,MILESTONE_DATE_TYPE" & vbCrLf _ & " ,MILESTONE_DATE)" & vbCrLf _ & "(SELECT CASE_IDENTIFIER" & vbCrLf _ & " ,DOCUMENT_TYPE" & vbCrLf _ & " ,DOCUMENT_NUMBER" & vbCrLf _ & " ,MILESTONE" & vbCrLf _ & " ,MILESTONE_DATE_TYPE" & vbCrLf _ & " ,MILESTONE_DATE " & vbCrLf _ & " FROM CASE_MILESTONE_TEMP)"
What is the exact error message that you get? What error number you get from oConn.Errors(0).NativeError (oConn being your connection object)?
A few things come to my mind straight away. Are the tables identical? Is any of the fields char/varchar type and contains '-character in the source table? Null values?
Do you have an error handler in your code where you can set a breakpoint and check, what does the strSQL variable actually hold?
USE [EditorTest] GO /****** Object: Table [dbo].[CASE_MILESTONE_TEMP] Script Date: 12/04/2008 10:35:36 ******/ SET ANSI_NULLS ON GO SET QUOTED_IDENTIFIER ON GO SET ANSI_PADDING ON GO CREATE TABLE [dbo].[CASE_MILESTONE_TEMP]( [CASE_IDENTIFIER] [int] NULL, [MILESTONE_DATE] [datetime] NULL, [TEXT_FIELD] [varchar](50) NULL, [DROP_THIS_FIELD] [varchar](50) NULL ) ON [PRIMARY] GO SET ANSI_PADDING OFF
USE [EditorTest] GO /****** Object: Table [dbo].[CLEAN_MILE_DUPES] Script Date: 12/04/2008 10:35:05 ******/ SET ANSI_NULLS ON GO SET QUOTED_IDENTIFIER ON GO SET ANSI_PADDING ON GO CREATE TABLE [dbo].[CLEAN_MILE_DUPES]( [CASE_IDENTIFIER] [int] NULL, [MILESTONE_DATE] [datetime] NULL, [TEXT_FIELD] [varchar](50) NULL ) ON [PRIMARY] GO SET ANSI_PADDING OFF
USE [EditorTest] GO CREATE UNIQUE NONCLUSTERED INDEX [test] ON [dbo].[CLEAN_MILE_DUPES] ( [CASE_IDENTIFIER] ASC ) WITH (IGNORE_DUP_KEY = ON)
Option Explicit Private oConn As ADODB.Connection Private oCmd As ADODB.Command Private Sub Command1_Click() ' Dim strSQL As String Dim ConStr As String On Error GoTo ErrorHandler ConStr = "PROVIDER=SQLOLEDB;Data Source=JASMIN\SQLEXPRESS; INITIAL CATALOG=EditorTest; User ID=XXXXXXX; Password=XXXXXXX;" Set oConn = New ADODB.Connection oConn.Open (ConStr) strSQL = "INSERT CLEAN_MILE_DUPES (" & vbCrLf _ & " CASE_IDENTIFIER" & vbCrLf _ & " ,MILESTONE_DATE" & vbCrLf _ & " ,TEXT_FIELD) " & vbCrLf _ & "(SELECT CASE_IDENTIFIER" & vbCrLf _ & " ,MILESTONE_DATE" & vbCrLf _ & " ,TEXT_FIELD " & vbCrLf _ & " FROM CASE_MILESTONE_TEMP)" Set oCmd = New ADODB.Command oCmd.CommandText = strSQL oCmd.CommandType = adCmdText Set oCmd.ActiveConnection = oConn oCmd.Execute Sub_Exit: oConn.Close Exit Sub ErrorHandler: ' Breakpoint here Resume Sub_Exit End Sub
? oConn.Errors(0).Description Duplicate key was ignored.
I'm trying to re-produce your case.
Here's my simplified tables.
Temp-table:Visual Basic 4 / 5 / 6 Syntax (Toggle Plain Text)
USE [EditorTest] GO /****** Object: Table [dbo].[CASE_MILESTONE_TEMP] Script Date: 12/04/2008 10:35:36 ******/ SET ANSI_NULLS ON GO SET QUOTED_IDENTIFIER ON GO SET ANSI_PADDING ON GO CREATE TABLE [dbo].[CASE_MILESTONE_TEMP]( [CASE_IDENTIFIER] [int] NULL, [MILESTONE_DATE] [datetime] NULL, [TEXT_FIELD] [varchar](50) NULL, [DROP_THIS_FIELD] [varchar](50) NULL ) ON [PRIMARY] GO SET ANSI_PADDING OFF
CREATE TABLE [CASE_MILESTONE_TEMP] ( [CASE_IDENTIFIER] [varchar] (10) NULL, [DOCUMENT_TYPE] [varchar] (3) NULL , [DOCUMENT_NUMBER] [varchar] (3) NULL, [MILESTONE] [varchar] (10) NULL, [MILESTONE_DATE_TYPE] [varchar] (1) NULL, [MILESTONE_DATE] [varchar] (14) NULL, [MILESTONE_REMARKS] [varchar] (500) NULL ) ON [PRIMARY] GO
and Clean-table:Visual Basic 4 / 5 / 6 Syntax (Toggle Plain Text)
USE [EditorTest] GO /****** Object: Table [dbo].[CLEAN_MILE_DUPES] Script Date: 12/04/2008 10:35:05 ******/ SET ANSI_NULLS ON GO SET QUOTED_IDENTIFIER ON GO SET ANSI_PADDING ON GO CREATE TABLE [dbo].[CLEAN_MILE_DUPES]( [CASE_IDENTIFIER] [int] NULL, [MILESTONE_DATE] [datetime] NULL, [TEXT_FIELD] [varchar](50) NULL ) ON [PRIMARY] GO SET ANSI_PADDING OFF
CREATE TABLE [CLEAN_MILE_DUPES] ( [ID] [int] NULL , [CASE_IDENTIFIER] [varchar] (10) NULL, [DOCUMENT_TYPE] [varchar] (3) NULL, [DOCUMENT_NUMBER] [varchar] (3) NULL, [MILESTONE] [varchar] (10) NULL, [MILESTONE_DATE_TYPE] [varchar] (1) NULL, [MILESTONE_DATE] [varchar] (10) NULL ) ON [PRIMARY] GO
with CASE_IDENTIFIER as a duplicate key:
Visual Basic 4 / 5 / 6 Syntax (Toggle Plain Text)
USE [EditorTest] GO CREATE UNIQUE NONCLUSTERED INDEX [test] ON [dbo].[CLEAN_MILE_DUPES] ( [CASE_IDENTIFIER] ASC ) WITH (IGNORE_DUP_KEY = ON)
CREATE UNIQUE INDEX [RM_MILE_DUPES] ON [dbo].[CLEAN_MILE_DUPES] ( [CASE_IDENTIFIER] ,[DOCUMENT_TYPE] ,[DOCUMENT_NUMBER] ,[ID] ,[MILESTONE] ,[MILESTONE_DATE_TYPE] ,[MILESTONE_DATE] ) WITH IGNORE_DUP_KEY ON [PRIMARY] GO
and I tested with this code:
The error I get in the Breakpoint-line is:VB Syntax (Toggle Plain Text)
Option Explicit Private oConn As ADODB.Connection Private oCmd As ADODB.Command Private Sub Command1_Click() ' Dim strSQL As String Dim ConStr As String On Error GoTo ErrorHandler ConStr = "PROVIDER=SQLOLEDB;Data Source=JASMIN\SQLEXPRESS; INITIAL CATALOG=EditorTest; User ID=XXXXXXX; Password=XXXXXXX;" Set oConn = New ADODB.Connection oConn.Open (ConStr) strSQL = "INSERT CLEAN_MILE_DUPES (" & vbCrLf _ & " CASE_IDENTIFIER" & vbCrLf _ & " ,MILESTONE_DATE" & vbCrLf _ & " ,TEXT_FIELD) " & vbCrLf _ & "(SELECT CASE_IDENTIFIER" & vbCrLf _ & " ,MILESTONE_DATE" & vbCrLf _ & " ,TEXT_FIELD " & vbCrLf _ & " FROM CASE_MILESTONE_TEMP)" Set oCmd = New ADODB.Command oCmd.CommandText = strSQL oCmd.CommandType = adCmdText Set oCmd.ActiveConnection = oConn oCmd.Execute Sub_Exit: oConn.Close Exit Sub ErrorHandler: ' Breakpoint here Resume Sub_Exit End Sub
and that comes from a duplicate CASE_IDENTIFIER-field value from the Temp-table. And now the Case-table has all the rows from the Temp-table, except one dropped duplicate, and the column DROP_THIS_FIELD is missing of course.? oConn.Errors(0).Description Duplicate key was ignored.
Is this anything similar to your code?
(I tested with SQL Server 2005 EE, but that shouldn't make any difference)
Option Explicit Public cn As New ADODB.Connection Public cmd As New ADODB.Command Public rs As New ADODB.Recordset Private Sub removeMileDupes() Dim strSQL As String If cn.State = 0 Then 'fileset says which set of files are being loaded at the moment Call doDBaction("openDB", fileSet) End If 'clean_dupes tables have ignore duplicates flag on 'vb catches the error and stops 'so resume next. On Error Resume Next strSQL = "TRUNCATE TABLE CLEAN_MILE_DUPES" cmd.CommandText = strSQL cmd.CommandType = adCmdText Set rs = cmd.Execute strSQL = "INSERT CLEAN_MILE_DUPES (" & vbCrLf _ & " CASE_IDENTIFIER" & vbCrLf _ & " ,DOCUMENT_TYPE" & vbCrLf _ & " ,DOCUMENT_NUMBER" & vbCrLf _ & " ,MILESTONE" & vbCrLf _ & " ,MILESTONE_DATE_TYPE" & vbCrLf _ & " ,MILESTONE_DATE)" & vbCrLf _ & "SELECT CASE_IDENTIFIER" & vbCrLf _ & " ,DOCUMENT_TYPE" & vbCrLf _ & " ,DOCUMENT_NUMBER" & vbCrLf _ & " ,MILESTONE" & vbCrLf _ & " ,MILESTONE_DATE_TYPE" & vbCrLf _ & " ,MILESTONE_DATE " & vbCrLf _ & " FROM CASE_MILESTONE_TEMP" cmd.CommandText = strSQL cmd.CommandType = adCmdText Set rs = cmd.Execute 'THIS ^^^ IS THE COMMAND THAT IS FAILING. IT HANGS FOR 5 OR 'MORE SECONDS. DOING COUNT(*) ON THAT TABLE GIVES 0 'RECORDS. THEREFORE THE FOLLOWING CODE JUST REMOVES 'EVERYTHING FROM THE TEMP TABLE. strSQL = "TRUNCATE TABLE CASE_MILESTONE_TEMP" cmd.CommandText = strSQL cmd.CommandType = adCmdText Set rs = cmd.Execute strSQL = "INSERT CASE_MILESTONE_TEMP (" & vbCrLf _ & " CASE_IDENTIFIER" & vbCrLf _ & " ,DOCUMENT_TYPE" & vbCrLf _ & " ,DOCUMENT_NUMBER" & vbCrLf _ & " ,MILESTONE" & vbCrLf _ & " ,MILESTONE_DATE_TYPE" & vbCrLf _ & " ,MILESTONE_DATE)" & vbCrLf _ & " SELECT CASE_IDENTIFIER" & vbCrLf _ & " ,DOCUMENT_TYPE" & vbCrLf _ & " ,DOCUMENT_NUMBER" & vbCrLf _ & " ,MILESTONE" & vbCrLf _ & " ,MILESTONE_DATE_TYPE" & vbCrLf _ & " ,MILESTONE_DATE " & vbCrLf _ & " FROM CLEAN_MILE_DUPES" cmd.CommandText = strSQL cmd.CommandType = adCmdText Set rs = cmd.Execute strSQL = "TRUNCATE TABLE CLEAN_MILE_DUPES" cmd.CommandText = strSQL cmd.CommandType = adCmdText Set rs = cmd.Execute End Sub
Option Explicit Public cn As New ADODB.Connection Public cmd As New ADODB.Command Public rs As New ADODB.Recordset Private Sub removeMileDupes() Dim strSQL As String ' Dim ConStr As String Dim oCmd As ADODB.Command ' Use a local object. You may use global, but make sure you know what it does :) ' Add error handler On Error GoTo ErrorHandler ' I had to set and open connection object in here. You may do it before calling this sub ConStr = "PROVIDER=SQLOLEDB;Data Source=JASMIN\SQLEXPRESS; INITIAL CATALOG=EditorTest; User ID=XXXXXX; Password=XXXXXX;" Set oConn = New ADODB.Connection oConn.Open ConStr Set oCmd = New ADODB.Command Set oCmd.ActiveConnection = oConn ' Set a connection for the command ' I think you might have missed this OR the connection's state wasn't Open ' I commented this out. If this opens the connection, you may have to move Set oCmd.ActiveConnection = oConn after this block If cn.State = 0 Then 'fileset says which set of files are being loaded at the moment Call doDBaction("openDB", fileSet) End If 'clean_dupes tables have ignore duplicates flag on 'vb catches the error and stops 'so resume next. ' No need to Resume Next in here 'On Error Resume Next strSQL = "TRUNCATE TABLE CLEAN_MILE_DUPES" oCmd.CommandText = strSQL oCmd.CommandType = adCmdText Set rs = oCmd.Execute ' strSQL = "INSERT CLEAN_MILE_DUPES (" & vbCrLf _ ' & " CASE_IDENTIFIER" & vbCrLf _ ' & " ,DOCUMENT_TYPE" & vbCrLf _ ' & " ,DOCUMENT_NUMBER" & vbCrLf _ ' & " ,MILESTONE" & vbCrLf _ ' & " ,MILESTONE_DATE_TYPE" & vbCrLf _ ' & " ,MILESTONE_DATE)" & vbCrLf _ ' & "SELECT CASE_IDENTIFIER" & vbCrLf _ ' & " ,DOCUMENT_TYPE" & vbCrLf _ ' & " ,DOCUMENT_NUMBER" & vbCrLf _ ' & " ,MILESTONE" & vbCrLf _ ' & " ,MILESTONE_DATE_TYPE" & vbCrLf _ ' & " ,MILESTONE_DATE " & vbCrLf _ ' & " FROM CASE_MILESTONE_TEMP" ' My "simplified" table strSQL = "INSERT CLEAN_MILE_DUPES (" & vbCrLf _ & " CASE_IDENTIFIER" & vbCrLf _ & " ,MILESTONE_DATE" & vbCrLf _ & " ,TEXT_FIELD) " & vbCrLf _ & "(SELECT CASE_IDENTIFIER" & vbCrLf _ & " ,MILESTONE_DATE" & vbCrLf _ & " ,TEXT_FIELD " & vbCrLf _ & " FROM CASE_MILESTONE_TEMP)" oCmd.CommandText = strSQL oCmd.CommandType = adCmdText ' Now, here is the only place where Resume Next is needed On Error Resume Next Set rs = oCmd.Execute On Error GoTo ErrorHandler 'THIS ^^^ IS THE COMMAND THAT IS FAILING. IT HANGS FOR 5 OR 'MORE SECONDS. DOING COUNT(*) ON THAT TABLE GIVES 0 'RECORDS. THEREFORE THE FOLLOWING CODE JUST REMOVES 'EVERYTHING FROM THE TEMP TABLE. strSQL = "TRUNCATE TABLE CASE_MILESTONE_TEMP" oCmd.CommandText = strSQL oCmd.CommandType = adCmdText Set rs = oCmd.Execute ' My "simplified" table again. I dropped your strSQL somewhere... strSQL = "INSERT CASE_MILESTONE_TEMP (" & vbCrLf _ & " CASE_IDENTIFIER" & vbCrLf _ & " ,MILESTONE_DATE" & vbCrLf _ & " ,TEXT_FIELD) " & vbCrLf _ & " SELECT CASE_IDENTIFIER" & vbCrLf _ & " ,MILESTONE_DATE" & vbCrLf _ & " ,TEXT_FIELD " & vbCrLf _ & " FROM CLEAN_MILE_DUPES" oCmd.CommandText = strSQL oCmd.CommandType = adCmdText Set rs = oCmd.Execute strSQL = "TRUNCATE TABLE CLEAN_MILE_DUPES" oCmd.CommandText = strSQL oCmd.CommandType = adCmdText Set rs = oCmd.Execute Sub_Exit: oConn.Close Exit Sub ErrorHandler: ' Handle errors here (this is just to trap errors) Resume Sub_Exit End Sub
Set oCmd.ActiveConnection = oConn i.e. command object did not have an associated connection object.
Here's a slightly modified code:
VB Syntax (Toggle Plain Text)
' strSQL = "INSERT CLEAN_MILE_DUPES (" & vbCrLf _ ' & " CASE_IDENTIFIER" & vbCrLf _ ' & " ,DOCUMENT_TYPE" & vbCrLf _ ' & " ,DOCUMENT_NUMBER" & vbCrLf _ ' & " ,MILESTONE" & vbCrLf _ ' & " ,MILESTONE_DATE_TYPE" & vbCrLf _ ' & " ,MILESTONE_DATE)" & vbCrLf _ ' & "SELECT CASE_IDENTIFIER" & vbCrLf _ ' & " ,DOCUMENT_TYPE" & vbCrLf _ ' & " ,DOCUMENT_NUMBER" & vbCrLf _ ' & " ,MILESTONE" & vbCrLf _ ' & " ,MILESTONE_DATE_TYPE" & vbCrLf _ ' & " ,MILESTONE_DATE " & vbCrLf _ ' & " FROM CASE_MILESTONE_TEMP" ' My "simplified" table strSQL = "INSERT CLEAN_MILE_DUPES (" & vbCrLf _ & " CASE_IDENTIFIER" & vbCrLf _ & " ,MILESTONE_DATE" & vbCrLf _ & " ,TEXT_FIELD) " & vbCrLf _ & "(SELECT CASE_IDENTIFIER" & vbCrLf _ & " ,MILESTONE_DATE" & vbCrLf _ & " ,TEXT_FIELD " & vbCrLf _ & " FROM CASE_MILESTONE_TEMP)" oCmd.CommandText = strSQL oCmd.CommandType = adCmdText ' Now, here is the only place where Resume Next is needed On Error Resume Next Set rs = oCmd.Execute On Error GoTo ErrorHandler
I tried your code and it hang up. Then I removed On Error Resume Next and started to trap errors. First thing that failed in the code was missingSet oCmd.ActiveConnection = oConni.e. command object did not have an associated connection object.
Second, I used a local command object. You may use a global one, but you have to make sure that it's valid in your subroutine. Besides, you can always pass command and/or connection objects as ByRef parameters rather than use global ones.
I moved On Error Resume Next to the only place where it's actually needed (remove duplicates) and then turned error handling back.
Now the code works just fine for me. I hope this helps you a bit![]()
| DaniWeb Message | |
| Cancel Changes | |