Вопрос

I have a webservice that either adds or updates room inventory based on whether it is available or not. (Code below). The problem I am having with this code is that it will either do a add or an update for the entire range or throw an error like for example if I am changing inventory for the period 18/8/2013 to 25/8/2013 and 18/8-23/8 has no inventory but 24/8-25/8 has, an error is thrown for 24/8 saying inventory is available and insert is not possible halting the entire process. I want my code to be able to add or update the entire date range rather then just doing an add or amend of everything. Is that possible? Do I need to change my code for that? How do I do that? Would be grateful for any insight on where I have gone wrong or how to change my code to be able to do this. This code is currently LIVE and so is currently affecting our business process so would be thankful for anything.

[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;
                }
            }      
        }                     
    }
Это было полезно?

Решение

As I do not have access to table schema so I am not sure but it seems like dtm is the primary key in the table.

As per your example the current state of the Data in the Available table is like this:-

18/08 - NO DATA

19/08 - NO DATA

20/08 - NO DATA

21/08 - NO DATA

22/08 - NO DATA

23/08 - NO DATA

24/08 - HAS DATA

25/08 - HAS DATA

If you try to insert data for the range dtm BETWEEN "18/08/2013" AND "25/08/2013" It will fail as 24 already has got the data.

As a solution what you can do is:-

LOOK FOR MY COMMENTS IN THE CODE. SEARCH //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;
                }
            }      
        }                     
    }

I have not compiled the code so there can be some compilation errors.

I hope this will solve your problem.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top