Home All Groups Group Topic Archive Search About

Concurrency Checking - SQL Server Rowversion - Stored Procedures ASP.NET Command

Author
18 Nov 2005 8:45 PM
Bari Allen
I'm trying to test for concurrency, using a SQL Stored Procedure on a
RowVersion (timestamp) Field.  The vb code I'm using is as follows

    Dim cmd As New SqlCommand("ConcurrencyCheck", cn)
    Dim intID as integer = MyDataset.Tables("MyTable").Rows(0).Item("ID")
    cmd.CommandType = CommandType.StoredProcedure
    cmd.Parameters.Add("@ReturnValue", SqlDbType.Int)
    cmd.Parameters(0).Direction = ParameterDirection.ReturnValue
    cmd.Parameters.Add("@ID", intID)

    Dim concurParam As New SqlParameter
    concurParam.ParameterName = "@Concurrency"
    concurParam.Value =
MyDataset.Tables("MyTable").Rows(0).Item("ConcurrencyValue")
    concurParam.SqlDbType = SqlDbType.Binary
    cmd.Parameters.Add(concurParam)

    cn.Open()

    If cmd.ExecuteScalar() > 0 Then
        Record Found ...
    Else
        Record not found ...
    End If

    cmd.Dispose()
    cn.Close()
    cn.Dispose()

Prior to submitting the form, I run a different stored procedure which
populates the "MyDataset" from the same row using:
    SELECT *  FROM MyTable WHERE ID = @ID

The code in the stored procedure that submits the form is:
    SELECT Count(*)  FROM MyTable WHERE ID = @ID AND ConcurrencyValue =
@Concurrency

How do I convert the originally retrieved data (RowVersion) back to a true
binary in ASP.NET to send it back to SQL?  It currently is storing the field
as an array, for some reason.  Thus, when I test this procedure and now
(without a doubt) no one has modified the record since, it ALWAYS returns
"record not found"

Thanks in advance for any help on this.

Bari

Author
18 Nov 2005 9:23 PM
Bruce Barker
a sql timestamp should come across as an 8 byte binary array. be sure to
specify size of 8. sql wants an 8 byte literal.

    SELECT Count(*)  FROM MyTable
    WHERE ID = @ID
        AND ConcurrencyValue = 0x000000000000906A

-- bruce (sqlwork.com)


Show quote
"Bari Allen" <b***@sos.REMOVETHIS.state.ga.us> wrote in message
news:ON1BAGI7FHA.3752@tk2msftngp13.phx.gbl...
> I'm trying to test for concurrency, using a SQL Stored Procedure on a
> RowVersion (timestamp) Field.  The vb code I'm using is as follows
>
>    Dim cmd As New SqlCommand("ConcurrencyCheck", cn)
>    Dim intID as integer = MyDataset.Tables("MyTable").Rows(0).Item("ID")
>    cmd.CommandType = CommandType.StoredProcedure
>    cmd.Parameters.Add("@ReturnValue", SqlDbType.Int)
>    cmd.Parameters(0).Direction = ParameterDirection.ReturnValue
>    cmd.Parameters.Add("@ID", intID)
>
>    Dim concurParam As New SqlParameter
>    concurParam.ParameterName = "@Concurrency"
>    concurParam.Value =
> MyDataset.Tables("MyTable").Rows(0).Item("ConcurrencyValue")
>    concurParam.SqlDbType = SqlDbType.Binary
>    cmd.Parameters.Add(concurParam)
>
>    cn.Open()
>
>    If cmd.ExecuteScalar() > 0 Then
>        Record Found ...
>    Else
>        Record not found ...
>    End If
>
>    cmd.Dispose()
>    cn.Close()
>    cn.Dispose()
>
> Prior to submitting the form, I run a different stored procedure which
> populates the "MyDataset" from the same row using:
>    SELECT *  FROM MyTable WHERE ID = @ID
>
> The code in the stored procedure that submits the form is:
>    SELECT Count(*)  FROM MyTable WHERE ID = @ID AND ConcurrencyValue =
> @Concurrency
>
> How do I convert the originally retrieved data (RowVersion) back to a true
> binary in ASP.NET to send it back to SQL?  It currently is storing the
> field
> as an array, for some reason.  Thus, when I test this procedure and now
> (without a doubt) no one has modified the record since, it ALWAYS returns
> "record not found"
>
> Thanks in advance for any help on this.
>
> Bari
>
>
Author
18 Nov 2005 9:27 PM
Greg Burns
"Bari Allen" <b***@sos.REMOVETHIS.state.ga.us> wrote in message
news:ON1BAGI7FHA.3752@tk2msftngp13.phx.gbl...
> How do I convert the originally retrieved data (RowVersion) back to a true
> binary in ASP.NET to send it back to SQL?  It currently is storing the
> field
> as an array, for some reason.  Thus, when I test this procedure and now
> (without a doubt) no one has modified the record since, it ALWAYS returns
> "record not found"

