0

ディレクトリからXMLファイルを読み取り、データからオブジェクトを作成し、データをデータベースに渡すサービスを作成しました。以前はこれを機能させていましたが、何らかの理由でサービスがテーブル行を作成していますが、XMLファイルのデータではなく、データベースに0が自動的に挿入されています。私のコードは次のとおりです。

このWebサービスメソッドはXMLloaderクラスを起動します。

[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(gameObj));
   }

   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>

明確にするために-私の問題は、私のサービスがテーブル行を作成していることですが、変数は自動的に0に設定されています。これがコードからのものである理由を誰かが知っていますか?

前もって感謝します。

編集-要求されたストアドプロシージャが追加されたので、ありがとう

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
4

3 に答える 3

1

newGameXMLファイルからリストをハイドレイトした後、リストに追加していないようです。

gameObj.Add(new GamePlay(gameObj)); 

私はそうあるべきだと思います:

gameObj.Add(newGame);
于 2012-08-06T10:59:12.483 に答える
1

array.Startメソッドでは、次の行が必要です。

gameObj.Add(new GamePlay(gameObj));

なれ :

gameObj.Add(newGame);

于 2012-08-06T11:00:12.577 に答える
0

代わりに0またはnullに遭遇するすべての場所は、単純なint型だと思います。
これは、.Netの値型にnull値がないために発生し、実際には0がintのnull値である
ため、おそらく変更する必要があります。使用からORまでのGamePlayクラスの定義intint?Nullable<int>

于 2012-08-06T10:59:22.327 に答える