我正在处理以下问题: 我使用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中的数据时,每个人都很完美。但问题是,调整了排序顺序和列宽。这不是我想要的。
有人可以帮我解决这个问题吗?
期待解决方案!
谢谢!
答案 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将为您提供触发器表结果的递增值。