public bool UpdateStation(String sid,String name,int level)
{
                                 StationData stationdata;//StationData是DataSet的派生类
DataRow     stationRow;
stationdata = new StationData();
stationRow  = stationdata.Tables[StationData.STATION_TABLE].NewRow();
stationRow[StationData.SID_FIELD] = sid;
stationRow[StationData.NAME_FIELD] = name;
stationRow[StationData.LEVEL_FIELD] = level ;
stationdata.Tables[StationData.STATION_TABLE].Rows.Add (stationRow);
stationdata.AcceptChanges();

dsCommand.UpdateCommand = GetUpdateCommand();
            
dsCommand.Update(StationData, StationData.STATION_TABLE );
//上面一句调试时执行了,没有异常,但不能达到修改数据的目的
if ( StationData.HasErrors )
{
stationdata.Tables[StationData.STATION_TABLE ].GetErrors()[0].ClearErrors();
return false;
}
else
{
StationData.AcceptChanges();
return true;
}
}                private SqlCommand GetUpdateCommand()
{
if ( updateCommand == null )
{
updateCommand = new SqlCommand("UpdateStation",new SqlConnection (InitConnectionString ));
//连接串经过测试是正确的,用来插入数据时能正确插入
updateCommand.CommandType = CommandType.StoredProcedure;
            
SqlParameterCollection sqlParams = updateCommand.Parameters;
            
sqlParams.Add(new SqlParameter(SID_PARM, SqlDbType.NVarChar,5));
sqlParams.Add(new SqlParameter(NAME_PARM, SqlDbType.NVarChar, 50));
sqlParams.Add(new SqlParameter(LEVEL_PARM, SqlDbType.Int));
//

sqlParams[SID_PARM].SourceColumn = StationData.SID_FIELD;
sqlParams[NAME_PARM].SourceColumn = StationData.NAME_FIELD;
sqlParams[LEVEL_PARM].SourceColumn = StationData.LEVEL_FIELD
}
            
return updateCommand;
}
        
以下是SQL Server上的存储过程
CREATE PROCEDURE UpdateStation
    @sid         NVARCHAR(5),
    @name      NVARCHAR(50),
    @level      int
AS
    SET XACT_ABORT ON
    BEGIN TRANSACTION
       UPDATE [Station] 
           SET [name]= @name,[level] = @level
         WHERE [sid] = @sid
    COMMIT TRANSACTION
    RETURN 0
GO

解决方案 »

  1.   

    在SQL SERVER上单独调试SP UpdateStation 了没有?
      

  2.   

    请先确定是sql的问题还是.net代码的问题,这么一堆东西贴上来谁也不会仔细看的,提问之前自己先大致排查一下吧
      

  3.   

    去掉Update之前的AcceptChanges(),如:stationdata.Tables[StationData.STATION_TABLE].Rows.Add (stationRow); 
    //stationdata.AcceptChanges(); dsCommand.UpdateCommand = GetUpdateCommand(); 
      

  4.   

    在SQL SERVER上单独调试SP UpdateStation 通过,能更新数据
      

  5.   

    updateCommand = new SqlCommand("UpdateStation",new SqlConnection (InitConnectionString )); 没打开数据库连接吧??
      

  6.   

    把这段代码中出现的第一个stationdata.AcceptChanges()去掉,行状态在数据提交前就改变了是没法更新到数据库的。
      

  7.   

    打开是正确的,这里不是直接执行updateCommand,而是通过下面一句
    dsCommand.UpdateCommand = GetUpdateCommand(); dsCommand的定义如下
    private SqlDataAdapter dsCommand;
    最终通过
     SqlDataAdapter 的Update来完成更新,数据库连接是在SqlDataAdapter在执行操作时打开的,是自动完成的
    我的插入数据也采用这种方法,是正确的
      

  8.   

    是.net代码的问题,因为sql是调试过的
      

  9.   

    去掉Update之前的AcceptChanges(),则会将数据直接插入到数据库,这个昨晚我实验过了(前提是提供了一个有效的SqlInsertCommand,而且数据库中没有设主键,如果设了主键,会提示主键重复错误)
    我可能没有给大家说清楚,dsCommand的定义如下 
    private SqlDataAdapter dsCommand;