父子表结构已建立主外键,运行插入存储过程后返回最大ID号正确,但是数据库中确早不记录,而且数据库中的表的ID确实自动增长了!!!
CREATE PROCEDURE Insert_daya_info (

@daya_id int OUTPUT, 
@daya_amountfamily int, 
@daya_amountarea numeric, 
@daya_call int, 
@daya_man int, 
@daya_salefamily int, 
@daya_salemoney numeric, 
@daya_re nvarchar(2000), 
@daya_datetime datetime, 
@daya_fistvisit int, 
@daya_secondvisit int


AS

INSERT INTO [daya_info]

(
[daya_amountfamily],
[daya_amountarea],
[daya_call],
[daya_man],
[daya_salefamily],
[daya_salemoney],
[daya_re],
[daya_datetime],
[daya_fistvisit],
[daya_secondvisit]
)

VALUES
(
@daya_amountfamily,
@daya_amountarea,
@daya_call,
@daya_man,
@daya_salefamily,
@daya_salemoney,
@daya_re,
@daya_datetime,
@daya_fistvisit,
@daya_secondvisit
)


SELECT CAST(SCOPE_IDENTITY() AS INTEGER)

GO
public virtual daya_infoTable Insert(DataSet ds, SqlTransaction tx) { daya_infoTable addedTable = (daya_infoTable)ds.Tables["daya_info"].GetChanges(DataRowState.Added); if (addedTable != null && addedTable.Rows.Count > 0) {
int tempID, newID;
foreach (daya_infoRow row in addedTable.Rows) {
try {

tempID = row.daya_id;
newID = (int)SqlHelper.ExecuteScalar(tx, CommandType.StoredProcedure, "Insert_daya_info", InsertParameters(row));
row.daya_id = newID;
//Update any child row's ForeignKeys with the new value
Helpers.DataSetNavigator.UpdateChildTableForeignKeys(ds, "daya_info", "daya_id", tempID, newID);
}
catch(Exception ex){
throw(ex);
}

}
addedTable.AcceptChanges();
}
return addedTable;
} public class DataSetNavigator { public static void UpdateChildTableForeignKeys(DataSet data, string parentTableName, string foreignKeyName, int tempFKID, int newFKID) {

//step through the relationships
foreach(DataRelation rel in data.Relations) {
if(rel.ParentTable.TableName == parentTableName) {
// update any child rows
foreach(DataRow dr in rel.ChildTable.Rows) {
if (int.Parse(dr[foreignKeyName].ToString()) == tempFKID) { //update to the new ID
dr[foreignKeyName] = newFKID;
}
}
}
}
}
}

解决方案 »

  1.   

    有过insert操作但是没有成功的时候,标识列也会增加的检查你的insert是否少了字段,是否有些字段不符合规则
      

  2.   

    如果不写事务回滚的话,只要你的values字段里缺少某个或者某个类型不符的话,都可能出现楼主所说的情况.
      

  3.   

    事务回滚是有的,如果是values字段里缺少某个或者某个类型不符的话,那在SQL事件探查器中拷出来的语句是可以正确执行的,而且表中也有记录的!!!
      

  4.   

    exec Insert_daya_info @daya_id = 0, @daya_amountfamily = 111, @daya_amountarea = 111.11, @daya_call = 222, @daya_man = 333, @daya_salefamily = NULL, @daya_salemoney = NULL, @daya_re = N'reggsgfsg', @daya_datetime = '11 30 2006 12:00AM', @daya_fistvisit = 444, @daya_secondvisit = 555确实是ROLLBACK了,但是在查询分析器上运行上面的语句是正常的啊!!!
      

  5.   

    问题是出在,在插入父表后(有事务)得到最新ID,在修改DATASET子表中的外键值是出现:
    ForeignKeyConstraint FK_dayb_info_daya_info 要求在父表中存在子键值(24)。
    父表ID是自增长的.