将Null值传递到数据库中

时间:2012-08-06 10:45:06

标签: c# asp.net sql xml

我编写了一个服务,它从目录中读取XML文件,从数据中创建对象并将数据传递到数据库中。我之前有这个工作,但由于某种原因,该服务现在创建一个表行,但它自动插入0到数据库而不是XML文件中的数据。我的代码如下:

此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

3 个答案:

答案 0 :(得分:1)

在您从XML文件中保存后,您似乎没有将newGame添加到列表中:

gameObj.Add(new GamePlay(gameObj)); 

我认为应该是:

gameObj.Add(newGame);

答案 1 :(得分:1)

在你的array.Start方法应该这一行:

gameObj.Add(new GamePlay(gameObj));

是:

gameObj.Add(newGame);

答案 2 :(得分:0)

我认为你遇到0或者null的所有地方都是简单的int类型
发生这种情况是因为.Net中的值类型不能为空值,实际上0是int的空值 所以您应该将GamePlay类的定义从使用int更改为int?Nullable<int>

相关问题