0
votes

This is driving me absolutely up the wall! If anyone can suggest a fix for this I will be eternally grateful! And apologies for the length of the post.

PROBLEM

I am trying to execute a SQL stored procedure through VBA using a recordset with parameters created by looping through an excel range and on execute as soon as I hit a string value I keep getting the error "Conversion failed when converting the nvarchar value 'LIU AUS PI Civil Liability Policy Wording (08-10)' to data type int." - Needless to say that the field ("Wording") which would contain this value is set to NVARCHAR(255), the Stored Procedure accepts it as a SQL_VARIANT and then immediately Casts it to an NVARCHAR(255) AND the recordset parameter records it as an adVARWChar! What is going on??

VBA CODE

'Create the command set
Set rsCmd = New ADODB.Command
'define the command
rsCmd.CommandType = adCmdStoredProc
rsCmd.CommandText = "dbo.USP_Insert_Policy"

'29/01/2016
'Make sure we have appended the policy ID.
rsCmd.Parameters.Append rsCmd.CreateParameter("PolicyID", adInteger, adParamInput, 10, lPolicyID)
rsCmd.Parameters("PolicyID").Precision = 2

'Get remaining policy details from wksProgData and place into
'command for submission to db via recordset.
For Each rngFields In wksProgData.Range("PolicyDetailsRange")

    If rngFields.Offset(1, 0).value <> 0 Then

       'Everything gets added as a string value.
       rsCmd.Parameters.Append rsCmd.CreateParameter( _
                                  Name:=rngFields.value, _
                                  Type:=adVarWChar, _
                                  Size:=Len(rngFields.Offset(1, 0).value), _
                                  Direction:=adParamInput, _
                                  value:=rngFields.Offset(1, 0).value)

    End If

Next rngFields

'Make sure we have a connection initialised.
If gcnConnection Is Nothing Then CreateConnection
'Open connection to database.

If gcnConnection.State <> adStateOpen Then gcnConnection.Open
'Set connection for command
rsCmd.ActiveConnection = gcnConnection
'Execute the command and set to recordset.
Set rsData = rsCmd.Execute

SQL TABLE

Column Name Data Type
Submission_ID   nvarchar(255)
Rater_ID    int
Additional_Insureds_Number  int
Funds_Number    int
Contractors_Number  int
Date_Created    datetime
Policy_Number   nvarchar(255)
Expiring_Policy_Number  nvarchar(255)
Expiring_Change_Details nvarchar(MAX)
Inception_Date  datetime
Expiration_Date datetime
Continuity_Date datetime
New_Subsidiary_Asset_Size   money
Quote_Options   int
Conclusion  nvarchar(MAX)
Conclusion_UW_Date  datetime
Conclusion_Authorised_Date  datetime
Post_Quote_Changes  nvarchar(MAX)
Post_Quote_Changes_UW_Date  datetime
Post_Quote_Changes_Authorised_Date  datetime
Current_Status  nvarchar(255)
LOB_Code    nvarchar(255)
SIC_Division    nvarchar(255)
SIC_Description nvarchar(255)
SIC_Code    nvarchar(255)
PL_Code_Category    nvarchar(255)
PL_Code nvarchar(255)
Class_Code  nvarchar(255)
Rater_Code  nvarchar(255)
Close_Code  nvarchar(255)
Jurisdiction    nvarchar(255)
Territorial nvarchar(255)
Terrorism   nvarchar(255)
Side_C  nvarchar(255)
TRIA    nvarchar(255)
Account_Grading nvarchar(255)
Currency    nvarchar(255)
Exchange_Rate   int
Wording nvarchar(255)
Wording_Discretion  int
Wording_Comments    nvarchar(MAX)
Wording_Other   nvarchar(255)
Wording_Primary nvarchar(255)
Non_LIU_Wording_Comments    nvarchar(MAX)
NSW_Building_VIC_EPA_Cover_Comments nvarchar(MAX)
Transaction_Type    nvarchar(255)
Policy_Comments nvarchar(MAX)
Received_Date   datetime
Layers  nvarchar(255)
FAC_Included    nvarchar(255)
Lead_Follow nvarchar(255)
Policy_Period   int
Professional_Services   nvarchar(MAX)
Factiva_Search  nvarchar(255)
Factiva_Articles_Found  nvarchar(255)
OFAC_Trade_Sanctions_Details    nvarchar(MAX)
Renewal_Changes_Details nvarchar(MAX)
XOL_Additional_Comments nvarchar(MAX)
XOL_Primary_Wording_Reinstatements  nvarchar(MAX)
XOL_Deeming_Provisions  nvarchar(MAX)
XOL_Coverage_For_Partners_Previous_Busines  nvarchar(MAX)
Transaction_Date    datetime
Premium_Structure   nvarchar(255)
Separate_Rated_DO   nvarchar(255)
Separate_DO_Premium money
Insuring_Clause_1_1 nvarchar(255)
Override_Discount   nvarchar(255)
Non_Standard_Excess nvarchar(MAX)
Breadth_Of_Coverage nvarchar(255)
APRA_Category   nvarchar(255)
APRA_Description    nvarchar(255)
APRA_Code   nvarchar(255)
Bond_Description    nvarchar(255)
Bond_Code   nvarchar(255)
PRI_XS  nvarchar(255)
Rater_Name  nvarchar(255)
Policy_ID   int
Confirmed   bit
Layer   bit

