Question

How do I use the new datatype VARCHAR(MAX) as an output parameter in ADO using VBA?

Asked by: Data-Man

Hello everyone,
   I'm having a little bit of an issue and need a some help.

   Here's the situation.  I have an Access database (2003) which connects to SQL Server 2005 using ADO 2.8.  I just finished giving them the capability to send HTML emails and that works great as long as the email isn't over 8000 characters.  Well guess what, they want to send one today which is just over 11000 characters.  
    I have a procedure that takes their email and embeds it between the company header and footer and then sends it back to them so they can view it on the client before sending.  I have no problem sending up an email that is larger than 8K using the adLongVarWChar when I create the parameter.  My problem is in the output parameter.  If I set it to adLongVarWChar, I get an error telling me that the datatype is a deprecated large datatypes and that they can't be used as output parameters.  

    How do I return my VARCHAR(MAX) from my command object?

    I did a little reading and came across this wonderful paper from Microsoft and thought it was the answer to my prays, but low and behold, it doesn't seem to work. (http://msdn2.microsoft.com/en-us/library/ms130978.aspx)

    I've modified my connection string to use the SQL Native Client and set the compatibility flag but it still doesn't work.
 
   Here is my code.

    With cmdTemp
        .ActiveConnection = cn
        .CommandText = "pEmailCustomMailingView"
        .CommandType = adCmdStoredProc
       
        '.Parameters.Refresh
       
        .Parameters.Append .CreateParameter("@strProject", adVarChar, adParamInput, 12, Form_frmProspectCustomMailing.cboProject.Value)
        .Parameters.Append .CreateParameter("@strSubject", adVarChar, adParamInput, 250, Left(Me.txtSubject.Value, 250))
        .Parameters.Append .CreateParameter("@strHTML", adLongVarWChar, adParamInput, -1, Me.txtEmailBody.Value)
        .Parameters.Append .CreateParameter("@strProc", adVarChar, adParamInput, 200, Form_frmProspectCustomMailing.Tag)
        .Parameters.Append .CreateParameter("@strHTMLOutput", adLongVarWChar, adParamOutput, 25000)
       
        Set rstTemp = .Execute
        Debug.Print rstTemp.RecordCount
    End With

    I'm heading out of the office, but will be back in a few hours to try and wrap this up and upload the new version for them.  I have to catch a plane in the morning.  

Thanks in advance,
Mike

This Question has been solved and asker verified All Experts Exchange premium technology solutions are available to subscription members.

Subscribe now for full access to Experts Exchange and get

Instant Access to this Solution

  • Plus...
  • 30 Day FREE access, no risk, no obligation
  • Collaborate with the world's top tech experts
  • Unlimited access to our exclusive solution database
  • Never be left without tech help again

Subscribe Now

Asked On
2008-03-06 at 14:21:14ID23221335
Tags

Microsoft

,

SQL Server 2005

Topics

MS SQL Server

,

Microsoft Access Database

,

Access Coding/Macros

Participating Experts
3
Points
500
Comments
10

Trusted by hundreds of thousands everyday for fast, accurate and reliable tech support.

  • "The time we save is the biggest benefit of Experts Exchange to Warner Bros. What could take multiple guys 2 hours or more each to find is accessed in around 15 minutes on Experts Exchange." Mike Kapnisakis, Warner Bros.
  • "Our team likes having a resource that is more secure than just using Google and most experts using this service really know their stuff. It's nice to look here first versus using Google." Dayna Sellner, Lockheed Martin
  • "Anytime that I've been stumped with a problem, 9 out of 10 times Experts Exchange has either the accepted solution or an open discussion of the potential solution to the problem." Kenny Red, eBay Inc.

See what Experts Exchange can do for you.

Got a question?

We've got the answer.

Experts Exchange has been collecting answers to technology questions since 1996…3 million and counting! If you have a question, chances are we already have your answer.

Screenshot of Experts Exchange Knowledgebase

Need individual assistance?

Our experts are ready to help.

If you can't find the exact answer you're looking for, ask our exclusive community of 50,000 experts. You’ll get a personalized answer from a trusted professional.

Screenshot of Experts Exchange Knowledgebase

Want to learn from the best?

Read articles from industry experts.

Thousands of free tech tips, tricks, how-to’s and tutorials are available in our peer reviewed articles section. See for yourself how smart our experts are, no login required.

Screenshot of an Article

Working on a long term project?

Store your work and research.

Save solutions to your questions, answers you’ve discovered through searching plus helpful articles in your personal knowledgebase for easy future access.

Screenshot of Experts Exchange Knowledgebase

