0

我编写了一个从目录读取 XML 文件的服务,它从数据中创建对象并将数据传递到数据库中。我想检查每个游戏对象是否更新了数据库,如果更新正确,请删除文件,如果由于任何原因未正确添加,我想将文件移动到错误文件夹以供以后处理。

[WebMethod] 
public void RunService() 
{ 
    //Call XML loader to get collection of XML documents  
    foreach (GamePlay value in XMLLoader.Start()) 
    { 
        value.addNewGamePlay(); 
    } 
    //call inject data method for each collection 
} 

这个 XMLLoader 类返回 GamePlay 对象的数组:

public static Array Start() 
{ 
   string[] filePaths = Directory.GetFiles(@"C:\Users\bradleya\Desktop\XML\"); 
   List<GamePlay> gameObj = new List<GamePlay>();  

   foreach (string value in filePaths) 
   { 
      XmlDocument xd = new XmlDocument(); 
      xd.Load(value); 
      XmlNode documentNode = xd.SelectSingleNode("/GamePlayData/GamePlay"); 

      GamePlay newGame = new GamePlay(); 
      newGame.setType(Convert.ToString(documentNode.SelectSingleNode("type").InnerText)); 
      newGame.setGamePlayID(Convert.ToInt32(documentNode.SelectSingleNode("GamePlayID").InnerText)); 
      newGame.setParticipantID(Convert.ToInt32(documentNode.SelectSingleNode("ParticipantID").InnerText)); 
      newGame.setGameVersionID(Convert.ToInt32(documentNode.SelectSingleNode("GameVersionID").InnerText)); 
      newGame.setGameID(Convert.ToInt32(documentNode.SelectSingleNode("GameID").InnerText)); 
      newGame.setGameScenarioID(Convert.ToInt32(documentNode.SelectSingleNode("GameScenarioID").InnerText)); 
      newGame.setStartDateTime(Convert.ToDateTime(documentNode.SelectSingleNode("Start").InnerText)); 
      newGame.setEndDateTime(Convert.ToDateTime(documentNode.SelectSingleNode("End").InnerText)); 
      newGame.setSuccess(Convert.ToBoolean(documentNode.SelectSingleNode("Success").InnerText)); 

      gameObj.Add(new GamePlay); 
   } 

   return gameObj.ToArray(); 
} 

此方法在将对象变量传递给数据访问层的对象类中触发:

public void addNewGamePlay() 
{ 
    // dataaccess method call to add GamePlay 
    // (from the DB) is then set for the object 
    DataAccessConn.createNewGamePlay(this.ParticipantID, this.GameVersionID, this.GameID, this.GameScenarioID, this.StartDateTime, this.EndDateTime, this.success); 
} 

最后通过这里的数据访问层方法将数据传入数据库:

public static void createNewGamePlay(int ParticipantID, int GameVersionID,int GameID,int GameSenarioID,DateTime Start,DateTime End,Boolean success) 
{ 
   SqlConnection oConn = new SqlConnection(); 
   oConn.ConnectionString = @"Data Source=SNICKERS\SQLEXPRESS;Initial Catalog=VervePhaseOne;Integrated Security=True"; 

   oConn.Open(); 

   SqlCommand cmd = new SqlCommand(); 
   cmd.Connection = oConn; 
   cmd.CommandType = CommandType.StoredProcedure; 
   cmd.CommandText = "addGamePlay"; 

   cmd.Parameters.Add(new SqlParameter("@ParticipantID", SqlDbType.Int)); 
   cmd.Parameters["@ParticipantID"].Value = ParticipantID; 
   cmd.Parameters.Add(new SqlParameter("@GameVersionID", SqlDbType.Int)); 
   cmd.Parameters["@GameVersionID"].Value = GameVersionID; 
   cmd.Parameters.Add(new SqlParameter("@GameID", SqlDbType.Int)); 
   cmd.Parameters["@GameID"].Value = GameID; 
   cmd.Parameters.Add(new SqlParameter("@GameScenarioID", SqlDbType.Int)); 
   cmd.Parameters["@GameScenarioID"].Value = GameSenarioID; 
   cmd.Parameters.Add(new SqlParameter("@Start", SqlDbType.DateTime)); 
   cmd.Parameters["@Start"].Value = DateTime.Now; 
   cmd.Parameters.Add(new SqlParameter("@End", SqlDbType.DateTime)); 
   cmd.Parameters["@End"].Value = DateTime.Now; 
   cmd.Parameters.Add(new SqlParameter("@success", SqlDbType.Bit)); 
   cmd.Parameters["@success"].Value = success; 

   cmd.ExecuteNonQuery(); 
}

我试图传递的 XML 文件是:

 <?xml version="1.0" encoding="utf-8" ?> 
    <GamePlayData> 
      <GamePlay> 
        <type>add</type> 
        <GamePlayID>1</GamePlayID> 
        <ParticipantID>1</ParticipantID> 
        <GameVersionID>1</GameVersionID> 
        <GameID>1</GameID> 
        <GameScenarioID>1</GameScenarioID> 
        <Start>22/01/2012 23:59:59</Start>  
        <End>22/01/2012 23:59:59</End>  
        <Success>False</Success>  
      </GamePlay> 
    </GamePlayData> 

addGamePlay 存储过程是:

CREATE PROCEDURE [dbo].[addGamePlay] 
@ParticipantID int, 
@GameVersionID int, 
@GameID int, 
@GameScenarioID int, 
@Start dateTime, 
@End dateTime, 
@Success varchar(10) 
AS 
INSERT INTO GamePlay(ParticipantID,GameVersionID,GameID,GameScenarioID,StartDateTime,EndDateTime,Success) 
VALUES (@ParticipantID,@GameVersionID,@GameID,@GameScenarioID,@Start,@End,@Success) 
return @@identity 

为了澄清我的问题,在我从目录中删除文件或将其移动到错误文件夹之前,我想添加一种验证形式来检查文件是否被正确读取以及数据是否正确传递到数据库中。我正在考虑在名为“rootFile”的对象类中创建一个变量,这样我就可以轻松地删除它,并在运行服务方法中添加一个测试,如果它通过了测试,则删除 else if remove 但我不确定语法或者如果这个是最好的方法。任何建议表示赞赏。谢谢。

4

1 回答 1

0

我的一个简单建议算不上。xml 文件中存在的记录,当您在表中插入记录时,它也返回 no。受影响的行数。如果两个数字相等,则数据库已正确更新,否则会发生一些错误,希望您理解。

于 2012-08-06T14:07:45.737 回答