Results 1 to 3 of 3
  1. #1
    Join Date
    Jul 2004

    Unanswered: Strange behavior with SQL text field and ADO Parameter....a challenge for the experts

    I've run into an interesting problem, and seemed to have stumped 3 newsgroups and 2 other forums.

    For some reason when I try to insert a record into a SQL table that has a Text column, the returned autogenerated Identity is wrong (on the VB side). This only occurs if the length of the value inserted for the text column is >= 8002.

    I've included a simple example below.


    /* Simple table with 1 identity column, and 1 text column) */
    CREATE TABLE [dbo].[Foo] (
    [FooID] [int] IDENTITY (1, 1) NOT NULL ,
    [FooText] [text] COLLATE SQL_Latin1_General_CP1_CI_AS NULL

    /* Identity column is clustered and set as the primary key */

    ' ********************************
    ' VB Code Below...References ADO
    ' ********************************
    Private Sub Save_Foo()
    Dim cn As New Connection, cmd As New Command

    Call cn.Open("DSN=xxxx;UID=xxxx;pwd=xxxx") ' Enter your connectionstring here

    cmd.ActiveConnection = cn

    cmd.CommandType = adCmdStoredProc
    cmd.CommandText = "Foo_Insert"

    cmd.Parameters.Append cmd.CreateParameter("FooID", adInteger, adParamOutput, , 0)
    cmd.Parameters.Append cmd.CreateParameter("FooText", adLongVarChar, adParamInput, 8002, String(8002, "@"))

    Call cmd.Execute

    MsgBox "Returned FooID: " & cmd.Parameters("FooID").Value
    End Sub

    /* Stored Procedure */
    Alter Procedure Foo_Insert
    @FooID int output,
    @FooText text

    INSERT INTO Foo (FooText) VALUES (@FooText)




    When I run the code above the returned output parameter in VB is wrong. At first it was always returning 60368600, then 60387816, and now the value is 0.

    If I change the value and length of the 2nd parameter to be only 8001 characters long, it works fine (i.e. the output parameter is incremented normally 1,2,3...etc.)

    I don't believe the problem is on the SQL side because in both cases the information was inserted correctly into the table, and when I step through the stored procedure @@IDENTITY returns the correct value, the only problem is VB assigns the wrong value to the output parameter.

    I thought it might be the Parameter Type I was using for the Text field (adLongVarChar), but I've tried others resulting in various errors.

    I've tried referencing different versions of ADO (2.1, 2.5, and 2.7) and the problem persists.

    I've changed @@IDENTITY to SCOPE_IDENTITY(), and it still doesn't work (note: the stored procedure seems to work fine, so this shouldn't have any effect on it anyway).

    I'm not sure if anyone else has actually tried to run the code (please do so), so I can determine if it is something in our environment.

    What I'm trying to do (insert a record into a table with a text field, and return the auto-generated id via @@IDENTITY or SCOPE_IDENTITY() as an output parameter) seems like a fairly common thing, and seems like it could be a major bug in ADO.

    Can anyone help me with this?

    Thanks in advance.

  2. #2
    Join Date
    Feb 2004
    In front of the computer
    Provided Answers: 54
    Did you check KB#218751. If this is your problem, it sounds to me like either updating your MDAC or switching to the SQLOLEDB provider should fix the problem.


  3. #3
    Join Date
    Jul 2004

    Thanks, you found the solution!

    After I set it to use the SQLOLEDB provider, it worked fine.

    I don't really understand why the KB article says:

    "This problem was corrected in MDAC 2.6"

    because you are still forced to use the SQLOLEDB provider.

    Unfortunately, most of our apps use DSNs, allowing us to easily move the application from 1 server to another, and I don't think we are going to retrofit all of them.

    Thanks though, the KB you provided seemed to answer my questions (only difference is 8000 vs 8001 chars...).

Posting Permissions

  • You may not post new threads
  • You may not post replies
  • You may not post attachments
  • You may not edit your posts