有张表,Sid是主键,自增的,还有个name字段
下面是部分代码
ManualSign mas = new ManualSign();//实体类
mas.Name="sdsdf";
int result=msr.AddManualSign(mas);//调用插入数据方法
if(result==1)
{
  int ID=mas.Sid;
}
我调试以后发现每次mas.Sid都是0, int ID=mas.Sid;并没有得到数据库里该条记录的Sid的真实值。
请问这个问题要怎么解决呢?
请指教~谢谢~

解决方案 »

  1.   

    int ID=mas.Sid,max.Sid又没赋值插入之后,取max(sid)吧
      

  2.   

    这个跟你的AddManualSign的实现有关系啊,你不贴出来很难说的
    不过我的做法可以和楼主说一下string cmdText = "insert into XXx values(xxx);select scope_identity()";
    SqlCommand cmd = new SqlCommand(cmdText,conn);
    int newID = Convert.ToInt32(cmd.ExecuteScalar());这样可以得到自增ID
      

  3.   

    为什么不把这一系列动作放在Sql Server的存储过程里的Transaction里?
    如:
    CREATE PROCEDURE 存储过程名
    @EmployeeID int, 
    --参数列表
    @State int OUTPUT
    AS
    DECLARE @新ID int
    BEGIN
    BEGIN TRAN
    INSERT INTO 表名(...)---插入动作
    SET @新ID = SCOPE_IDENTITY();
    --再用这个新ID进行余下操作
    IF @@error <> 0
    BEGIN
    SET @State = 0;
    ROLLBACK TRAN
    END
    ELSE
    BEGIN
    SET @State = 1;
    COMMIT TRAN
    END
    END
      

  4.   

    执行msr.AddManualSign(mas);方法之后给mas.Sid赋值了吗?
      

  5.   

    呵呵,这个是我数据层里的插入一条记录的方法
    /// <summary>
    /// 增加一条数据
    /// </summary>
            public int Add(ManualSign model)
    {
                string sql = string.Format("INSERT INTO ManualSign VALUES('{0}','{1}','{2}',{3})",model .UserId ,model .SignTime ,model .SignDesc ,model .SignTag );
                SqlCommand com = new SqlCommand();
                com.CommandText = sql;
                int result = (new DataOperator()).Modify(com);
                return result;
    }这个是我调用的
       ManualSign mas = new ManualSign();
    mas.SignDesc = "sdfasd";
            mas.UserId = "fasdfsa";
    //.....
            ManualSignRule msr = new ManualSignRule();//业务逻辑层
    int result =msr.Add(mas);
    if(result==1) 

      int ID=mas.Sid; 

    mas.Sid是对应数据表里的自增主键Sid
      

  6.   

    Sid是自增的,- -赋值?
    如果要用max(Sid)的话那不是要查数据库?
      

  7.   

    关键是
    1.Sql查询是否查出id
    2.在AddManualSign方法里面是否更新了mas.Sid
      

  8.   

    各位的意思是这个吗?
    执行以后数据库Sid已经了,我执行成功后用mas.Sid并不是调用数据库里的Sid,而是获得实体类里的未赋值的mas.Sid的意思吗?那是不是不论如何我就是要再查一次数据库?
      

  9.   


    是的,你数据库生成的id并不会自动放入mas.Sid,这是一种做法供参考
    string cmdText = "insert into XXx values(xxx);select scope_identity()"; 
    SqlCommand cmd = new SqlCommand(cmdText,conn); 
    mas.Sid = Convert.ToInt32(cmd.ExecuteScalar()); 后面的select scope_identity()用于获取,前面那句insert产生的id
      

  10.   

    比较同意三楼的做法。
    output 
    @@identity(这个就是你最后插入的标识)即可性能高且简单
      

  11.   

    这跟3层不3层没关系,你用了SqlHelper没?
    SqlHelper里面有类似的这个方法
    object ExecuteScalar(string str)调用的时候SqlHelper.ExecuteScalar("insert into XXx values(xxx);select scope_identity()");
    返回值就是id了
      

  12.   

    呵呵,是啊,不是三层的问题,是我水平问题,呵呵
    SqlHelper?是自动生成代码之类会有的东西吗?
    存储过程和数据层的东西还有SQL我都不怎么行- -呵呵呵~~
      

  13.   

    把ID列转换成模板列,将Visible设置为FALSE
    使用的时候用FindControl
      

  14.   

    试一试创建一个存储过程,用out参数,插入一条数据后再从inserted表中返回id
    然后在程序中用sql参数获取
      

  15.   

    在存储过程里
    插入数据后
    select max(id) from table1 
    获取数据