因为目前要做个结算的功能,所以需要把db2数据库锁一下,等操作完再解锁,想在c#里调用sql语句来完成,但是自己不会写这个sql,网上也没有搜到,请哪位高手指点一下,最好能有锁sql server,access的语句 (:P)

解决方案 »

  1.   

    你指的是不是事务操作???1. Sql写法(事物+游标)--开始事务
    BEGIN TRAN--不显示计数信息
    SET NOCOUNT ON
    DECLARE @ProjNo varchar(50),@CusNo varchar(50)--声明游标
    DECLARE CRMPSContact_cursor CURSOR FOR 
    SELECT ProjNo
    FROM CRMPSContact
    WHERE ProjNo>0--打开游标
    OPEN CRMPSContact_cursor--取第一行的值给专案变量: @ProjNo
    FETCH NEXT FROM CRMPSContact_cursor 
    INTO @ProjNo--取得客户号
    select @CusNo = CusNo 
    from CRMPSProjectM 
    where ProjNo = @ProjNo--得到CRMPSContact中某专案号对应的客户号
    update CRMPSContact 
    set CusNo = @CusNo
    where ProjNo = @ProjNo--执行错误回滚
    if @@error!=0
      begin
        rollback tran
        return
      end--移动游标,其它所有行更新操作(当到结尾时退出)
    WHILE @@FETCH_STATUS = 0
    BEGIN      
       --游标移到下一行
       FETCH NEXT FROM CRMPSContact_cursor 
       INTO @ProjNo   --取得客户号
       select @CusNo = CusNo 
       from CRMPSProjectM 
       where ProjNo = @ProjNo   --得到CRMPSContact中某专案号对应的客户号
       update CRMPSContact 
       set CusNo = @CusNo
       where ProjNo = @ProjNo
       
       --执行错误回滚
       if @@error!=0
       begin
         rollback tran
         return
       end
    END--提交所有变更
    COMMIT TRAN--关闭游标
    CLOSE CRMPSContact_cursor--释放游标
    DEALLOCATE CRMPSContact_cursor--恢复设置
    SET NOCOUNT OFF
    GO2. C#写法:
      public void UpdateContactTableByDataSet(DataSet ds,string strTblName)
    {
    try
    {
    SqlDataAdapter myAdapter = new SqlDataAdapter();
    SqlConnection  conn = new SqlConnection(strConnection);
    SqlCommand myCommand = new SqlCommand(SQL_GetAllRecordFromDemand(strTblName),conn);
    myAdapter.SelectCommand = myCommand;
    SqlCommandBuilder myCommandBuilder = new SqlCommandBuilder(myAdapter);

    conn.Open();
    SqlTransaction myTrans = conn.BeginTransaction();
    myCommand.Transaction = myTrans;

    try
    {
    myAdapter.Update(ds,strTblName);
    myTrans.Commit();
    }
    catch(Exception e)
    {
    try
    {
    myTrans.Rollback();
    }
    catch (SqlException ex)
    {
    if (myTrans.Connection != null)
    {
    Console.WriteLine("回滚失败! 异常类型: " + ex.GetType());
    }
    }
    }
    finally
    {
    conn.Close();
    }

    }
    catch(Exception ex)
    {
    throw ex;
    }
    }
      

  2.   

    不是事务的问题,就是web程序结算的时候想让其它用户都写不了表(我需要改的其实只是数据库里的7个表),如果用事务的话,在更新这7个表里前边几个表的时候担心后边的表被改写...
      

  3.   

    在你的WEB程序处理里访问一个控制标志。
      

  4.   

    JasonHeung(拥有一切也不过就这样笑着哭)
    在你的WEB程序处理里访问一个控制标志。
    可不可以说的详细点,否则看了晕
      

  5.   

    在对表操作时,可以在sql文中加xlock之类的防止其他的写操作
      

  6.   

    如果lock table这7个表再处理,是不是可行?
      

  7.   

    你可以用一个变量来标记是否正在进行此操作。如果是asp.net的程序,也可以用application变量来存这个信息。