【问题标题】:Insert-Update Error from SQLDataReader in Webservice来自 Web 服务中 SQLDataReader 的插入更新错误
【发布时间】:2013-08-12 22:36:26
【问题描述】:

我有一个网络服务,可以根据房间库存是否可用来添加或更新房间库存。 (下面的代码)。我在使用此代码时遇到的问题是,它要么对整个范围进行添加或更新,要么抛出错误,例如,如果我将 2013 年 18 月 8 日至 2013 年 8 月 25 日期间的库存更改为18/8-23/8 没有库存,但 24/8-25/8 有,24/8 抛出错误,说明库存可用并且无法插入以停止整个过程。我希望我的代码能够添​​加或更新整个日期范围,而不仅仅是添加或修改所有内容。那可能吗?我需要为此更改我的代码吗?我怎么做?将不胜感激任何关于我哪里出错或如何更改我的代码以便能够做到这一点的见解。此代码目前是 LIVE,因此目前正在影响我们的业务流程,因此将不胜感激。

[WebMethod(Description = "Add or Amend Availability & Rates")]
        public bool Avail(string Username, string Password, DateTime Dte, DateTime Dtm, int ID, string RoomType, int Qty, double CurPrice)
        {
            GetCredentials(Username, Password);
            int ID= Convert.ToInt16(GetCredentials(Username, Password).Tables[0].Rows[0]["strTypeID"]);
            bool retVal = false;
            GetCredentials(Username, Password);
            using (SqlConnection mySQLconnection = new SqlConnection(connStr))
            {
                using (SqlCommand dbCommand = new SqlCommand("select * from Available where intID=@ID and dtm=@Dtm and strRoomType=@RoomType", mySQLconnection))
                {
                    SqlParameter dt = new SqlParameter("@Dtm", Dtm);
                    SqlParameter RoomT = new SqlParameter("@RoomType", RoomType);
                    SqlParameter typeI = new SqlParameter("@ID", ID);
                    dbCommand.Parameters.Add(dt);
                    dbCommand.Parameters.Add(RoomT);
                    dbCommand.Parameters.Add(typeI);
                    mySQLconnection.Open();
                    using (SqlDataReader reader = dbCommand.ExecuteReader())
                    {
                        if (!reader.HasRows)
                        {
                            AddAvail(Username, Password, Dte, Dtm, RoomType, Qty, CurPrice);
                            retVal = false;
                        }
                        else
                        {
                            AmdAvail(Username, Password, Dte, Dtm, RoomType, Qty, CurPrice);
                            retVal = true;
                        }
                        mySQLconnection.Close();
                        dbCommand.Dispose();
                        mySQLconnection.Dispose();
                        return retVal;
                    }            
                }
            }
        }

 /*----------------------------------------------------
     * Webmethod AddAvail Adds multiple availability for speicifed date range
     * ---------------------------------------------------*/
    [WebMethod(Description = "Multiple Add of Availability", BufferResponse = true)]
    public void AddAvail(string Username, string Password, DateTime Dte,DateTime Dtm, string RoomType, int Qty, double CurPrice)
    {
        GetAuthCredentials(Username, Password);
        DateTime dat = Dtm;
        int strTypeID = Convert.ToInt16(GetAuthCredentials(Username, Password).Tables[0].Rows[0]["strTypeID"]);
        using (SqlConnection mySQLconnection = new SqlConnection(connStr))
        {
            mySQLconnection.Open();
            for (DateTime date = Dte; date <= dat; date = date.AddDays(1.0))
            {
                string sqlInsertString = "INSERT INTO Available (dtm,intResortID,strRoomType,intQty,curPrice) VALUES (@dat,@strTypeID,@strRoomType,@intQty,@CurPrice)";
                using (SqlCommand command = new SqlCommand())
                {
                    command.Connection = mySQLconnection;
                    command.CommandText = sqlInsertString;
                    SqlParameter dt = new SqlParameter("@dat", date);
                    SqlParameter intRID = new SqlParameter("@strTypeID", strTypeID);
                    SqlParameter strRType = new SqlParameter("@strRoomType", RoomType);
                    SqlParameter intQuty = new SqlParameter("@intQty", Qty);
                    SqlParameter curpPrice = new SqlParameter("@curPrice", CurPrice);
                    command.Parameters.AddRange(new SqlParameter[] { dt, intRID, strRType, intQuty, curpPrice });
                    command.ExecuteNonQuery();
                }         
            }
        }           
    }
    /*-----------------------------------------------------
    * Webmethod AmdAvail Amends multiple Availability for specified date range
    * -----------------------------------------------------*/
    [WebMethod(Description = "Multilple Updates", BufferResponse = true)]
    public DataSet AmdAvail(string Username, string Password, DateTime Dte, DateTime Dtm, string RoomType, int Qty, double CurPrice)
    {
        GetAuthCredentials(Username, Password);
        int strTypeID = Convert.ToInt16(GetAuthCredentials(Username, Password).Tables[0].Rows[0]["strTypeID"]);
        using (SqlConnection mySQLconnection = new SqlConnection(connStr))
        {
            mySQLconnection.Open();
            using (SqlCommand dbCommand = new SqlCommand())
            {
                dbCommand.CommandText = "Update Available set intQty=@Qty,curprice=@CurPrice where dtm between @Dte and @Dtm and strRoomType=@Roomtype and intResortID=@strTypeID ";
                dbCommand.Connection = mySQLconnection;
                //Create new DataAdapter
                using (SqlDataAdapter da = new SqlDataAdapter())
                {
                    da.SelectCommand = dbCommand;
                    SqlParameter typeI = new SqlParameter("@strTypeID", strTypeID);
                    dbCommand.Parameters.Add(typeI);
                    dbCommand.Parameters.AddWithValue("@Dtm", Dtm);
                    dbCommand.Parameters.AddWithValue("@Dte", Dte);
                    dbCommand.Parameters.AddWithValue("@Qty", Qty);
                    dbCommand.Parameters.AddWithValue("@RoomType", RoomType);
                    dbCommand.Parameters.AddWithValue("@curprice", CurPrice);
                    dbCommand.Parameters.AddWithValue("@username", Username);
                    dbCommand.Parameters.AddWithValue("@password", Password);
                    DataSet ds = new DataSet();
                    da.Fill(ds);
                    return ds;
                }
            }      
        }                     
    }