Here is some code I grabbed that is using RowVersion and converting back and
forth...

Dim rowVersion(8) As Byte
....
With cmd.Parameters.Add("@RowVersion", SqlDbType.Timestamp)
  .Value = rowVersion
  .Direction = ParameterDirection.InputOutput
End With
....
rowVersion = CType(cmd.Parameters("@RowVersion").Value, Byte())

Greg
Author
18 Nov 2005 11:53 PM
Daniel Walzenbach
Bari,

what I do is that I convert the TimeStamp value in a BigInt value which I
can easily pass back and forth to my stored proc. An example would look like
the following:

CREATE PROCEDURE dbo.spTest
(
  @OIDTest uniqueidentifier
  , @SomeValue as int

  , @VersionOld bigint = 0 output
)

AS

declare @Error int
declare @rowcount int

update tblTest set

  SomeValue = @SomeValue

where OIDTest = @OIDTest and TimeStp = @VersionOld
select @error = @@error, @rowcount = @@rowcount

if @error > 0
  begin
   -- an error occurred
   goto FunctionErrorWrite
  end

if (@rowcount = 1)
   begin
    -- everything is fine

    -- get a new timeStamp
    select @VersionOld = convert(bigint, TimeStp)
     from tblTest
     where OIDTest = @OIDTest
    -- Transaktion durchführen
    goto FunctionExit
   end
else
  begin
   goto FunctionErrorWrite
  end


/* SET NOCOUNT ON */
FunctionExit:
RETURN 0

FunctionErrorUnknown:
RETURN -1

FunctionErrorWrite:
RETURN -2

FunctionErrorWrongID:
RETURN -3

FunctionErrorInterimChanged:
RETURN -4

Does this help you?

Regards

   Daniel Walzenbach




Show quote
"Bari Allen" <b***@sos.REMOVETHIS.state.ga.us> schrieb im Newsbeitrag
news:ON1BAGI7FHA.3752@tk2msftngp13.phx.gbl...
> I'm trying to test for concurrency, using a SQL Stored Procedure on a
> RowVersion (timestamp) Field.  The vb code I'm using is as follows
>
>    Dim cmd As New SqlCommand("ConcurrencyCheck", cn)
>    Dim intID as integer = MyDataset.Tables("MyTable").Rows(0).Item("ID")
>    cmd.CommandType = CommandType.StoredProcedure
>    cmd.Parameters.Add("@ReturnValue", SqlDbType.Int)
>    cmd.Parameters(0).Direction = ParameterDirection.ReturnValue
>    cmd.Parameters.Add("@ID", intID)
>
>    Dim concurParam As New SqlParameter
>    concurParam.ParameterName = "@Concurrency"
>    concurParam.Value =
> MyDataset.Tables("MyTable").Rows(0).Item("ConcurrencyValue")
>    concurParam.SqlDbType = SqlDbType.Binary
>    cmd.Parameters.Add(concurParam)
>
>    cn.Open()
>
>    If cmd.ExecuteScalar() > 0 Then
>        Record Found ...
>    Else
>        Record not found ...
>    End If
>
>    cmd.Dispose()
>    cn.Close()
>    cn.Dispose()
>
> Prior to submitting the form, I run a different stored procedure which
> populates the "MyDataset" from the same row using:
>    SELECT *  FROM MyTable WHERE ID = @ID
>
> The code in the stored procedure that submits the form is:
>    SELECT Count(*)  FROM MyTable WHERE ID = @ID AND ConcurrencyValue =
> @Concurrency
>
> How do I convert the originally retrieved data (RowVersion) back to a true
> binary in ASP.NET to send it back to SQL?  It currently is storing the
> field
> as an array, for some reason.  Thus, when I test this procedure and now
> (without a doubt) no one has modified the record since, it ALWAYS returns
> "record not found"
>
> Thanks in advance for any help on this.
>
> Bari
>
>
Author
20 Nov 2005 4:25 AM
msnews.microsoft.com
Thank you to everyone that replied.

When I tried to convert a value from a field in the dataset's table to byte,
I got an error, because the implicit conversion wasn't allowed from an array
(the default conversion sent back from the timestamp column).

Thus, I went with Daniel's suggestion to convert the value to a BigInt
within the retrieval stored procedure's select statement.  That way, I can
store the entire recordset in a dataset, when it is returned.  Then, I send
back the BigInt value to the stored procedure that tests for concurrency
(for updates).  This worked great.

Thank you, Daniel!

