Hi Clay,
I have a GDBG which is bound to a DataTable. I am updating the changes done to
the GDBG on the RowLeave Event directly to the SQL Database Table. At this point
I need to check for data concurrency issues. So I need to pass the old values
along with the new values to the stored procedure updating the Database. Below
is the Stored Procedure
--------------------------------------------
CREATE Procedure [STRV_SalGradeEnt_UPDATE]
-- Update an existing record in [STRV_SalGradeEnt] table
(
@Code [varchar](9), -- for [STRV_SalGradeEnt].[Code] column
@Coral [bit], -- for [STRV_SalGradeEnt].[Coral] column
@Pearl [bit], -- for [STRV_SalGradeEnt].[Pearl] column
@Diamond [bit], -- for [STRV_SalGradeEnt].[Diamond] column
@nCoral [bit], -- for [STRV_SalGradeEnt].[Coral] column
@nPearl [bit], -- for [STRV_SalGradeEnt].[Pearl] column
@nDiamond [bit] -- for [STRV_SalGradeEnt].[Diamond] column
)
As
Update [dbo].[STRV_SalGradeEnt]
Set
[Coral] = @Coral, [Pearl] = @Pearl, [Diamond] = @Diamond
Where
([Code] = @Code) AND [Coral] = @nCoral AND [Pearl] = @nPearl AND [Diamond] = @nDiamond
GO
--------------------------------------------
So as per the above stored procedure i need to pass the old values along with
the changed values. I am doing this in the RowLeave Event like below
----------------------------------------------
private void libgrid_RowLeave(object sender,
GridRowEventArgs e)
{
if (this.libgrid.Binder.IsAnyDirtyField() == true) //Check If Any Field has been
Modified
{
if (this.libgrid.DataSource.ToString() == "STRV_SalGradeEnt")
{
int RowsAffected=0;
SqlParameter [] param = new SqlParameter[7];
param[0] = new SqlParameter("@Code",SqlDbType.VarChar,9);
param[0].Value = this.libgrid[e.RowIndex,1].Text;;
param[1] = new SqlParameter("@Coral",SqlDbType.Bit,1);
param[1].Value =
Convert.ToInt16(Convert.ToBoolean(this.libgrid[e.RowIndex,2].Text));
param[2] = new SqlParameter("@Pearl",SqlDbType.Bit,1);
param[2].Value =
Convert.ToInt16(Convert.ToBoolean(this.libgrid[e.RowIndex,3].Text));
param[3] = new SqlParameter("@Diamond",SqlDbType.Bit,1);
param[3].Value =
Convert.ToInt16(Convert.ToBoolean(this.libgrid[e.RowIndex,4].Text));
param[4] = new SqlParameter("@nCoral",SqlDbType.Bit,1);
param[4].Value =
Convert.ToInt16(Convert.ToBoolean(this.libDS.Tables["STRV_SalGradeEnt"].Rows[e.RowIndex-1]["Coral"].ToString()));
param[5] = new SqlParameter("@nPearl",SqlDbType.Bit,1);
param[5].Value = Convert.ToInt16(Convert.ToBoolean(this.libDS.Tables["STRV_SalGradeEnt"].Rows[e.RowIndex]["Pearl"].ToString()));
param[6] = new SqlParameter("@nDiamond",SqlDbType.Bit,1);
param[6].Value = Convert.ToInt16(Convert.ToBoolean(this.libDS.Tables["STRV_SalGradeEnt"].Rows[e.RowIndex]["Diamond"].ToString()));
retval = conn.ExecNonQuery("STRV_SalGradeEnt_UPDATE", out
RowsAffected,CommandType.StoredProcedure,ref ErrMsg,param);
if (retval == false)
{
MessageBox.Show(this,ErrMsg,"Library Data
Check",MessageBoxButtons.OK,MessageBoxIcon.Warning);
e.Cancel = true;
}
else
{
if (RowsAffected == 0)
{
DialogResult result;
result = MessageBox.Show(this,"Record Could Not be Updated. Another User may
have Modified the Data!Click Yes to Refresh Changes.","Library Data
Check",MessageBoxButtons.YesNo,MessageBoxIcon.Warning);
if (result == DialogResult.Yes)
{
e.Cancel = true;
}
}
}
}
----------------------------------------------
In the above code I do not seem to be getting the old values of the datatable.
Can you figure out the error, also if you have any article or post on
concurrency handling, please let me know
Thanks in Advance,
Osden Pereira,