【问题讨论】:

  • 显示您的 AddAvail() 方法
  • @FlopScientist 添加到编辑部分

标签: c# asp.net web-services sqldatareader sqlcommand


【解决方案1】:

由于我无权访问表架构,所以我不确定,但似乎 dtm 是表中的主键。

根据您的示例,可用表中数据的当前状态如下:-

18/08 - 没有数据

19/08 - 没有数据

20/08 - 没有数据

21/08 - 没有数据

22/08 - 没有数据

23/08 - 没有数据

24/08 - 有数据

25/08 - 有数据

如果您尝试插入 dtm BETWEEN "18/08/2013" AND "25/08/2013" 范围内的数据,它将失败,因为 24 已经获取了数据。

作为一种解决方案,您可以做的是:-

在代码中查找我的评论。搜索 //AJAY:-

[WebMethod(Description = "Add or Amend Availability & Rates")]
        public bool Avail(string Username, string Password, DateTime Dte, DateTime Dtm, int ID, string RoomType, int Qty, double CurPrice)
        {
            GetCredentials(Username, Password);
            int ID= Convert.ToInt16(GetCredentials(Username, Password).Tables[0].Rows[0]["strTypeID"]);
            bool retVal = false;
            GetCredentials(Username, Password);
            List<DataTime> existingDates = new List<DataTime>(); //AJAY:- This is to keep a track of what is already in the DataBase
            using (SqlConnection mySQLconnection = new SqlConnection(connStr))
            {
                //AJAY:- Get the data for the whole Range from the DataBase
                using (SqlCommand dbCommand = new SqlCommand("select * from Available where intID=@ID and dtm BETWEEN @Dte AND @Dtm and strRoomType=@RoomType", mySQLconnection))
                {
                    SqlParameter dtStart = new SqlParameter("@Dte", Dte);
                    SqlParameter dtEnd = new SqlParameter("@Dtm", Dtm);
                    SqlParameter RoomT = new SqlParameter("@RoomType", RoomType);
                    SqlParameter typeI = new SqlParameter("@ID", ID);
                    dbCommand.Parameters.Add(dtStart);
                    dbCommand.Parameters.Add(dtEnd);
                    dbCommand.Parameters.Add(RoomT);
                    dbCommand.Parameters.Add(typeI);
                    mySQLconnection.Open();
                    using (SqlDataReader reader = dbCommand.ExecuteReader())
                    {

                        while(reader.read())
                        {
                            existingDates.Add(Convert.ToDateTime((string)reader["Dtm"])); //AJAY:- Change it as per your format of Dtm column in table schema
                        }

                        for (DateTime date = Dte; date <= dat; date = date.AddDays(1.0))
                        {
                            if(existingDates.Contains(date)) //AJAY:- record is already there just update it
                            {
                                AmdAvail(Username, Password, date, RoomType, Qty, CurPrice);
                            }
                            else //AJAY:- Record is not present ADD it
                            {
                                AddAvail(Username, Password, date, RoomType, Qty, CurPrice);
                            }        
                        }
                        mySQLconnection.Close();
                        dbCommand.Dispose();
                        mySQLconnection.Dispose();
                        return retVal;
                    }            
                }
            }
        }

 /*----------------------------------------------------
     * //AJAY:- Webmethod AddAvail Adds single availability for a speicifed date
     * ---------------------------------------------------*/
    [WebMethod(Description = "Single Add of Availability", BufferResponse = true)]
    public void AddAvail(string Username, string Password, DateTime date, string RoomType, int Qty, double CurPrice)
    {
        GetAuthCredentials(Username, Password);
        DateTime dat = Dtm;
        int strTypeID = Convert.ToInt16(GetAuthCredentials(Username, Password).Tables[0].Rows[0]["strTypeID"]);
        using (SqlConnection mySQLconnection = new SqlConnection(connStr))
        {
            mySQLconnection.Open();
            string sqlInsertString = "INSERT INTO Available (dtm,intResortID,strRoomType,intQty,curPrice) VALUES (@dat,@strTypeID,@strRoomType,@intQty,@CurPrice)";
            using (SqlCommand command = new SqlCommand())
            {
                command.Connection = mySQLconnection;
                command.CommandText = sqlInsertString;
                SqlParameter dt = new SqlParameter("@dat", date);
                SqlParameter intRID = new SqlParameter("@strTypeID", strTypeID);
                SqlParameter strRType = new SqlParameter("@strRoomType", RoomType);
                SqlParameter intQuty = new SqlParameter("@intQty", Qty);
                SqlParameter curpPrice = new SqlParameter("@curPrice", CurPrice);
                command.Parameters.AddRange(new SqlParameter[] { dt, intRID, strRType, intQuty, curpPrice });
                command.ExecuteNonQuery();
            }         
        }           
    }
    /*-----------------------------------------------------
    * //AJAY:- Webmethod AmdAvail Amends single Availability for a specified date
    * -----------------------------------------------------*/
    [WebMethod(Description = "Single Update", BufferResponse = true)]
    public DataSet AmdAvail(string Username, string Password, DateTime date, string RoomType, int Qty, double CurPrice)
    {
        GetAuthCredentials(Username, Password);
        int strTypeID = Convert.ToInt16(GetAuthCredentials(Username, Password).Tables[0].Rows[0]["strTypeID"]);
        using (SqlConnection mySQLconnection = new SqlConnection(connStr))
        {
            mySQLconnection.Open();
            using (SqlCommand dbCommand = new SqlCommand())
            {
                //AJAY:- Just pass a single date to update
                dbCommand.CommandText = "Update Available set intQty=@Qty,curprice=@CurPrice where dtm = @Dtm and strRoomType=@Roomtype and intResortID=@strTypeID ";
                dbCommand.Connection = mySQLconnection;
                //Create new DataAdapter
                using (SqlDataAdapter da = new SqlDataAdapter())
                {
                    da.SelectCommand = dbCommand;
                    SqlParameter typeI = new SqlParameter("@strTypeID", strTypeID);
                    dbCommand.Parameters.Add(typeI);
                    dbCommand.Parameters.AddWithValue("@Dtm", date);
                    dbCommand.Parameters.AddWithValue("@Qty", Qty);
                    dbCommand.Parameters.AddWithValue("@RoomType", RoomType);
                    dbCommand.Parameters.AddWithValue("@curprice", CurPrice);
                    dbCommand.Parameters.AddWithValue("@username", Username);
                    dbCommand.Parameters.AddWithValue("@password", Password);
                    DataSet ds = new DataSet();
                    da.Fill(ds);
                    return ds;
                }
            }      
        }                     
    }

我没有编译代码,所以可能会出现一些编译错误。

希望这能解决你的问题。

【讨论】:

  • @ajaysindav10d 我也希望如此。让我试试这个,然后回复你,非常感谢你!
  • For List existingDates = new List() 我收到一个错误:错误 1 ​​找不到类型或命名空间名称“DataTime”(您是否缺少 using 指令或程序集参考?)
  • 对不起 user1270384 这是一个打字错误:- List existingDates = new List()
  • 是的,我是这么认为的。试过了,它奏效了,因此获得了赏金。谢谢大家
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-12-05
  • 2011-09-01
  • 2021-12-01
  • 1970-01-01
  • 2015-09-09
  • 2015-02-18
相关资源
最近更新 更多