Show quote
"Bari Allen" <b***@sos.REMOVETHIS.state.ga.us> wrote in message
news:ON1BAGI7FHA.3752@tk2msftngp13.phx.gbl...
> I'm trying to test for concurrency, using a SQL Stored Procedure on a
> RowVersion (timestamp) Field.  The vb code I'm using is as follows
>
>     Dim cmd As New SqlCommand("ConcurrencyCheck", cn)
>     Dim intID as integer = MyDataset.Tables("MyTable").Rows(0).Item("ID")
>     cmd.CommandType = CommandType.StoredProcedure
>     cmd.Parameters.Add("@ReturnValue", SqlDbType.Int)
>     cmd.Parameters(0).Direction = ParameterDirection.ReturnValue
>     cmd.Parameters.Add("@ID", intID)
>
>     Dim concurParam As New SqlParameter
>     concurParam.ParameterName = "@Concurrency"
>     concurParam.Value =
> MyDataset.Tables("MyTable").Rows(0).Item("ConcurrencyValue")
>     concurParam.SqlDbType = SqlDbType.Binary
>     cmd.Parameters.Add(concurParam)
>
>     cn.Open()
>
>     If cmd.ExecuteScalar() > 0 Then
>         Record Found ...
>     Else
>         Record not found ...
>     End If
>
>     cmd.Dispose()
>     cn.Close()
>     cn.Dispose()
>
> Prior to submitting the form, I run a different stored procedure which
> populates the "MyDataset" from the same row using:
>     SELECT *  FROM MyTable WHERE ID = @ID
>
> The code in the stored procedure that submits the form is:
>     SELECT Count(*)  FROM MyTable WHERE ID = @ID AND ConcurrencyValue =
> @Concurrency
>
> How do I convert the originally retrieved data (RowVersion) back to a true
> binary in ASP.NET to send it back to SQL?  It currently is storing the
field
> as an array, for some reason.  Thus, when I test this procedure and now
> (without a doubt) no one has modified the record since, it ALWAYS returns
> "record not found"
>
> Thanks in advance for any help on this.
>
> Bari
>
>
Author
20 Nov 2005 1:19 PM
Daniel Walzenbach
Good to hear :-) You are welcome!

Cheers,

   Daniel Walzenbach

Show quote
"msnews.microsoft.com" <b***@sos.REMOVETHIS.state.ga.us> schrieb im
Newsbeitrag news:%23oCoPrY7FHA.744@TK2MSFTNGP10.phx.gbl...
> Thank you to everyone that replied.
>
> When I tried to convert a value from a field in the dataset's table to
> byte,
> I got an error, because the implicit conversion wasn't allowed from an
> array
> (the default conversion sent back from the timestamp column).
>
> Thus, I went with Daniel's suggestion to convert the value to a BigInt
> within the retrieval stored procedure's select statement.  That way, I can
> store the entire recordset in a dataset, when it is returned.  Then, I
> send
> back the BigInt value to the stored procedure that tests for concurrency
> (for updates).  This worked great.
>
> Thank you, Daniel!
>
> "Bari Allen" <b***@sos.REMOVETHIS.state.ga.us> wrote in message
> news:ON1BAGI7FHA.3752@tk2msftngp13.phx.gbl...
>> I'm trying to test for concurrency, using a SQL Stored Procedure on a
>> RowVersion (timestamp) Field.  The vb code I'm using is as follows
>>
>>     Dim cmd As New SqlCommand("ConcurrencyCheck", cn)
>>     Dim intID as integer = MyDataset.Tables("MyTable").Rows(0).Item("ID")
>>     cmd.CommandType = CommandType.StoredProcedure
>>     cmd.Parameters.Add("@ReturnValue", SqlDbType.Int)
>>     cmd.Parameters(0).Direction = ParameterDirection.ReturnValue
>>     cmd.Parameters.Add("@ID", intID)
>>
>>     Dim concurParam As New SqlParameter
>>     concurParam.ParameterName = "@Concurrency"
>>     concurParam.Value =
>> MyDataset.Tables("MyTable").Rows(0).Item("ConcurrencyValue")
>>     concurParam.SqlDbType = SqlDbType.Binary
>>     cmd.Parameters.Add(concurParam)
>>
>>     cn.Open()
>>
>>     If cmd.ExecuteScalar() > 0 Then
>>         Record Found ...
>>     Else
>>         Record not found ...
>>     End If
>>
>>     cmd.Dispose()
>>     cn.Close()
>>     cn.Dispose()
>>
>> Prior to submitting the form, I run a different stored procedure which
>> populates the "MyDataset" from the same row using:
>>     SELECT *  FROM MyTable WHERE ID = @ID
>>
>> The code in the stored procedure that submits the form is:
>>     SELECT Count(*)  FROM MyTable WHERE ID = @ID AND ConcurrencyValue =
>> @Concurrency
>>
>> How do I convert the originally retrieved data (RowVersion) back to a
>> true
>> binary in ASP.NET to send it back to SQL?  It currently is storing the
> field
>> as an array, for some reason.  Thus, when I test this procedure and now
>> (without a doubt) no one has modified the record since, it ALWAYS returns
>> "record not found"
>>
>> Thanks in advance for any help on this.
>>
>> Bari
>>
>>
>
>

AddThis Social Bookmark Button