Access the answers to your technology questions today.

Subscribe Now

30-day free trial. Register in 60 seconds.

What Makes Experts Exchange Unique?

Members of the expert community talk about why the experience at Experts Exchange is different than what you will find anywhere else.

Trusted by the world's most respected brands.

image of each brand's logo

Faithfully serving IT professionals since 1996.

Experts Exchange Logo

Try it out and discover for yourself.

Subscribe Now

30-day free trial. Register in 60 seconds.

Related Solutions

  1. ADO versus RDO
    i've already tried to search the above topic in MSDN but still have no idea on choosing a suitable data model for our project (client/server, not web project). Our project: Frontend - VB 6 on Win32 environment. Backend - IBM DB2 on AIX Adopt COM (Active-X DLL) to write some ...
  2. Createtabledef with ADO
    is it the only way if i create tabledef by using ADOX. Can i do it with only ADO? If can how to do it?
  3. about ADO
    hi , iam ADO new user , i want to ask about a problem i face , first when i want to make a connection i use this: Dim DB As New ADODB.Connection Dim DBT As New ADODB.Recordset DB.Open "DSN=MS Access Database; DBQ=C:\TestDB\Access.mdb;DefaultDir=C:\TestDB; " _ ...
  4. ADO and DAO
    What are the differences between DAO and ADO?
  5. ADO
    Is ADO a completly new language? Is there much to it?
  6. Modify table with ADO
    I have a table that I need to add a column to through code. using ADO, how would I: 1) Check to see if the column I am tryin to add already exists. 2) add the column. text. needs to be long, but not a specfied length, just as long as it needs to be. Thanks!

Free Tech Articles

  1. WARNING: 5 Reasons why you should NEVER fix a computer for free.
    It is in our nature to love the puzzle. We are obsessed. The lot of us. We love puzzles. We love the challenge. We thrive on finding the answer. We hate disarray. It bothers us deep in our soul. W...
  2. SCCM OSD Basic troubleshooting
    SCCM 2007 OSD is a fantastic way to deploy operating systems, however, like most things SCCM issues can sometimes be difficult to resolve due to the sheer volume of logs to sift through and the dispe...
  3. Migrate Small Business Server 2003 to Exchange 2010 and Windows 2008 R2
    This guide is intended to provide step by step instructions on how to migrate from Small Business Server 2003 to Windows 2008 R2 with Exchange 2010. For this migration to work you will need the fo...
  4. Create a Win7 Gadget
    This article shows you how to create a simple "Gadget" -- a sort of mini-application supported by Windows 7 and Vista. Gadgets can be dropped anywhere on the desktop to provide instant information, ...
  5. Outlook continually prompting for username and password
    There have been a lot of questions recently regarding Outlook prompting for a username and password whilst using Exchange 2007. There are a few reasons why this would happen and I will try to cover t...
  6. Backup Exchange 2010 Information Store using Windows Backup
    There seems to be quite a lot of confusion around the ability to backup Exchange 2010 using the built in Windows Backup feature. This stems from the omission of this feature prior to Exchange 2007 s...

Cloud Class Webinars

  1. Avoiding Bugs in Microsoft Access
    Alison Balter takes and in-depth look at avoiding bugs in Access. In this webinar you will learn about using the immediate window to debug your applications, invoking the debugger, using breakpoints to troubleshoot, stepping through code, setting the next statement to execute, ...
  2. Top 10 Best New Features in Visio 2010
    Scott Helmers gives live demonstrations of the top 10 new features in Visio 2010. This webinar will teach you how to create compelling diagrams by adding shapes to the page with a single click, linking the shapes in a diagram to data in Excel (or SQL Server, or SharePoint), ...
  3. IT Consultant Business Secrets Revealed
    Michael Munger, Experts Exchange tech pro and IT consultant, pulls back the curtain on his very successful businesses and answers question on every IT consultant and business owner should know about. He shares secrets on what he did to solve the 5 most common problems in IT, ...
  4. Disaster Recovery and Business Continuity
    Quest CTO, Mike Billon, gives an overview of the steps involved in building a dunamic disaster recovery plan. Through case studies and an examination of software/hardware tooles for monitoring and testing, you'll gain a better understandin of where you are, where you want ...
  5. Organize Your Visio Diagrams with Containers and Lists
    Scott Helmers uses cross functional flowcharts, wireframe diagrams, data graphic legends and seating charts to teach you: how to ustilize all three new structured diagram components in Visio 2010, the best practices for organizeing shapes in previous version of Visio, how to organize ...
  6. How to Us Objects, Properties, Events and Methods in Microsoft Access
    Alison Dalter gives an in-depbth look at objects, properties, events and methods in Microsoft Access. In this webinar you will learn about using the object browser, referring to objects, working with properties and methods, working with object variables, understanding the ...