STORED PROCEDURE

CREATE PROCEDURE [dbo].[USP_Insert_Policy]  @PolicyID SQL_VARIANT = NULL, 
                    @Submission_ID  SQL_VARIANT =NULL,
                    @Additional_Insureds_Number SQL_VARIANT=NULL, 
                    @Funds_Number   SQL_VARIANT=NULL,
                    @Contractors_Number SQL_VARIANT=NULL,
                    @Date_Created   SQL_VARIANT=NULL,
                    @Policy_Number  SQL_VARIANT=NULL,
                    @Expiring_Policy_Number SQL_VARIANT=NULL,
                    @Expiring_Change_Details    SQL_VARIANT=NULL,
                    @Inception_Date SQL_VARIANT=NULL,
                    @Expiration_Date    SQL_VARIANT=NULL,
                    @Continuity_Date    SQL_VARIANT=NULL,
                    @New_Subsidiary_Asset_Size  SQL_VARIANT=NULL,
                    @Quote_Options  SQL_VARIANT=NULL,
                    @Conclusion SQL_VARIANT=NULL,
                    @Conclusion_UW_Date SQL_VARIANT=NULL,
                    @Conclusion_Authorised_Date SQL_VARIANT=NULL,
                    @Post_Quote_Changes SQL_VARIANT=NULL,
                    @Post_Quote_Changes_UW_Date SQL_VARIANT=NULL,
                    @Post_Quote_Changes_Authorised_Date SQL_VARIANT=NULL,
                    @Current_Status SQL_VARIANT=NULL,
                    @LOB_Code   SQL_VARIANT=NULL,
                    @SIC_Division   SQL_VARIANT=NULL,
                    @SIC_Description    SQL_VARIANT=NULL,
                    @SIC_Code   SQL_VARIANT=NULL,
                    @PL_Code_Category   SQL_VARIANT=NULL,
                    @PL_Code    SQL_VARIANT=NULL,
                    @Class_Code SQL_VARIANT=NULL,
                    @Rater_Code SQL_VARIANT=NULL,
                    @Close_Code SQL_VARIANT=NULL,
                    @Jurisdiction   SQL_VARIANT=NULL,
                    @Territorial    SQL_VARIANT=NULL,
                    @Terrorism  SQL_VARIANT=NULL,
                    @Side_C SQL_VARIANT=NULL,
                    @TRIA   SQL_VARIANT=NULL,
                    @Account_Grading    SQL_VARIANT=NULL,
                    @Currency   SQL_VARIANT=NULL,
                    @Exchange_Rate  SQL_VARIANT=NULL,
                    @Wording NVARCHAR(255) =NULL,
                    @Wording_Discretion SQL_VARIANT=NULL,
                    @Wording_Comments   SQL_VARIANT=NULL,
                    @Wording_Other  SQL_VARIANT=NULL,
                    @Wording_Primary    SQL_VARIANT=NULL,
                    @Non_LIU_Wording_Comments   SQL_VARIANT=NULL,
                    @NSW_Building_VIC_EPA_Cover_Comments    SQL_VARIANT=NULL,
                    @Confirmed  SQL_VARIANT=NULL,
                    @Transaction_Type   SQL_VARIANT=NULL,
                    @Policy_Comments    SQL_VARIANT=NULL,
                    @Received_Date  SQL_VARIANT=NULL,
                    @Layers SQL_VARIANT=NULL,
                    @FAC_Included   SQL_VARIANT=NULL,
                    @Lead_Follow    SQL_VARIANT=NULL,
                    @Policy_Period  SQL_VARIANT=NULL,
                    @Professional_Services  SQL_VARIANT=NULL,
                    @Factiva_Search SQL_VARIANT=NULL,
                    @Factiva_Articles_Found SQL_VARIANT=NULL,
                    @OFAC_Trade_Sanctions_Details   SQL_VARIANT=NULL,
                    @Renewal_Changes_Details    SQL_VARIANT=NULL,
                    @XOL_Additional_Comments    SQL_VARIANT=NULL,
                    @XOL_Primary_Wording_Reinstatements SQL_VARIANT=NULL,
                    @XOL_Deeming_Provisions SQL_VARIANT=NULL,
                    @XOL_Coverage_For_Partners_Previous_Busines SQL_VARIANT=NULL,
                    @Transaction_Date   SQL_VARIANT=NULL,
                    @Premium_Structure  SQL_VARIANT=NULL,
                    @Separate_Rated_DO  SQL_VARIANT=NULL,
                    @Separate_DO_Premium    SQL_VARIANT=NULL,
                    @Insuring_Clause_1_1    SQL_VARIANT=NULL,
                    @Override_Discount  SQL_VARIANT=NULL,
                    @Non_Standard_Excess    SQL_VARIANT=NULL,
                    @Breadth_Of_Coverage    SQL_VARIANT=NULL,
                    @APRA_Category  SQL_VARIANT=NULL,
                    @APRA_Description   SQL_VARIANT=NULL,
                    @APRA_Code  SQL_VARIANT=NULL,
                    @Bond_Description   SQL_VARIANT=NULL,
                    @Bond_Code  SQL_VARIANT=NULL,
                    @PRI_XS SQL_VARIANT=NULL,
                    @Layer  SQL_VARIANT=NULL,
                    @Rater_Name SQL_VARIANT=NULL

