如何使用SP更新后刷新记录

时间:2010-08-04 12:05:06

标签: c# data-binding insert

我正在处理以下问题: 我使用MSSQL存储过程在DataGridView中显示我的数据。更新和插入命令有效,但有一个问题:

在插入新行时,自动编号的主键不会发送回我的DataAdaptar。因此,插入在数据库中是成功的,但PK在DataGridView中保留为空。 我已经尝试了一些代码,如:

    private void _rowUpdated(object sender, SqlRowUpdatedEventArgs e)
    {
        if (e.Status == UpdateStatus.Continue && e.StatementType == StatementType.Insert)
        {
            cmd = conn.CreateCommand();
            cmd.CommandText = "SELECT @@IDENTITY FROM " + e.Row.Table.TableName;

            DataRow r = dt.Rows[dt.Rows.Count - 1];
            r.ItemArray[0] = cmd.ExecuteScalar();
            //r.SetModified(); --> err?
            r.AcceptChanges();
        }
    }
DataAdapter上的

,但似乎没有任何效果。所有SQL命令都可以正常工作。

当我刷新DataGridView中的数据时,每个人都很完美。但问题是,调整了排序顺序和列宽。这不是我想要的。

有人可以帮我解决这个问题吗?

期待解决方案!

谢谢!

2 个答案:

答案 0 :(得分:1)

终于找到答案并想分享:

dt.RowChanged += new DataRowChangeEventHandler(_update_fields);


    private void _update_fields(object sender, DataRowChangeEventArgs e)
    {
        try
        {
            if (e.Action == DataRowAction.Add)
            {
                conn.Open();
                cmd = conn.CreateCommand();
                cmd.CommandText = "SELECT IDENT_CURRENT('" + e.Row.Table.TableName + "')";
                dt.Rows[dt.Rows.Count - 1][0] = int.Parse(cmd.ExecuteScalar().ToString()) + 1;
                dt.AcceptChanges();
                conn.Close();
            }
            adapt.Update(dt);
        }
        catch (SqlException ex)
        {
            Debug.WriteLine(ex.Message);
        }
        catch (Exception ex)
        {
            Debug.WriteLine(ex.Message);
        }
    }

希望它能为您节省一些时间! :)

的Gr VeeWee

答案 1 :(得分:0)

由于与sql server的连接已终止,因此@@ identity将变为null,因此您将获得null值。

你不能在这里使用scope_identity(),因为它的范围仅限于你调用它的地方,即程序。

ident_current()始终返回您指定的表的最后一个标识值。 在复制的情况下,它可能无法正常工作

Update your commandText to ="Select ident_current("+e.Row.Table.TableName+")"

以下是使用各种检索身份值的技术的结果。 将dbo.M_PatientEntry替换为您的表名

select ident_current('dbo.M_PatientEntry')
---------------------------------------
13

select @@identity from dbo.M_PatientEntry    
---------------------------------------
NULL
NULL

select scope_identity()    
---------------------------------------
NULL

select scope_identity() from dbo.M_PatientEntry    
---------------------------------------
NULL
NULL

同时尝试避免使用@@ Identity而不是使用scope_identity()或ident_current 如果在正在进行插入的同一个表上使用触发器,@@ identity将为您提供触发器表结果的递增值。

see this documentation