Join the Community

Give a Little. Get a Lot.

Join the community of experts here and help other tech pros by answering question in your area of expertise. You can earn FREE access to all Experts Exchange's premium features and resources.

Join the Community

Answers

 

by: chapmandewPosted on 2008-03-06 at 14:23:47ID: 21065414

Dim cn As New ADODB.Connection
Dim cmd As New ADODB.Command
Dim rs As New ADODB.Recordset
Dim str As String

cn.Open "Provider=SQLNCLI;Data Source=.;Integrated Security=SSPI;DataTypeCompatibility=80;MARS Connection=True;"
cn.Execute "create procedure testproc(@paramin nvarchar(max)) as begin select @paramin end"
cmd.ActiveConnection = cn
cmd.CommandType = adCmdStoredProc
cmd.CommandText = "testproc"
str = "testing !!!! testing !!!! testing !!!! testing !!!! testing !!!! testing !!!! testing !!!! testing !!!! testing !!!! testing !!!! testing !!!!"
cmd.Parameters.Append cmd.CreateParameter("@param1", adLongVarWChar, adParamInput, -1, str)
Set rs = cmd.Execute
MsgBox rs.Fields(0).Value
cn.Execute "drop procedure testproc"
Set cmd = Nothing
cn.Close



here is a link to an msdn article on it
http://forums.microsoft.com/MSDN/ShowPost.aspx?PostID=308037&SiteID=1

 

by: flavoPosted on 2008-03-06 at 15:59:16ID: 21066016

Mike,

I don't think you can return it as a OUTPUT parameter, but rather a field as part of the returning Recordset.

ie:

SP:
 
ALTER PROCEDURE pTest
	(
	@strHTML		VARCHAR(MAX)
	)
 
AS
 
BEGIN
 
	DECLARE @strHTMLOutput VARCHAR(MAX)
	DECLARE @i INT
	SET @i = 0
	SET @strHTMLOutput  = @strHTML 
 
	WHILE @i < 10000
		BEGIN
			SET @strHTMLOutput = @strHTMLOutput + N'123'
			SET @i = @i + 1
		END
 
	SELECT @strHTMLOutput
END	
 
VBA:
    With cmd
        .ActiveConnection = c
        .CommandType = adCmdStoredProc
        .CommandText = "pTest"
        .Parameters.Append .CreateParameter("@strHTML", adLongVarWChar, adParamInput, -1, "abc123")
        '.Parameters.Append .CreateParameter("@strHTMLOutput", adLongVarChar, adParamOutput, 25000)
        Set rs = .Execute
    End With
 
 
 
Note:
IF you interrogate ?rs.Fields(0).Type in the Immediate window, it returns adLongVarChar as noted in the documentation you supplied. I assume this is what they (MS) are talking about...
 
 
Dave
                                              
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23:
24:
25:
26:
27:
28:
29:
30:
31:
32:
33:
34:
35:
36:
37:
38:
39:
40:
41:
42:

Select allOpen in new window

 

by: Data-ManPosted on 2008-03-06 at 16:35:59ID: 21066207

I should have thought about the recordset...was too hung up on the output param.
It's great that the new version supports these new datatypes.

Thanks Flavo,
Mike

 

by: flavoPosted on 2008-03-06 at 17:09:19ID: 21066357

Glad to help, mate.

Dave

 

by: SanjayShahPosted on 2010-04-01 at 04:50:16ID: 29332447

Sorry,
I tried using ADO 2.8 & SQL Server Native Client 10.0 but same problem is there. It is not returning nVarChar(Max) or VarChar(Max) to outparameters whoes type adLongVarChar OR adLongVarWChar.

I know that if we return recordset it returns value, but returnin single record value through ADO parameters is so much faster then recordset appx. 10 times in Local Area Network or over internet.

Please view my code and help me for solution.

Sanjay Shah

SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO

ALTER PROCEDURE [dbo].[SSP_ItemMaster_Select]
 @pItemCode AS nVarCahr(15) = '',
 @pItemDescription AS nVarChar(Max) = '' OUTPUT,
 @pSalesRate AS Float = 0 OUTPUT
AS

BEGIN
 -- SET NOCOUNT ON added to prevent extra result sets from
 -- interfering with SELECT statements.
 SET NOCOUNT ON;

        -- Insert statements for procedure here
 SELECT
 @pItemDescription = ItemDescription,
 @pSalesRate = SalesRate
 FROM   dbo.FaItemMaster
 WHERE  ItemCode = @pItemCode