AS

IF @PolicyID <> 0 
    BEGIN
        --Update table where policy ID is @PolicyID
        UPDATE tblPolicy

        SET             Submission_ID               =CAST(@Submission_ID AS NVARCHAR(255)),
                        Additional_Insureds_Number  =CAST( @Additional_Insureds_Number AS int ),
                        Funds_Number                =CAST( @Funds_Number AS int ),
                        Contractors_Number          =CAST( @Contractors_Number AS int ),
                        Date_Created                =CAST(@Date_Created AS Datetime),
                        Policy_Number               =CAST(@Policy_Number AS NVARCHAR(255)),
                        Expiring_Policy_Number      =   CAST(@Expiring_Policy_Number AS NVARCHAR(255)),
                        Expiring_Change_Details     =CAST(@Expiring_Change_Details AS NVARCHAR(MAX)),
                        Inception_Date              =CAST(@Inception_Date AS DateTime ),
                        Expiration_Date             =CAST(@Expiration_Date AS DateTime ),
                        Continuity_Date             =CAST(@Continuity_Date AS DATETime ),
                        New_Subsidiary_Asset_Size   =CAST( @New_Subsidiary_Asset_Size AS money ),
                        Quote_Options               =CAST( @Quote_Options AS int ),
                        Conclusion                  =CAST(@Conclusion AS NVARCHAR(MAX)),
                        Conclusion_UW_Date          =CAST (@Conclusion_UW_Date AS DATETIME),
                        Conclusion_Authorised_Date  =CAST(@Conclusion_Authorised_Date AS DateTime),
                        Post_Quote_Changes          =CAST(@Post_Quote_Changes AS NVARCHAR(MAX)),
                        Post_Quote_Changes_UW_Date  =CAST(@Post_Quote_Changes_UW_Date AS datetime),
                        Post_Quote_Changes_Authorised_Date =CAST(@Post_Quote_Changes_Authorised_Date AS datetime),
                        Current_Status              =CAST(@Current_Status AS NVARCHAR(255)),
                        LOB_Code                    =CAST(@LOB_Code AS nvarchar(255)),
                        SIC_Division                =   CAST(@SIC_Division AS nvarchar(255)),
                        SIC_Description             =CAST(@SIC_Description AS nvarchar(255)),
                        SIC_Code                    =CAST(@SIC_Code AS nvarchar(255)),
                        PL_Code_Category            =CAST(@PL_Code_Category AS nvarchar(255)),
                        PL_Code                     =CAST(@PL_Code AS nvarchar(255)),
                        Class_Code                  =CAST(@Class_Code AS nvarchar(255)),
                        Rater_Code                  =CAST(@Rater_Code AS nvarchar(255)),
                        Close_Code                  =CAST(@Close_Code AS nvarchar(255)),
                        Jurisdiction                =CAST(@Jurisdiction AS nvarchar(255)),
                        Territorial                 =CAST(@Territorial AS nvarchar(255)),
                        Terrorism                   =CAST(@Terrorism AS nvarchar(255)),
                        Side_C                      =CAST(@Side_C AS nvarchar(255)),
                        TRIA                        =CAST(@TRIA AS nvarchar(255)),
                        Account_Grading             =CAST(@Account_Grading AS nvarchar(255)),
                        Currency                    =CAST(@Currency AS nvarchar(255)),
                        Exchange_Rate               =CAST( @Exchange_Rate AS int ),
                        Wording                     =CAST(@Wording AS varchar(255)),
                        Wording_Discretion          =CAST( @Wording_Discretion AS int ),
                        Wording_Comments            =CAST(@Wording_Comments AS nvarchar(MAX)),
                        Wording_Other               =CAST(@Wording_Other AS nvarchar(255)),
                        Wording_Primary             =CAST(@Wording_Primary AS nvarchar(255)),
                        Non_LIU_Wording_Comments    =CAST(@Non_LIU_Wording_Comments AS nvarchar(MAX)),
                        NSW_Building_VIC_EPA_Cover_Comments=CAST(@NSW_Building_VIC_EPA_Cover_Comments AS nvarchar(MAX)),
                        Confirmed                   =CAST( @Confirmed AS bit ),
                        Transaction_Type            =CAST(@Transaction_Type AS nvarchar(255)),
                        Policy_Comments             =CAST(@Policy_Comments AS nvarchar(MAX)),
                        Received_Date               =CAST(@Received_Date AS datetime ),
                        Layers                      =CAST( @Layers AS nvarchar(255)),
                        FAC_Included                =CAST( @FAC_Included AS nvarchar(255)),
                        Lead_Follow                 =CAST( @Lead_Follow AS nvarchar(255)),
                        Policy_Period               =CAST( @Policy_Period AS int ),
                        Professional_Services       =CAST( @Professional_Services AS nvarchar(MAX)),
                        Factiva_Search              =CAST( @Factiva_Search AS nvarchar(255)),
                        Factiva_Articles_Found      =CAST( @Factiva_Articles_Found AS nvarchar(255)),
                        OFAC_Trade_Sanctions_Details=CAST( @OFAC_Trade_Sanctions_Details AS nvarchar(MAX)),
                        Renewal_Changes_Details     =CAST( @Renewal_Changes_Details AS nvarchar(MAX)),
                        XOL_Additional_Comments     =CAST( @XOL_Additional_Comments AS nvarchar(MAX)),
                        XOL_Primary_Wording_Reinstatements  =CAST( @XOL_Primary_Wording_Reinstatements AS nvarchar(MAX)),
                        XOL_Deeming_Provisions      =CAST( @XOL_Deeming_Provisions AS nvarchar(MAX)),
                        XOL_Coverage_For_Partners_Previous_Busines  =CAST(@XOL_Coverage_For_Partners_Previous_Busines AS nvarchar(MAX)),
                        Transaction_Date            =CAST( @Transaction_Date AS datetime ),
                        Premium_Structure           =CAST (@Premium_Structure AS nvarchar(255)),
                        Separate_Rated_DO           =CAST (@Separate_Rated_DO AS nvarchar(255)),
                        Separate_DO_Premium         =CAST( @Separate_DO_Premium AS money ),
                        Insuring_Clause_1_1         =CAST (@Insuring_Clause_1_1 AS nvarchar(255)),
                        Override_Discount           =CAST (@Override_Discount AS nvarchar(255)),
                        Non_Standard_Excess         =CAST(@Non_Standard_Excess AS nvarchar(MAX)),
                        Breadth_Of_Coverage         =CAST( @Breadth_Of_Coverage AS nvarchar(255)),
                        APRA_Category               =CAST( @APRA_Category AS nvarchar(255)),
                        APRA_Description            =CAST( @APRA_Description AS nvarchar(255)),
                        APRA_Code                   =CAST( @APRA_Code AS nvarchar(255)),
                        Bond_Description            =CAST( @Bond_Description AS nvarchar(255)),
                        Bond_Code                   =CAST( @Bond_Code AS nvarchar(255)),
                        PRI_XS                      =CAST( @PRI_XS AS nvarchar(255)),
                        Layer                       =CAST( @Layer AS bit ),
                        Rater_Name                  =CAST( @Rater_Name AS nvarchar(255))

        WHERE tblPolicy.Policy_ID=@PolicyID

        SELECT * FROM tblPolicy WHERE Policy_ID = @PolicyID
    END;

The only thing I can think of now is that my parameters are not in the same sequence as my stored procedure. However if they need to be in the same sequence then why bother to use paramters and just go straight for SQL in my VBA code.

1
Modify your sproc to returns the parameters to see if the params are passed correctly. Most likely as you mentioned the params are out of order. - Jules
Or alternatively, create a table tmp_param with all columns as varchar(max) and modify sproc to insert into this table. - Jules

1 Answers

0
votes

After much searching around on the idea the parameters needed to be in a specific order it appears you can do the following to call a stored procedure using named parameters.

Dim rsCmd As ADODB.Command 
Set rsCmd = New ADODB.Command
rsCmd.CommandType = adCmdStoredProc
'Allow execution with names instead of position'
rsCmd.NamedParameters = True