END
-- End of Procedure 
=========================================================================

3. Following is my code of procedure assume

'**********************************************************************************************************
Private Sub Command1_Click()
Dim cnn as new adodb.connection
Dim cmd as New adodb.command
Dim prm as New adodb.parameters

' Opening Connection
cnn.open "Provider = SQLOLEDB; Server = 127.0.0.1; Database=MyDatabase; User 
ID=sa; Password=mypass; "

' Initialise Command
set cmd.ActiveConnection = cnn

' Append ItemCode Paremeters
Set prm = cmd.CreateParameters("@pItemCode", advarWChar, adParamInput, 15)
cmd.Parameters.Append Prm

' Append Rate Paremeters
Set prm = cmd.CreateParameters("@pSalesRate", adDouble , adParamOutput)
cmd.Parameters.Append Prm

' Assign Command Text
cmd.CommandText = "dbo.SSP_ItemMaster_Select"
cmd.CommandType = adCmdStoredProc
cmd.Parameters("@pItemCode").Value = "0101001"
cmd.Execute , , adExecuteNoRecords

' Display Description
MsgBox "Item Description " & vbcrlf & 
cmd.Paremeters("@pItemDescription").Value
End Sub

                                              
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23:
24:
25:
26:
27:
28:
29:
30:
31:
32:
33:
34:
35:
36:
37:
38:
39:
40:
41:
42:
43:
44:
45:
46:
47:
48:
49:
50:
51:
52:
53:
54:
55:
56:
57:
58:
59:
60:

Select allOpen in new window

 

by: Data-ManPosted on 2010-04-01 at 05:01:18ID: 29333505

Sanjay,
    Are you sure the recordset is that much slower?  That has not been my experience.  You can still use the command object.  Just assign the .Execute to a recordset object and modity your proc to return a single record.  When creating your ADO recordset, make sure it is set to snapshot, forwardonly, readonly, ,etc.  
     My solution with the recordset has worked perfectly for years now.
     Do no quote me on this, but the problem with returning nvarchar(max) from a proc with ADO is that ADO 2.8 came out before the 'max' datatype and I'm not sure that the ADO knows how to handle it.  Just my two cents.

Regards,
Mike

 

by: SanjayShahPosted on 2010-04-01 at 05:11:02ID: 29334493

Yes Mike,
Returning Single Record Recordset Value to output parameters is appx. 10 times faster then returning recordset. I tried returning recordset it is working fine. But in case of remote connection through internet speed is important. I tried to return single recordset through internet whose fields is more than 125 & recordset length is over 1500 bytes (excl. Memo nVarChar) it then takes avg. 2 seconds but if I return through parameters it takes 0.14 seconds.

You also try this.

Regds.
Sanjay Shah

 

by: Data-ManPosted on 2010-04-01 at 05:16:50ID: 29335120

I'm under a deadline on a project and don't have enough free time to play with this.  If I get  chance, I'll try to look at this specific issue this weekend.

Mike

 

by: Data-ManPosted on 2010-04-01 at 05:56:03ID: 29338273

Sanjay,
     Have you isolated the specific code that is responsible for the difference in the time?

Mike

 

by: SanjayShahPosted on 2010-04-01 at 06:52:44ID: 29343355

Mike,
I have not isolated any code. This is sample application I had generated to plan out how to modify main application for speed over internet.

Sanjay Shah

20120131-EE-VQP-002

3 Ways to Join

30-Day Free Trial

The Experts

98% positive feedback on 31,087 answers since March 2000. angeliii is a Microsoft Most Valuable Professional for his work with MS SQL Server & Develoment.

He has also proven his knowledge of Visual Basic Programming, PHP Scripting and Oracle Databases.

The Experts

97% positive feedback on 10,752 answers since July 2000. lrmoore has more than 18 years experience in the networking industry.

The six-time Mircosoft MVPs specialties include firewalls, virtual private networking, and network management.

Testimonials

"...and excellent source for support... Kind of like having your very own IT dept." Electriciansnet

Testimonials

"I was apprehensive at signing up at first. However... it has already made my life as an IT administrator much easier." JaCrews

Testimonials

"WOW! You guys have great, active, and knowledgeable people on here." moore50

Business Clients

Business Clients

In the Press

"If you’ve got a question... Experts Exchange can supply an answer.”

In the Press

"...an invaluable aid for both IT professionals and those who require tech support."

In the Press

"where IT professionals provide quick answers on just about any topic"

Business Account Plans

Loading Advertisement...