You are viewing a plain text version of this content. The canonical link for it is here.
Posted to stonehenge-commits@incubator.apache.org by be...@apache.org on 2009/09/22 19:34:25 UTC

svn commit: r817792 - in /incubator/stonehenge/trunk/stocktrader/dotnet/common/StockTraderDALMySQL: ./ Customer.cs MarketSummary.cs MySQLHelper.cs Order.cs StockTraderDALMySQL.csproj stocktrader.snk

Author: bendewey
Date: Tue Sep 22 19:34:18 2009
New Revision: 817792

URL: http://svn.apache.org/viewvc?rev=817792&view=rev
Log:
STONEHENGE-53 (Part2) sorry Joby


Added:
    incubator/stonehenge/trunk/stocktrader/dotnet/common/StockTraderDALMySQL/
    incubator/stonehenge/trunk/stocktrader/dotnet/common/StockTraderDALMySQL/Customer.cs
    incubator/stonehenge/trunk/stocktrader/dotnet/common/StockTraderDALMySQL/MarketSummary.cs
    incubator/stonehenge/trunk/stocktrader/dotnet/common/StockTraderDALMySQL/MySQLHelper.cs
    incubator/stonehenge/trunk/stocktrader/dotnet/common/StockTraderDALMySQL/Order.cs
    incubator/stonehenge/trunk/stocktrader/dotnet/common/StockTraderDALMySQL/StockTraderDALMySQL.csproj
    incubator/stonehenge/trunk/stocktrader/dotnet/common/StockTraderDALMySQL/stocktrader.snk   (with props)

Added: incubator/stonehenge/trunk/stocktrader/dotnet/common/StockTraderDALMySQL/Customer.cs
URL: http://svn.apache.org/viewvc/incubator/stonehenge/trunk/stocktrader/dotnet/common/StockTraderDALMySQL/Customer.cs?rev=817792&view=auto
==============================================================================
--- incubator/stonehenge/trunk/stocktrader/dotnet/common/StockTraderDALMySQL/Customer.cs (added)
+++ incubator/stonehenge/trunk/stocktrader/dotnet/common/StockTraderDALMySQL/Customer.cs Tue Sep 22 19:34:18 2009
@@ -0,0 +1,563 @@
+//
+// Licensed to the Apache Software Foundation (ASF) under one or more
+// contributor license agreements.  See the NOTICE file distributed with
+// this work for additional information regarding copyright ownership.
+// The ASF licenses this file to You under the Apache License, Version 2.0
+// (the "License"); you may not use this file except in compliance with
+// the License.  You may obtain a copy of the License at
+//
+//      http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+//
+
+//  .Net StockTrader Sample WCF Application for Benchmarking, Performance Analysis and Design Considerations for Service-Oriented Applications
+
+
+//===============================================================================================
+// Customer is part of the SQLServer DAL for StockTrader.  This is called from the
+// BSL to execute commands against the database.  It is constructed to use one SqlConnection per
+// instance.  Hence, BSLs that use this DAL should always be instanced properly.
+// The DAL will work with both ADO.NET and System.Transactions or ServiceComponents/Enterprise
+// Services attributed transactions [autocomplete]. When using ADO.NET transactions,
+// The BSL will control the transaction boundaries with calls to dal.BeginTransaction(); 
+// dal.CommitTransaction(); dal.RollbackTransaction().
+//===============================================================================================
+//======================================================================================================
+// Code originally contributed by Microsoft Corporation.
+// This contribution to the Stonehenge project is limited strictly 
+// to the source code that is submitted in this submission.  
+// Any technology, including underlying platform technology, 
+// that is referenced or required by the submitted source code 
+// is not a part of the contribution.  
+// For example and not by way of limitation, 
+// any systems/Windows libraries (WPF, WCF, ASP.NET etc.) 
+// required to run the submitted source code is not a part of the contribution
+//======================================================================================================
+
+
+using System;
+using System.Collections.Generic;
+using System.Text;
+using System.Data;
+using MySql.Data.MySqlClient;
+using MySql.Data.Types;
+using Trade.IDAL;
+using Trade.Utility;
+using Trade.ConfigServiceDataContract;
+using Trade.BusinessServiceDataContract;
+
+
+namespace Trade.DALMySQL
+{
+    public class Customer : ICustomer
+    {
+        public Customer()
+        {
+        }
+
+        //Constructor for internal DAL-DAL calls to use an existing DB connection.
+        public Customer(MySqlConnection conn, MySqlTransaction trans)
+        {
+            _internalConnection = conn;
+            _internalADOTransaction = trans;
+        }
+
+        private MySqlConnection _internalConnection;
+        private MySqlTransaction _internalADOTransaction = null;
+
+        //Used only when doing ADO.NET transactions.
+        //This will be completely ignored when null, and not attached to a cmd object
+        //In MySQLHelper unless it has been initialized explicitly in the BSL with a
+        //dal.BeginADOTransaction().  See app config setting in web.config and 
+        //Trade.BusinessServiceHost.exe.config "Use System.Transactions Globally" which determines
+        //whether user wants to run with ADO transactions or System.Transactions.  The DAL itself
+        //is built to be completely agnostic and will work with either.
+        public void BeginADOTransaction()
+        {
+            if (_internalConnection.State != ConnectionState.Open)
+                _internalConnection.Open();
+            _internalADOTransaction = _internalConnection.BeginTransaction(System.Data.IsolationLevel.ReadCommitted);
+        }
+
+        //Used only when doing ADO.NET transactions.
+        public void RollBackTransaction()
+        {
+            _internalADOTransaction.Rollback();
+            _internalADOTransaction = null;
+        }
+
+        //Used only when doing ADO.NET transactions.
+        public void CommitADOTransaction()
+        {
+            _internalADOTransaction.Commit();
+            _internalADOTransaction = null;
+        }
+
+        public void Open(string connString)
+        {
+            if (_internalConnection == null)
+                _internalConnection = new MySqlConnection(connString);
+            if (_internalConnection.State != ConnectionState.Open)
+                _internalConnection.Open();
+        }
+
+        public void Close()
+        {
+            if (_internalConnection != null && _internalConnection.State != ConnectionState.Closed)
+                _internalConnection.Close();
+        }
+
+        //This would be the more efficient way to get holding data with quote price part of the model class/mapping, but do not use to maintain compatibility with Trade 6.1.  While
+        //this query is easy with ADO.NET (or JDBC); it would be very problematic with EJB Entity Beans to do efficiently.  
+        //private const string SQL_SELECT_HOLDINGS = "SELECT HOLDING.HOLDINGID, HOLDING.QUANTITY, HOLDING.PURCHASEPRICE, HOLDING.PURCHASEDATE, HOLDING.QUOTE_SYMBOL,HOLDING.ACCOUNT_ACCOUNTID, " +
+        //                                           "QUOTE.PRICE FROM ACCOUNT INNER JOIN HOLDING ON ACCOUNT.ACCOUNTID = HOLDING.ACCOUNT_ACCOUNTID INNER JOIN " +
+        //                                           "QUOTE ON HOLDING.QUOTE_SYMBOL = QUOTE.SYMBOL WHERE (ACCOUNT.PROFILE_USERID = @UserId) ORDER BY HOLDING.HOLDINGID DESC";
+
+        private const string SQL_SELECT_HOLDINGS = @"SELECT HOLDING.HOLDINGID, HOLDING.QUANTITY, HOLDING.PURCHASEPRICE, HOLDING.PURCHASEDATE, HOLDING.QUOTE_SYMBOL,HOLDING.ACCOUNT_ACCOUNTID 
+                                                    from holding WHERE HOLDING.ACCOUNT_ACCOUNTID = (SELECT ACCOUNTID FROM ACCOUNT WHERE PROFILE_USERID = ?UserId) ORDER BY HOLDING.HOLDINGID DESC";
+        private const string SQL_SELECT_HOLDING_LOCK = @"SELECT HOLDING.HOLDINGID, HOLDING.ACCOUNT_ACCOUNTID, HOLDING.QUANTITY, HOLDING.PURCHASEPRICE, HOLDING.PURCHASEDATE,
+                                                       HOLDING.QUOTE_SYMBOL FROM HOLDING  INNER JOIN ORDERS ON HOLDING.HOLDINGID = ORDERS.HOLDING_HOLDINGID
+                                                       WHERE (ORDERS.ORDERID = ?OrderId)";
+        private const string SQL_SELECT_HOLDING_NOLOCK = "SELECT HOLDING.ACCOUNT_ACCOUNTID, HOLDING.QUANTITY, HOLDING.PURCHASEPRICE, HOLDING.PURCHASEDATE, HOLDING.QUOTE_SYMBOL FROM HOLDING WHERE HOLDING.HOLDINGID=?holdingId AND HOLDING.ACCOUNT_ACCOUNTID = (SELECT ACCOUNTID FROM ACCOUNT WHERE PROFILE_USERID = ?UserId)";
+        private const string SQL_SELECT_GET_CUSTOMER_BYUSERID = "SELECT account.ACCOUNTID, account.PROFILE_USERID, account.CREATIONDATE, account.OPENBALANCE, account.LOGOUTCOUNT, account.BALANCE, account.LASTLOGIN, account.LOGINCOUNT FROM account WHERE account.PROFILE_USERID = ?UserId";
+        private const string SQL_SELECT_CUSTOMERPROFILE_BYUSERID = "SELECT accountprofile.USERID, accountprofile.PASSWORD, accountprofile.FULLNAME, accountprofile.ADDRESS, accountprofile.EMAIL, accountprofile.CREDITCARD FROM accountprofile WHERE accountprofile.USERID = ?UserId";
+        private const string SQL_SELECT_UPDATE_CUSTOMER_LOGIN = "UPDATE account  SET LOGINCOUNT = (LOGINCOUNT + 1), LASTLOGIN = CURRENT_TIMESTAMP where PROFILE_USERID= ?UserId; SELECT account.ACCOUNTID, account.CREATIONDATE, account.OPENBALANCE, account.LOGOUTCOUNT, account.BALANCE, account.LASTLOGIN, account.LOGINCOUNT FROM account  WHERE account.PROFILE_USERID = ?UserId";
+        private const string SQL_UPDATE_LOGOUT = "UPDATE account  SET LOGOUTCOUNT = (LOGOUTCOUNT + 1) where PROFILE_USERID= ?UserId";
+        private const string SQL_UPDATE_ACCOUNTPROFILE = "UPDATE accountprofile  SET ADDRESS=?Address, PASSWORD=?Password, EMAIL=?Email, CREDITCARD = ?CreditCard, FULLNAME=?FullName WHERE USERID= ?UserId";
+        private const string SQL_SELECT_CLOSED_ORDERS = "SELECT ORDERID, ORDERTYPE, ORDERSTATUS, COMPLETIONDATE, OPENDATE, QUANTITY, PRICE, ORDERFEE, QUOTE_SYMBOL FROM orders WHERE ACCOUNT_ACCOUNTID = (select accountid from account where profile_userid =?UserId) AND ORDERSTATUS = 'closed'";
+        private const string SQL_UPDATE_CLOSED_ORDERS = "UPDATE orders SET ORDERSTATUS = 'completed' where ORDERSTATUS = 'closed' AND ACCOUNT_ACCOUNTID = (select accountid from account where profile_userid =?UserId)";
+        private const string SQL_SELECT_ORDERS_BY_ID = " o.ORDERID, o.ORDERTYPE, o.ORDERSTATUS, o.OPENDATE, o.COMPLETIONDATE, o.QUANTITY, o.PRICE, o.ORDERFEE, o.QUOTE_SYMBOL from orders o where o.account_accountid = (select a.accountid from account a where a.profile_userid = ?UserId) ORDER BY o.ORDERID DESC";
+        private const string SQL_INSERT_ACCOUNTPROFILE = "INSERT INTO accountprofile VALUES (?Address, ?Password, ?UserId, ?Email, ?CreditCard, ?FullName)";
+        private const string SQL_INSERT_ACCOUNT = "INSERT INTO account (CREATIONDATE, OPENBALANCE, LOGOUTCOUNT, BALANCE, LASTLOGIN, LOGINCOUNT, PROFILE_USERID) VALUES (NOW(), ?OpenBalance, ?LogoutCount, ?Balance, ?LastLogin, ?LoginCount, ?UserId); SELECT LAST_INSERT_ID()";
+        private const string SQL_DEBIT_ACCOUNT = "UPDATE ACCOUNT  SET BALANCE=(BALANCE-?Debit) WHERE ACCOUNTID=?AccountId";
+
+        //Parameters
+        private const string PARM_USERID = "?UserId";
+        private const string PARM_HOLDINGID = "?holdingId";
+        private const string PARM_ORDERID = "?OrderId";
+        private const string PARM_ACCOUNTID = "?accountId";
+        private const string PARM_PASSWORD = "?Password";
+        private const string PARM_FULLNAME = "?FullName";
+        private const string PARM_ADDRESS = "?Address";
+        private const string PARM_EMAIL = "?Email";
+        private const string PARM_CREDITCARD = "?CreditCard";
+        private const string PARM_OPENBALANCE = "?OpenBalance";
+        private const string PARM_LOGOUTCOUNT = "?LogoutCount";
+        private const string PARM_BALANCE = "?Balance";
+        private const string PARM_LASTLOGIN = "?LastLogin";
+        private const string PARM_LOGINCOUNT = "?LoginCount";
+        private const string PARM_TOPORDERS = "?TopOrders";
+        private const string PARM_DEBIT = "?Debit";
+
+
+        public List<OrderDataModel> getOrders(string userID, bool top, int maxTop, int maxDefault)
+        {
+
+            //Here you can configure between two settings: top default to display
+            //is MAX_DISPLAY_ORDERS; the upper limit is MAX_DISPLAY_TOP_ORDERS.
+            //Set these in Web.Config/Trade.BusinessServiceHost.exe.config; and those will be the toggle 
+            //choices for the user in the Account.aspx page.
+            try
+            {
+                string commandText;
+                if (top)
+                {
+                    commandText = "Select " + SQL_SELECT_ORDERS_BY_ID + " LIMIT 0," + maxTop.ToString();
+                }
+                else
+                {
+                    commandText = "Select " + SQL_SELECT_ORDERS_BY_ID + " LIMIT 0," + maxDefault.ToString();
+                }
+                MySqlParameter accountidparm = new MySqlParameter(PARM_USERID, MySqlDbType.VarChar, 20);
+                accountidparm.Value = userID;
+                MySqlDataReader rdr = MySQLHelper.ExecuteReaderSingleParm(_internalConnection, _internalADOTransaction, CommandType.Text, commandText, accountidparm);
+                List<OrderDataModel> orders = new List<OrderDataModel>();
+                while (rdr.Read())
+                {
+                    int orderid = rdr.GetInt32(0);
+                    DateTime openDate = (DateTime)rdr.GetDateTime(3);
+                    Object completionDate = null;
+                    //can be null
+                    try
+                    {
+                        if (!Convert.IsDBNull(rdr.GetDateTime(4)))
+                            completionDate = rdr.GetDateTime(4);
+                        else
+                            completionDate = DateTime.MinValue;
+                    }
+                    catch (Exception e)
+                    {
+                        string message = e.Message;
+                        completionDate = DateTime.MinValue;
+                    }
+                    OrderDataModel order = new OrderDataModel(orderid, rdr.GetString(1), rdr.GetString(2), openDate, (DateTime)completionDate, rdr.GetDouble(5), rdr.GetDecimal(6), rdr.GetDecimal(7), rdr.GetString(8));
+                    orders.Add(order);
+                }
+                rdr.Close();
+                return orders;
+            }
+            catch
+            {
+                throw;
+            }
+        }
+
+        public AccountDataModel login(string userid, string password)
+        {
+            try
+            {
+                MySqlParameter parm1 = new MySqlParameter(PARM_USERID, MySqlDbType.VarChar, 20);
+                parm1.Value = userid;
+                MySqlDataReader rdr = MySQLHelper.ExecuteReaderSingleRowSingleParm(_internalConnection, _internalADOTransaction, CommandType.Text, SQL_SELECT_CUSTOMERPROFILE_BYUSERID, parm1);
+                if (rdr.Read())
+                {
+                    string userPassword = rdr.GetString(1);
+                    rdr.Close();
+                    if (userPassword.Equals(password))
+                    {
+                        MySqlParameter profileparm1 = new MySqlParameter(PARM_USERID, MySqlDbType.VarChar, 20);
+                        profileparm1.Value = userid;
+                        rdr = MySQLHelper.ExecuteReaderSingleRowSingleParm(_internalConnection, _internalADOTransaction, CommandType.Text, SQL_SELECT_UPDATE_CUSTOMER_LOGIN, profileparm1);
+                        rdr.Read();
+                        AccountDataModel customer = new AccountDataModel(rdr.GetInt32(0), userid, rdr.GetDateTime(1), rdr.GetDecimal(2), rdr.GetInt32(3), rdr.GetDecimal(4), rdr.GetDateTime(5), rdr.GetInt32(6) + 1);
+                        rdr.Close();
+                        return customer;
+                    }
+                    rdr.Close();
+                }
+                return null;
+            }
+            catch
+            {
+                throw;
+            }
+        }
+
+        public AccountProfileDataModel getAccountProfileData(string userid)
+        {
+            try
+            {
+                MySqlParameter parm1 = new MySqlParameter(PARM_USERID, MySqlDbType.VarChar, 20);
+                parm1.Value = userid;
+                MySqlDataReader rdr = MySQLHelper.ExecuteReaderSingleRowSingleParm(_internalConnection, _internalADOTransaction, CommandType.Text, SQL_SELECT_CUSTOMERPROFILE_BYUSERID, parm1);
+                if (rdr.Read())
+                {
+                    AccountProfileDataModel customerprofile = new AccountProfileDataModel(rdr.GetString(0), rdr.GetString(1), rdr.GetString(2), rdr.GetString(3), rdr.GetString(4), rdr.GetString(5));
+                    rdr.Close();
+                    return customerprofile;
+                }
+                rdr.Close();
+                return null;
+            }
+            catch
+            {
+                throw;
+            }
+        }
+
+        public void logOutUser(string userID)
+        {
+            try
+            {
+                MySqlParameter parm1 = new MySqlParameter(PARM_USERID, MySqlDbType.VarChar, 20);
+                parm1.Value = userID;
+                MySQLHelper.ExecuteNonQuery(_internalConnection, _internalADOTransaction, CommandType.Text, SQL_UPDATE_LOGOUT, parm1);
+                return;
+            }
+            catch
+            {
+                throw;
+            }
+        }
+
+        public AccountDataModel getCustomerByUserID(string userID)
+        {
+            try
+            {
+                MySqlParameter parm1 = new MySqlParameter(PARM_USERID, MySqlDbType.VarChar, 20);
+                parm1.Value = userID;
+                MySqlDataReader rdr = MySQLHelper.ExecuteReaderSingleRowSingleParm(_internalConnection, _internalADOTransaction, CommandType.Text, SQL_SELECT_GET_CUSTOMER_BYUSERID, parm1);
+                if (rdr.Read())
+                {
+                    AccountDataModel customer = new AccountDataModel(rdr.GetInt32(0), rdr.GetString(1), rdr.GetDateTime(2), rdr.GetDecimal(3), rdr.GetInt32(4), rdr.GetDecimal(5), rdr.GetDateTime(6), rdr.GetInt32(7));
+                    rdr.Close();
+                    return customer;
+                }
+                rdr.Close();
+                return null;
+            }
+            catch
+            {
+                throw;
+            }
+        }
+
+        public List<OrderDataModel> getClosedOrders(string userId)
+        {
+            try
+            {
+                MySqlParameter useridparm = new MySqlParameter(PARM_USERID, MySqlDbType.VarChar, 20);
+                useridparm.Value = userId;
+                MySqlDataReader rdr = MySQLHelper.ExecuteReaderSingleParm(_internalConnection, _internalADOTransaction, CommandType.Text, SQL_SELECT_CLOSED_ORDERS, useridparm);
+                List<OrderDataModel> closedorders = new List<OrderDataModel>();
+                DateTime completionDate = DateTime.MinValue;
+                while (rdr.Read())
+                {
+                    int orderid = rdr.GetInt32(0);
+                    DateTime openDate = (DateTime)rdr.GetDateTime(4);
+                    try
+                    {
+                        completionDate = (DateTime)rdr.GetDateTime(3);
+                    }
+                    catch (Exception e) { if (e.Message.Equals("Data is Null. This method or property cannot be called on Null values.")) completionDate = DateTime.MinValue; }
+                    OrderDataModel order = new OrderDataModel(orderid, rdr.GetString(1), rdr.GetString(2), openDate, completionDate, rdr.GetDouble(5), rdr.GetDecimal(6), rdr.GetDecimal(7), rdr.GetString(8));
+                    order.orderStatus = StockTraderUtility.ORDER_STATUS_COMPLETED;
+                    closedorders.Add(order);
+                }
+                if (rdr.HasRows)
+                {
+                    rdr.Close();
+                    useridparm = new MySqlParameter(PARM_USERID, MySqlDbType.VarChar, 20);
+                    useridparm.Value = userId;
+                    MySQLHelper.ExecuteNonQuerySingleParm(_internalConnection, _internalADOTransaction, CommandType.Text, SQL_UPDATE_CLOSED_ORDERS, useridparm);
+                }
+                else
+                    rdr.Close();
+                return closedorders;
+            }
+            catch
+            {
+                throw;
+            }
+        }
+
+        public List<HoldingDataModel> getHoldings(string userID)
+        {
+            try
+            {
+                MySqlParameter useridparm = new MySqlParameter(PARM_USERID, MySqlDbType.VarChar, 20);
+                useridparm.Value = userID;
+                MySqlDataReader rdr = MySQLHelper.ExecuteReaderSingleParm(_internalConnection, _internalADOTransaction, CommandType.Text, SQL_SELECT_HOLDINGS, useridparm);
+                List<HoldingDataModel> holdings = new List<HoldingDataModel>();
+                while (rdr.Read())
+                {
+                    HoldingDataModel holding = new HoldingDataModel(rdr.GetInt32(0), rdr.GetDouble(1), rdr.GetDecimal(2), rdr.GetDateTime(3), rdr.GetString(4), rdr.GetInt32(5));
+                    holdings.Add(holding);
+                }
+                rdr.Close();
+                return holdings;
+            }
+            catch
+            {
+                throw;
+            }
+        }
+
+        public HoldingDataModel getHoldingForUpdate(int orderID)
+        {
+            try
+            {
+                MySqlParameter orderIDparm = new MySqlParameter(PARM_ORDERID, MySqlDbType.Int32);
+                orderIDparm.Value = orderID;
+                MySqlDataReader rdr = MySQLHelper.ExecuteReaderSingleRowSingleParm(_internalConnection, _internalADOTransaction, CommandType.Text, SQL_SELECT_HOLDING_LOCK, orderIDparm);
+                while (rdr.Read())
+                {
+                    HoldingDataModel holding = new HoldingDataModel(rdr.GetInt32(0), rdr.GetInt32(1), rdr.GetDouble(2), rdr.GetDecimal(3), rdr.GetDateTime(4), rdr.GetString(5));
+                    rdr.Close();
+                    return holding;
+                }
+                return null;
+            }
+            catch
+            {
+                throw;
+            }
+        }
+
+        public HoldingDataModel getHolding(string userid, int holdingid)
+        {
+            try
+            {
+                MySqlParameter[] holdingidparms = new MySqlParameter[]{new MySqlParameter(PARM_HOLDINGID, MySqlDbType.Int32), 
+                                                new MySqlParameter(PARM_USERID, MySqlDbType.VarChar, 20)};
+                holdingidparms[0].Value = holdingid;
+                holdingidparms[1].Value = userid;
+                MySqlDataReader rdr = MySQLHelper.ExecuteReaderSingleRow(_internalConnection, _internalADOTransaction, CommandType.Text, SQL_SELECT_HOLDING_NOLOCK, holdingidparms);
+                while (rdr.Read())
+                {
+                    HoldingDataModel holding = new HoldingDataModel(holdingid, rdr.GetInt32(0), rdr.GetDouble(1), rdr.GetDecimal(2), rdr.GetDateTime(3), rdr.GetString(4));
+                    rdr.Close();
+                    return holding;
+                }
+                return null;
+            }
+            catch
+            {
+                throw;
+            }
+        }
+
+        public void updateAccountBalance(int accountID, decimal total)
+        {
+            try
+            {
+                // Get the parameters from the cache
+                MySqlParameter[] accountParms = GetUpdateAccountBalanceParameters();
+                accountParms[0].Value = total;
+                accountParms[1].Value = accountID;
+                MySQLHelper.ExecuteNonQuery(_internalConnection, _internalADOTransaction, CommandType.Text, SQL_DEBIT_ACCOUNT, accountParms);
+            }
+            catch
+            {
+                throw;
+            }
+            return;
+        }
+
+        public void insertAccount(AccountDataModel customer)
+        {
+            // Get the parameters from the cache
+            MySqlParameter[] AccountParms = GetCreateAccountParameters();
+            try
+            {
+                AccountParms[0].Value = customer.openBalance;
+                AccountParms[1].Value = customer.logoutCount;
+                AccountParms[2].Value = customer.balance;
+                AccountParms[3].Value = customer.lastLogin;
+                AccountParms[4].Value = customer.loginCount;
+                AccountParms[5].Value = customer.profileID;
+                customer.accountID = Convert.ToInt32(MySQLHelper.ExecuteScalar(_internalConnection, _internalADOTransaction, CommandType.Text, SQL_INSERT_ACCOUNT, AccountParms));
+                return;
+            }
+            catch
+            {
+                throw;
+            }
+        }
+
+        public void insertAccountProfile(AccountProfileDataModel customerprofile)
+        {
+            // Get the paramters from the cache
+            MySqlParameter[] ProfileParms = GetCreateAccountProfileParameters();
+            try
+            {
+                ProfileParms[0].Value = customerprofile.address;
+                ProfileParms[1].Value = customerprofile.password;
+                ProfileParms[2].Value = customerprofile.userID;
+                ProfileParms[3].Value = customerprofile.email;
+                ProfileParms[4].Value = customerprofile.creditCard;
+                ProfileParms[5].Value = customerprofile.fullName;
+                 MySQLHelper.ExecuteNonQuery(_internalConnection, _internalADOTransaction, CommandType.Text, SQL_INSERT_ACCOUNTPROFILE, ProfileParms);
+            }
+            catch
+            {
+                throw;
+            }
+        }
+
+        public AccountProfileDataModel update(AccountProfileDataModel customerprofile)
+        {
+            try
+            {
+                // Get the paramters from the cache
+                MySqlParameter[] ProfileParms = GetUpdateAccountProfileParameters();
+                ProfileParms[0].Value = customerprofile.address;
+                ProfileParms[1].Value = customerprofile.password;
+                ProfileParms[2].Value = customerprofile.email;
+                ProfileParms[3].Value = customerprofile.creditCard;
+                ProfileParms[4].Value = customerprofile.fullName;
+                ProfileParms[5].Value = customerprofile.userID;
+                 MySQLHelper.ExecuteNonQuery(_internalConnection, _internalADOTransaction, CommandType.Text, SQL_UPDATE_ACCOUNTPROFILE, ProfileParms);
+                return customerprofile;
+            }
+            catch
+            {
+                throw;
+            }
+        }
+
+        private static MySqlParameter[] GetUpdateAccountBalanceParameters()
+        {
+            // Get the paramters from the cache
+            MySqlParameter[] parms = MySQLHelper.GetCacheParameters(SQL_DEBIT_ACCOUNT);
+            // If the cache is empty, rebuild the parameters
+            if (parms == null)
+            {
+                parms = new MySqlParameter[] {new MySqlParameter(PARM_DEBIT, MySqlDbType.Decimal, 14),
+                                            new MySqlParameter(PARM_ACCOUNTID, MySqlDbType.Int32)};
+                // Add the parameters to the cached
+                MySQLHelper.CacheParameters(SQL_DEBIT_ACCOUNT, parms);
+            }
+            return parms;
+        }
+
+        private static MySqlParameter[] GetCreateAccountProfileParameters()
+        {
+            // Get the parameters from the cache
+            MySqlParameter[] parms = MySQLHelper.GetCacheParameters(SQL_INSERT_ACCOUNTPROFILE);
+            // If the cache is empty, rebuild the parameters
+            if (parms == null)
+            {
+                parms = new MySqlParameter[] {
+        			  new MySqlParameter(PARM_ADDRESS, MySqlDbType.VarChar, StockTraderUtility.ADDRESS_MAX_LENGTH),
+		              new MySqlParameter(PARM_PASSWORD, MySqlDbType.VarChar, StockTraderUtility.PASSWORD_MAX_LENGTH),
+                      new MySqlParameter(PARM_USERID, MySqlDbType.VarChar, StockTraderUtility.USERID_MAX_LENGTH),
+                      new MySqlParameter(PARM_EMAIL, MySqlDbType.VarChar, StockTraderUtility.EMAIL_MAX_LENGTH),
+                      new MySqlParameter(PARM_CREDITCARD, MySqlDbType.VarChar, StockTraderUtility.CREDITCARD_MAX_LENGTH),
+                      new MySqlParameter(PARM_FULLNAME, MySqlDbType.VarChar, StockTraderUtility.FULLNAME_MAX_LENGTH)};
+
+                // Add the parametes to the cached
+                MySQLHelper.CacheParameters(SQL_INSERT_ACCOUNTPROFILE, parms);
+            }
+            return parms;
+        }
+
+        private static MySqlParameter[] GetUpdateAccountProfileParameters()
+        {
+            // Get the parameters from the cache
+            MySqlParameter[] parms = MySQLHelper.GetCacheParameters(SQL_UPDATE_ACCOUNTPROFILE);
+            // If the cache is empty, rebuild the parameters
+            if (parms == null)
+            {
+                parms = new MySqlParameter[] {
+            		  new MySqlParameter(PARM_ADDRESS, MySqlDbType.VarChar, StockTraderUtility.ADDRESS_MAX_LENGTH),
+					  new MySqlParameter(PARM_PASSWORD, MySqlDbType.VarChar, StockTraderUtility.PASSWORD_MAX_LENGTH),
+                      new MySqlParameter(PARM_EMAIL, MySqlDbType.VarChar, StockTraderUtility.EMAIL_MAX_LENGTH),
+                      new MySqlParameter(PARM_CREDITCARD, MySqlDbType.VarChar, StockTraderUtility.CREDITCARD_MAX_LENGTH),
+                      new MySqlParameter(PARM_FULLNAME, MySqlDbType.VarChar, StockTraderUtility.FULLNAME_MAX_LENGTH),
+                      new MySqlParameter(PARM_USERID, MySqlDbType.VarChar, StockTraderUtility.USERID_MAX_LENGTH)};
+
+                // Add the parametes to the cached
+                MySQLHelper.CacheParameters(SQL_UPDATE_ACCOUNTPROFILE, parms);
+            }
+            return parms;
+        }
+
+        private static MySqlParameter[] GetCreateAccountParameters()
+        {
+            // Get the parameters from the cache
+            MySqlParameter[] parms = MySQLHelper.GetCacheParameters(SQL_INSERT_ACCOUNT);
+            // If the cache is empty, rebuild the parameters
+            if (parms == null)
+            {
+                parms = new MySqlParameter[] {
+					  new MySqlParameter(PARM_OPENBALANCE, MySqlDbType.Decimal),
+                      new MySqlParameter(PARM_LOGOUTCOUNT, MySqlDbType.Int32),
+                      new MySqlParameter(PARM_BALANCE, MySqlDbType.Decimal),
+                      new MySqlParameter(PARM_LASTLOGIN, MySqlDbType.DateTime),
+                      new MySqlParameter(PARM_LOGINCOUNT, MySqlDbType.Int32),
+                      new MySqlParameter(PARM_USERID, MySqlDbType.VarChar, StockTraderUtility.USERID_MAX_LENGTH)};
+
+                // Add the parameters to the cached
+                MySQLHelper.CacheParameters(SQL_INSERT_ACCOUNT, parms);
+            }
+            return parms;
+        }
+
+    }
+}

Added: incubator/stonehenge/trunk/stocktrader/dotnet/common/StockTraderDALMySQL/MarketSummary.cs
URL: http://svn.apache.org/viewvc/incubator/stonehenge/trunk/stocktrader/dotnet/common/StockTraderDALMySQL/MarketSummary.cs?rev=817792&view=auto
==============================================================================
--- incubator/stonehenge/trunk/stocktrader/dotnet/common/StockTraderDALMySQL/MarketSummary.cs (added)
+++ incubator/stonehenge/trunk/stocktrader/dotnet/common/StockTraderDALMySQL/MarketSummary.cs Tue Sep 22 19:34:18 2009
@@ -0,0 +1,258 @@
+//
+// Licensed to the Apache Software Foundation (ASF) under one or more
+// contributor license agreements.  See the NOTICE file distributed with
+// this work for additional information regarding copyright ownership.
+// The ASF licenses this file to You under the Apache License, Version 2.0
+// (the "License"); you may not use this file except in compliance with
+// the License.  You may obtain a copy of the License at
+//
+//      http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+//
+
+//  .Net StockTrader Sample WCF Application for Benchmarking, Performance Analysis and Design Considerations for Service-Oriented Applications
+
+
+//===============================================================================================
+// Customer is part of the SQLServer DAL for StockTrader.  This is called from the
+// BSL to execute commands against the database.  It is constructed to use one SqlConnection per
+// instance.  Hence, BSLs that use this DAL should always be instanced properly.
+// The DAL will work with both ADO.NET and System.Transactions or ServiceComponents/Enterprise
+// Services attributed transactions [autocomplete]. When using ADO.NET transactions,
+// The BSL will control the transaction boundaries with calls to dal.BeginTransaction(); 
+// dal.CommitTransaction(); dal.RollbackTransaction().
+//===============================================================================================
+//======================================================================================================
+// Code originally contributed by Microsoft Corporation.
+// This contribution to the Stonehenge project is limited strictly 
+// to the source code that is submitted in this submission.  
+// Any technology, including underlying platform technology, 
+// that is referenced or required by the submitted source code 
+// is not a part of the contribution.  
+// For example and not by way of limitation, 
+// any systems/Windows libraries (WPF, WCF, ASP.NET etc.) 
+// required to run the submitted source code is not a part of the contribution
+//======================================================================================================
+
+
+using System;
+using System.Collections.Generic;
+using System.Text;
+using System.Data;
+using MySql.Data.MySqlClient;
+using MySql.Data;
+using MySql.Data.Types;
+using Trade.IDAL;
+using Trade.Utility;
+using Trade.ConfigServiceDataContract;
+using Trade.BusinessServiceDataContract;
+
+namespace Trade.DALMySQL
+{
+    public class MarketSummary : IMarketSummary
+    {
+
+        public MarketSummary()
+        {
+        }
+
+        //Constructor for internal DAL-DAL calls to use an existing DB connection.
+        public MarketSummary(MySqlConnection conn, MySqlTransaction trans)
+        {
+            _internalConnection = conn;
+            _internalADOTransaction = trans;
+        }
+
+        //_internalConnection: Used by a DAL instance such that a DAL instance,
+        //associated with a BSL instance, will work off a single connection between BSL calls.
+        private MySqlConnection _internalConnection;
+
+        //Used only when doing ADO.NET transactions.
+        //This will be completely ignored when null, and not attached to a cmd object
+        //In MySQLHelper unless it has been initialized explicitly in the BSL with a
+        //dal.BeginADOTransaction().  See app config setting in web.config and 
+        //Trade.BusinessServiceHost.exe.config "Use System.Transactions Globally" which determines
+        //whether user wants to run with ADO transactions or System.Transactions.  The DAL itself
+        //is built to be completely agnostic and will work with either.
+        private MySqlTransaction _internalADOTransaction;
+
+        //Used only when doing ADO.NET transactions.
+        public void BeginADOTransaction()
+        {
+            _internalADOTransaction = _internalConnection.BeginTransaction(System.Data.IsolationLevel.ReadCommitted);
+        }
+
+        //Used only when doing ADO.NET transactions.
+        public void RollBackTransaction()
+        {
+            _internalADOTransaction.Rollback();
+            _internalADOTransaction = null;
+        }
+
+        //Used only when doing ADO.NET transactions.
+        public void CommitADOTransaction()
+        {
+            _internalADOTransaction.Commit();
+            _internalADOTransaction = null;
+        }
+
+        public void Open(string connString)
+        {
+            if (_internalConnection == null)
+                _internalConnection = new MySqlConnection(connString);
+            if (_internalConnection.State != ConnectionState.Open)
+                _internalConnection.Open();
+        }
+
+        public void Close()
+        {
+            if (_internalConnection != null && _internalConnection.State != ConnectionState.Closed)
+                _internalConnection.Close();
+        }
+
+        private const string MySQL_SELECT_MARKETSUMMARY_GAINERS = "SELECT symbol, companyname, volume, price, open1, low, high, change1 from quote where symbol like 's:%' order by change1 desc";
+        private const string MySQL_SELECT_MARKETSUMMARY_LOSERS = "SELECT symbol, companyname, volume, price, open1, low, high, change1 from quote where symbol like 's:%' order by change1";
+        private const string MySQL_SELECT_MARKETSUMMARY_TSIA = "select SUM(price)/count(*) as TSIA from quote where symbol like 's:%'";
+        private const string MySQL_SELECT_MARKETSUMMARY_OPENTSIA = "select SUM(open1)/count(*) as openTSIA from quote where symbol like 's:%'";
+        private const string MySQL_SELECT_MARKETSUMMARY_VOLUME = "SELECT SUM(volume) from quote where symbol like 's:%'";
+        private const string MySQL_SELECT_QUOTE = "SELECT symbol, companyname, volume, price, open1, low, high, change1 from quote  where symbol = ?QuoteSymbol";
+        private const string MySQL_SELECT_QUOTE_NOLOCK = "SELECT symbol, companyname, volume, price, open1, low, high, change1 from quote where symbol = ?QuoteSymbol";
+        private const string MySQL_UPDATE_STOCKPRICEVOLUME = "UPDATE QUOTE  SET PRICE=?Price, Low=?Low, High=?High, Change1 = ?Price - open1, VOLUME=VOLUME+?Quantity WHERE SYMBOL=?QuoteSymbol";
+
+        //Parameters
+        private const string PARM_SYMBOL = "?QuoteSymbol";
+        private const string PARM_PRICE = "?Price";
+        private const string PARM_LOW = "?Low";
+        private const string PARM_HIGH = "?High";
+        private const string PARM_QUANTITY = "?Quantity";
+
+        public void updateStockPriceVolume(double Quantity, QuoteDataModel quote)
+        {
+            try
+            {
+                MySqlParameter[] updatestockpriceparm = GetUpdateStockPriceVolumeParameters();
+                decimal priceChangeFactor = StockTraderUtility.getRandomPriceChangeFactor(quote.price);
+                decimal newprice = quote.price * priceChangeFactor;
+                if (newprice < quote.low)
+                    quote.low = newprice;
+                if (newprice > quote.high)
+                    quote.high = newprice;
+                updatestockpriceparm[0].Value = (decimal)newprice;
+                updatestockpriceparm[1].Value = (float)Quantity;
+                updatestockpriceparm[2].Value = quote.symbol;
+                updatestockpriceparm[3].Value = quote.low;
+                updatestockpriceparm[4].Value = quote.high;
+                
+                MySQLHelper.ExecuteNonQuery(_internalConnection, _internalADOTransaction, CommandType.Text, MySQL_UPDATE_STOCKPRICEVOLUME, updatestockpriceparm);
+                return;
+            }
+            catch
+            {
+                throw;
+            }
+        }
+
+        public QuoteDataModel getQuote(string symbol)
+        {
+            try
+            {
+                MySqlParameter parm1 = new MySqlParameter(PARM_SYMBOL, MySqlDbType.VarChar, 10);
+                parm1.Value = symbol;
+                MySqlDataReader rdr = MySQLHelper.ExecuteReaderSingleRowSingleParm(_internalConnection, _internalADOTransaction, CommandType.Text, MySQL_SELECT_QUOTE_NOLOCK, parm1);
+                QuoteDataModel quote = null;
+                if (rdr.HasRows)
+                {
+                    rdr.Read();
+                    quote = new QuoteDataModel(rdr.GetString(0), rdr.GetString(1), rdr.GetDouble(2), rdr.GetDecimal(3), rdr.GetDecimal(4), rdr.GetDecimal(5), rdr.GetDecimal(6), rdr.GetDouble(7));
+                }
+                rdr.Close();
+                return quote;
+            }
+            catch
+            {
+                throw;
+            }
+        }
+
+        public QuoteDataModel getQuoteForUpdate(string symbol)
+        {
+            try
+            {
+                MySqlParameter parm1 = new MySqlParameter(PARM_SYMBOL, MySqlDbType.VarChar, 10);
+                parm1.Value = symbol;
+                MySqlDataReader rdr = MySQLHelper.ExecuteReaderSingleRowSingleParm(_internalConnection, _internalADOTransaction, CommandType.Text, MySQL_SELECT_QUOTE, parm1);
+                QuoteDataModel quote = null;
+                if (rdr.HasRows)
+                {
+                    rdr.Read();
+                    quote = new QuoteDataModel(rdr.GetString(0), rdr.GetString(1), rdr.GetDouble(2), rdr.GetDecimal(3), rdr.GetDecimal(4), rdr.GetDecimal(5), rdr.GetDecimal(6), rdr.GetDouble(7));
+                }
+                rdr.Close();
+                return quote;
+            }
+            catch
+            {
+                throw;
+            }
+        }
+
+        public MarketSummaryDataModelWS getMarketSummaryData()
+        {
+            try
+            {
+                decimal TSIA = (decimal)MySQLHelper.ExecuteScalarNoParm(_internalConnection, _internalADOTransaction, CommandType.Text, MySQL_SELECT_MARKETSUMMARY_TSIA);
+                decimal openTSIA = (decimal)MySQLHelper.ExecuteScalarNoParm(_internalConnection, _internalADOTransaction, CommandType.Text, MySQL_SELECT_MARKETSUMMARY_OPENTSIA);
+                double totalVolume = (double)MySQLHelper.ExecuteScalarNoParm(_internalConnection, _internalADOTransaction, CommandType.Text, MySQL_SELECT_MARKETSUMMARY_VOLUME);
+                MySqlDataReader rdr = MySQLHelper.ExecuteReaderNoParm(_internalConnection, _internalADOTransaction, CommandType.Text, MySQL_SELECT_MARKETSUMMARY_GAINERS);
+                List<QuoteDataModel> topgainers = new List<QuoteDataModel>();
+                List<QuoteDataModel> toplosers = new List<QuoteDataModel>();
+                int i = 0;
+                while (rdr.Read() && i++ < 5)
+                {
+                    QuoteDataModel quote = new QuoteDataModel(rdr.GetString(0), rdr.GetString(1), rdr.GetDouble(2), rdr.GetDecimal(3), rdr.GetDecimal(4), rdr.GetDecimal(5), rdr.GetDecimal(6), rdr.GetDouble(7));
+                    topgainers.Add(quote);
+                }
+                rdr.Close();
+                rdr = MySQLHelper.ExecuteReaderNoParm(_internalConnection, _internalADOTransaction, CommandType.Text, MySQL_SELECT_MARKETSUMMARY_LOSERS);
+                i = 0;
+                while (rdr.Read() && i++ < 5)
+                {
+                    QuoteDataModel quote = new QuoteDataModel(rdr.GetString(0), rdr.GetString(1), rdr.GetDouble(2), rdr.GetDecimal(3), rdr.GetDecimal(4), rdr.GetDecimal(5), rdr.GetDecimal(6), rdr.GetDouble(7));
+                    toplosers.Add(quote);
+                }
+                rdr.Close();
+                MarketSummaryDataModelWS marketSummaryData = new MarketSummaryDataModelWS(TSIA, openTSIA, totalVolume, topgainers, toplosers);
+                return marketSummaryData;
+            }
+            catch
+            {
+                throw;
+            }
+        }
+
+        private static MySqlParameter[] GetUpdateStockPriceVolumeParameters()
+        {
+            // Get the paramters from the cache
+            MySqlParameter[] parms = MySQLHelper.GetCacheParameters(MySQL_UPDATE_STOCKPRICEVOLUME);
+            // If the cache is empty, rebuild the parameters
+            if (parms == null)
+            {
+                parms = new MySqlParameter[] {
+                        new MySqlParameter(PARM_PRICE, MySqlDbType.Decimal, 14),
+                        new MySqlParameter(PARM_QUANTITY, MySqlDbType.Float),
+                        new MySqlParameter(PARM_SYMBOL, MySqlDbType.VarChar, 10),
+                        new MySqlParameter(PARM_LOW, MySqlDbType.Decimal, 14),
+                        new MySqlParameter(PARM_HIGH, MySqlDbType.Decimal, 14)};
+                // Add the parametes to the cached
+                MySQLHelper.CacheParameters(MySQL_UPDATE_STOCKPRICEVOLUME, parms);
+            }
+            return parms;
+        }
+
+    }
+}

Added: incubator/stonehenge/trunk/stocktrader/dotnet/common/StockTraderDALMySQL/MySQLHelper.cs
URL: http://svn.apache.org/viewvc/incubator/stonehenge/trunk/stocktrader/dotnet/common/StockTraderDALMySQL/MySQLHelper.cs?rev=817792&view=auto
==============================================================================
--- incubator/stonehenge/trunk/stocktrader/dotnet/common/StockTraderDALMySQL/MySQLHelper.cs (added)
+++ incubator/stonehenge/trunk/stocktrader/dotnet/common/StockTraderDALMySQL/MySQLHelper.cs Tue Sep 22 19:34:18 2009
@@ -0,0 +1,246 @@
+//
+// Licensed to the Apache Software Foundation (ASF) under one or more
+// contributor license agreements.  See the NOTICE file distributed with
+// this work for additional information regarding copyright ownership.
+// The ASF licenses this file to You under the Apache License, Version 2.0
+// (the "License"); you may not use this file except in compliance with
+// the License.  You may obtain a copy of the License at
+//
+//      http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+//
+
+//  .Net StockTrader Sample WCF Application for Benchmarking, Performance Analysis and Design Considerations for Service-Oriented Applications
+
+
+//===============================================================================================
+// Customer is part of the SQLServer DAL for StockTrader.  This is called from the
+// BSL to execute commands against the database.  It is constructed to use one SqlConnection per
+// instance.  Hence, BSLs that use this DAL should always be instanced properly.
+// The DAL will work with both ADO.NET and System.Transactions or ServiceComponents/Enterprise
+// Services attributed transactions [autocomplete]. When using ADO.NET transactions,
+// The BSL will control the transaction boundaries with calls to dal.BeginTransaction(); 
+// dal.CommitTransaction(); dal.RollbackTransaction().
+//===============================================================================================
+//======================================================================================================
+// Code originally contributed by Microsoft Corporation.
+// This contribution to the Stonehenge project is limited strictly 
+// to the source code that is submitted in this submission.  
+// Any technology, including underlying platform technology, 
+// that is referenced or required by the submitted source code 
+// is not a part of the contribution.  
+// For example and not by way of limitation, 
+// any systems/Windows libraries (WPF, WCF, ASP.NET etc.) 
+// required to run the submitted source code is not a part of the contribution
+//======================================================================================================
+
+
+
+
+using System;
+using System.Collections.Generic;
+using System.Data;
+using System.Linq;
+using System.Text;
+using System.Collections;
+using MySql.Data;
+using MySql.Data.MySqlClient;
+
+
+namespace Trade.DALMySQL
+{
+    public abstract class MySQLHelper
+    {
+        private static Hashtable parmCache = Hashtable.Synchronized(new Hashtable());
+
+        public static MySqlDataReader ExecuteReaderSingleParm(MySqlConnection conn, MySqlTransaction trans, CommandType cmdType, string cmdText, MySqlParameter singleParm)
+        {
+            MySqlCommand cmd = new MySqlCommand();
+            if (conn.State != ConnectionState.Open)
+                conn.Open();
+            cmd.Connection = conn;
+            if (trans != null)
+                cmd.Transaction = trans;
+            cmd.CommandText = cmdText;
+            cmd.Parameters.Add(singleParm);
+            MySqlDataReader rdr = cmd.ExecuteReader(CommandBehavior.SingleResult);
+            return rdr;
+        }
+
+        public static MySqlDataReader ExecuteReaderSingleRowSingleParm(MySqlConnection conn, MySqlTransaction trans, CommandType cmdType, string cmdText, MySqlParameter singleParm)
+        {
+            if (conn.State != ConnectionState.Open)
+                conn.Open();
+            MySqlCommand cmd = new MySqlCommand();
+            cmd.Connection = conn;
+            if (trans != null)
+                cmd.Transaction = trans;
+            cmd.CommandText = cmdText;
+            cmd.Parameters.Add(singleParm);
+            MySqlDataReader rdr = cmd.ExecuteReader(CommandBehavior.SingleRow);
+            return rdr;
+        }
+
+        public static MySqlDataReader ExecuteReaderSingleRow(MySqlConnection conn, MySqlTransaction trans, CommandType cmdType, string cmdText, MySqlParameter[] cmdParms)
+        {
+            if (conn.State != ConnectionState.Open)
+                conn.Open();
+            MySqlCommand cmd = new MySqlCommand();
+            cmd.Connection = conn;
+            if (trans != null)
+                cmd.Transaction = trans;
+            cmd.CommandText = cmdText;
+            PrepareCommand(cmd, cmdParms);
+            MySqlDataReader rdr = cmd.ExecuteReader(CommandBehavior.SingleRow);
+            return rdr;
+        }
+
+
+        public static MySqlDataReader ExecuteReaderNoParm(MySqlConnection conn, MySqlTransaction trans, CommandType cmdType, string cmdText)
+        {
+            if (conn.State != ConnectionState.Open)
+                conn.Open();
+            MySqlCommand cmd = new MySqlCommand();
+            cmd.Connection = conn;
+            if (trans != null)
+                cmd.Transaction = trans;
+            cmd.CommandText = cmdText;
+            MySqlDataReader rdr = cmd.ExecuteReader(CommandBehavior.SingleResult);
+            return rdr;
+        }
+
+        public static MySqlDataReader ExecuteReader(MySqlConnection conn, MySqlTransaction trans, CommandType cmdType, string cmdText, params MySqlParameter[] cmdParms)
+        {
+            if (conn.State != ConnectionState.Open)
+                conn.Open();
+            MySqlCommand cmd = new MySqlCommand();
+            cmd.Connection = conn;
+            if (trans != null)
+                cmd.Transaction = trans;
+            cmd.CommandText = cmdText;
+            PrepareCommand(cmd, cmdParms);
+            MySqlDataReader rdr = cmd.ExecuteReader(CommandBehavior.SingleResult);
+            return rdr;
+        }
+
+        public static int ExecuteScalar(MySqlConnection conn, MySqlTransaction trans, CommandType cmdType, string cmdText, params MySqlParameter[] cmdParms)
+        {
+            if (conn.State != ConnectionState.Open)
+                conn.Open();
+            MySqlCommand cmd = new MySqlCommand();
+            cmd.CommandText = cmdText;
+            cmd.Connection = conn;
+            if (trans != null)
+                cmd.Transaction = trans;
+            PrepareCommand(cmd, cmdParms);
+            int val = Convert.ToInt32(cmd.ExecuteScalar());
+            return val;
+        }
+
+        public static int ExecuteScalarSingleParm(MySqlConnection conn, MySqlTransaction trans, CommandType cmdType, string cmdText, MySqlParameter singleParm)
+        {
+            if (conn.State != ConnectionState.Open)
+                conn.Open();
+            MySqlCommand cmd = new MySqlCommand();
+            cmd.CommandText = cmdText;
+            cmd.Connection = conn;
+            if (trans != null)
+                cmd.Transaction = trans;
+            cmd.Parameters.Add(singleParm);
+            int val = Convert.ToInt32(cmd.ExecuteScalar());
+            return val;
+        }
+
+        public static int ExecuteScalarNoParm(MySqlConnection conn, MySqlTransaction trans, CommandType cmdType, string cmdText)
+        {
+            if (conn.State != ConnectionState.Open)
+                conn.Open();
+            MySqlCommand cmd = new MySqlCommand();
+            cmd.CommandText = cmdText;
+            cmd.Connection = conn;
+            if (trans != null)
+                cmd.Transaction = trans;
+            int val = Convert.ToInt32(cmd.ExecuteScalar());
+            return val;
+        }
+
+        public static int ExecuteNonQuery(MySqlConnection conn, MySqlTransaction trans, CommandType cmdType, string cmdText, params MySqlParameter[] cmdParms)
+        {
+            if (conn.State != ConnectionState.Open)
+                conn.Open();
+            MySqlCommand cmd = new MySqlCommand();
+            cmd.Connection = conn;
+            if (trans != null)
+                cmd.Transaction = trans;
+            cmd.CommandText = cmdText;
+            PrepareCommand(cmd, cmdParms);
+            int val = cmd.ExecuteNonQuery();
+            return val;
+        }
+
+        public static int ExecuteNonQuerySingleParm(MySqlConnection conn, MySqlTransaction trans, CommandType cmdType, string cmdText, MySqlParameter singleParam)
+        {
+            if (conn.State != ConnectionState.Open)
+                conn.Open();
+            MySqlCommand cmd = new MySqlCommand();
+            cmd.Connection = conn;
+            if (trans != null)
+                cmd.Transaction = trans;
+            cmd.CommandText = cmdText;
+            cmd.Parameters.Add(singleParam);
+            int val = cmd.ExecuteNonQuery();
+            return val;
+        }
+
+        public static int ExecuteNonQueryNoParm(MySqlConnection conn, MySqlTransaction trans, CommandType cmdType, string cmdText)
+        {
+            if (conn.State != ConnectionState.Open)
+                conn.Open();
+            MySqlCommand cmd = new MySqlCommand();
+            cmd.Connection = conn;
+            if (trans != null)
+                cmd.Transaction = trans;
+            cmd.CommandText = cmdText;
+            int val = cmd.ExecuteNonQuery();
+            return val;
+        }
+
+        public static void CacheParameters(string cacheKey, params MySqlParameter[] cmdParms)
+        {
+            parmCache[cacheKey] = cmdParms;
+        }
+
+        public static MySqlParameter[] GetCacheParameters(string cacheKey)
+        {
+            MySqlParameter[] cachedParms = (MySqlParameter[])parmCache[cacheKey];
+
+            if (cachedParms == null)
+                return null;
+
+            MySqlParameter[] clonedParms = new MySqlParameter[cachedParms.Length];
+
+            for (int i = 0, j = cachedParms.Length; i < j; i++)
+                clonedParms[i] = (MySqlParameter)((ICloneable)cachedParms[i]).Clone();
+
+            return clonedParms;
+        }
+        private static void PrepareCommand(MySqlCommand cmd, MySqlParameter[] cmdParms)
+        {
+            if (cmdParms != null)
+            {
+                for (int i = 0; i < cmdParms.Length; i++)
+                {
+                    MySqlParameter parm = (MySqlParameter)cmdParms[i];
+                    cmd.Parameters.Add(parm);
+                }
+            }
+        }
+
+    }
+
+}

Added: incubator/stonehenge/trunk/stocktrader/dotnet/common/StockTraderDALMySQL/Order.cs
URL: http://svn.apache.org/viewvc/incubator/stonehenge/trunk/stocktrader/dotnet/common/StockTraderDALMySQL/Order.cs?rev=817792&view=auto
==============================================================================
--- incubator/stonehenge/trunk/stocktrader/dotnet/common/StockTraderDALMySQL/Order.cs (added)
+++ incubator/stonehenge/trunk/stocktrader/dotnet/common/StockTraderDALMySQL/Order.cs Tue Sep 22 19:34:18 2009
@@ -0,0 +1,442 @@
+//
+// Licensed to the Apache Software Foundation (ASF) under one or more
+// contributor license agreements.  See the NOTICE file distributed with
+// this work for additional information regarding copyright ownership.
+// The ASF licenses this file to You under the Apache License, Version 2.0
+// (the "License"); you may not use this file except in compliance with
+// the License.  You may obtain a copy of the License at
+//
+//      http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+//
+
+//  .Net StockTrader Sample WCF Application for Benchmarking, Performance Analysis and Design Considerations for Service-Oriented Applications
+
+
+//===============================================================================================
+// Customer is part of the SQLServer DAL for StockTrader.  This is called from the
+// BSL to execute commands against the database.  It is constructed to use one SqlConnection per
+// instance.  Hence, BSLs that use this DAL should always be instanced properly.
+// The DAL will work with both ADO.NET and System.Transactions or ServiceComponents/Enterprise
+// Services attributed transactions [autocomplete]. When using ADO.NET transactions,
+// The BSL will control the transaction boundaries with calls to dal.BeginTransaction(); 
+// dal.CommitTransaction(); dal.RollbackTransaction().
+//===============================================================================================
+//======================================================================================================
+// Code originally contributed by Microsoft Corporation.
+// This contribution to the Stonehenge project is limited strictly 
+// to the source code that is submitted in this submission.  
+// Any technology, including underlying platform technology, 
+// that is referenced or required by the submitted source code 
+// is not a part of the contribution.  
+// For example and not by way of limitation, 
+// any systems/Windows libraries (WPF, WCF, ASP.NET etc.) 
+// required to run the submitted source code is not a part of the contribution
+//======================================================================================================
+
+
+using System;
+using System.Collections.Generic;
+using System.Text;
+using System.Data;
+using MySql.Data.MySqlClient;
+using MySql.Data;
+using MySql.Data.Types;
+using Trade.IDAL;
+using Trade.Utility;
+using Trade.ConfigServiceDataContract;
+using Trade.BusinessServiceDataContract;
+
+namespace Trade.DALMySQL
+{
+    public class Order : IOrder //
+// Licensed to the Apache Software Foundation (ASF) under one or more
+// contributor license agreements.  See the NOTICE file distributed with
+// this work for additional information regarding copyright ownership.
+// The ASF licenses this file to You under the Apache License, Version 2.0
+// (the "License"); you may not use this file except in compliance with
+// the License.  You may obtain a copy of the License at
+//
+//      http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+//
+
+//  .Net StockTrader Sample WCF Application for Benchmarking, Performance Analysis and Design Considerations for Service-Oriented Applications
+
+
+//===============================================================================================
+// Customer is part of the SQLServer DAL for StockTrader.  This is called from the
+// BSL to execute commands against the database.  It is constructed to use one SqlConnection per
+// instance.  Hence, BSLs that use this DAL should always be instanced properly.
+// The DAL will work with both ADO.NET and System.Transactions or ServiceComponents/Enterprise
+// Services attributed transactions [autocomplete]. When using ADO.NET transactions,
+// The BSL will control the transaction boundaries with calls to dal.BeginTransaction(); 
+// dal.CommitTransaction(); dal.RollbackTransaction().
+//===============================================================================================
+//======================================================================================================
+// Code originally contributed by Microsoft Corporation.
+// This contribution to the Stonehenge project is limited strictly 
+// to the source code that is submitted in this submission.  
+// Any technology, including underlying platform technology, 
+// that is referenced or required by the submitted source code 
+// is not a part of the contribution.  
+// For example and not by way of limitation, 
+// any systems/Windows libraries (WPF, WCF, ASP.NET etc.) 
+// required to run the submitted source code is not a part of the contribution
+//======================================================================================================
+
+
+    {
+        public Order()
+        {
+        }
+
+        //Constructor for internal DAL-DAL calls to use an existing DB connection.
+        public Order(MySqlConnection conn)
+        {
+            _internalConnection = conn;
+        }
+
+        //_internalConnection: Used by a DAL instance such that a DAL instance,
+        //associated with a BSL instance, will work off a single connection between BSL calls.
+        private MySqlConnection _internalConnection;
+
+        //_internalADOTransaction: Used only when doing ADO.NET transactions.
+        //This will be completely ignored when null, and not attached to a cmd object
+        //In MySQLHelper unless it has been initialized explicitly in the BSL with a
+        //dal.BeginADOTransaction().  See app config setting in web.config and 
+        //Trade.BusinessServiceHost.exe.config "Use System.Transactions Globally" which determines
+        //whether user wants to run with ADO transactions or System.Transactions.  The DAL itself
+        //is built to be completely agnostic and will work with either.
+        private MySqlTransaction _internalADOTransaction;
+
+        //Used only when doing ADO.NET transactions.
+        public void BeginADOTransaction()
+        {
+            if (_internalConnection.State != ConnectionState.Open)
+                _internalConnection.Open();
+            _internalADOTransaction = _internalConnection.BeginTransaction(System.Data.IsolationLevel.ReadCommitted);
+        }
+
+        //Used only when explicitly using ADO.NET transactions from the BSL.
+        public void RollBackTransaction()
+        {
+            _internalADOTransaction.Rollback();
+            _internalADOTransaction = null;
+        }
+
+        //Used only when explicitly using ADO.NET transactions from the BSL.
+        public void CommitADOTransaction()
+        {
+            _internalADOTransaction.Commit();
+            _internalADOTransaction = null;
+        }
+
+        public void Open(string connString)
+        {
+            if (_internalConnection == null)
+                _internalConnection = new MySqlConnection(connString);
+            if (_internalConnection.State != ConnectionState.Open)
+                _internalConnection.Open();
+        }
+
+        public void Close()
+        {
+            if (_internalConnection != null && _internalConnection.State != ConnectionState.Closed)
+                _internalConnection.Close();
+        }
+
+        private const string MySQL_INSERT_ORDER = "INSERT INTO ORDERS (OPENDATE, ORDERFEE, PRICE, QUOTE_SYMBOL, QUANTITY, ORDERTYPE, ORDERSTATUS, ACCOUNT_ACCOUNTID, HOLDING_HOLDINGID) VALUES (NOW(),  ?OrderFee, ?Price, ?QuoteSymbol, ?Quantity, ?OrderType, 'open', ?accountId, ?HoldingId); SELECT LAST_INSERT_ID()";
+        private const string MySQL_GET_ACCOUNTID = "SELECT ACCOUNTID FROM ACCOUNT WHERE PROFILE_USERID = ?userId";
+        private const string MySQL_GET_ACCOUNTID_ORDER = "SELECT ACCOUNT_ACCOUNTID FROM ORDERS WHERE ORDERID=?OrderId";
+        private const string MySQL_INSERT_HOLDING = "INSERT INTO HOLDING (PURCHASEPRICE, QUANTITY, PURCHASEDATE, ACCOUNT_ACCOUNTID, QUOTE_SYMBOL) VALUES (?PurchasePrice, ?Quantity, ?PurchaseDate, ?AccountId, ?QuoteSymbol); SELECT LAST_INSERT_ID()";
+        private const string MySQL_SELECT_HOLDING = "SELECT HOLDING.HOLDINGID, HOLDING.QUANTITY, HOLDING.PURCHASEPRICE, HOLDING.PURCHASEDATE, HOLDING.QUOTE_SYMBOL,HOLDING.ACCOUNT_ACCOUNTID FROM HOLDING WHERE HOLDINGID= ?HoldingId";
+        private const string MySQL_DELETE_HOLDING = "DELETE FROM HOLDING  WHERE HOLDINGID=?HoldingId";
+        private const string MySQL_GET_HOLDING_QUANTITY = "SELECT QUANTITY FROM HOLDING  WHERE HOLDINGID=?HoldingId";
+        private const string MySQL_UPDATE_HOLDING = "UPDATE HOLDING  SET QUANTITY=QUANTITY-?Quantity WHERE HOLDINGID=?HoldingId";
+        private const string MySQL_UPDATE_ORDER = "UPDATE ORDERS  SET QUANTITY=?Quantity WHERE ORDERID=?OrderId";
+        private const string MySQL_CLOSE_ORDER = "UPDATE ORDERS  SET ORDERSTATUS = ?status, COMPLETIONDATE=NOW(), HOLDING_HOLDINGID=?HoldingId, PRICE=?Price WHERE ORDERID = ?OrderId";
+
+        //Parameters
+        private const string PARM_SYMBOL = "?QuoteSymbol";
+        private const string PARM_USERID = "?userId";
+        private const string PARM_ORDERSTATUS = "?status";
+        private const string PARM_QUANTITY = "?Quantity";
+        private const string PARM_ORDERTYPE = "?OrderType";
+        private const string PARM_ACCOUNTID = "?accountId";
+        private const string PARM_ORDERID = "?OrderId";
+        private const string PARM_HOLDINGID = "?HoldingId";
+        private const string PARM_ORDERFEE = "?OrderFee";
+        private const string PARM_PRICE = "?Price";
+        private const string PARM_PURCHASEPRICE = "?PurchasePrice";
+        private const string PARM_PURCHASEDATE = "?PurchaseDate";
+
+        public QuoteDataModel getQuoteForUpdate(string symbol)
+        {
+            //Cross-DAL calls pass in their own connection if they want to ensure commans are
+            //executed on the same connection and optional ADO transaction.  If 
+            //_internalADOTransaction is null, as with all DAL classes, it will be ignored.
+            MarketSummary marketsummaryDal = new MarketSummary(_internalConnection, _internalADOTransaction);
+            return marketsummaryDal.getQuoteForUpdate(symbol);
+        }
+
+        public void updateStockPriceVolume(double quantity, QuoteDataModel quote)
+        {
+            //See note above: want to use existing connection
+            MarketSummary marketSummaryDal = new MarketSummary(_internalConnection, _internalADOTransaction);
+            marketSummaryDal.updateStockPriceVolume(quantity, quote);
+            return;
+        }
+
+        public HoldingDataModel getHoldingForUpdate(int orderID)
+        {
+            //See note above: want to use existing connection
+            Customer customerDal = new Customer(_internalConnection, _internalADOTransaction);
+            return customerDal.getHoldingForUpdate(orderID);
+        }
+
+        public void updateAccountBalance(int accountID, decimal total)
+        {
+            //See note above: want to use existing connection
+            Customer customerDal = new Customer(_internalConnection, _internalADOTransaction);
+            customerDal.updateAccountBalance(accountID, total);
+            return;
+        }
+
+        public OrderDataModel createOrder(string userID, string symbol, string orderType, double quantity, int holdingID)
+        {
+            try
+            {
+                DateTime dt = DateTime.MinValue;
+                int orderid = 0;
+                OrderDataModel order = new OrderDataModel(orderid, orderType, StockTraderUtility.ORDER_STATUS_OPEN, DateTime.Now, DateTime.MinValue, quantity, (decimal)1, StockTraderUtility.getOrderFee(orderType), symbol);
+                order.holdingID = holdingID;
+                MySqlParameter[] parm = new MySqlParameter[] { new MySqlParameter(PARM_USERID, MySqlDbType.VarChar, 20) };
+                parm[0].Value = userID;
+                order.accountID = Convert.ToInt32(MySQLHelper.ExecuteScalar(_internalConnection, _internalADOTransaction, CommandType.Text, MySQL_GET_ACCOUNTID, parm));
+                MySqlParameter[] OrderParms = GetCreateOrderParameters();
+                OrderParms[0].Value = order.orderFee;
+                OrderParms[1].Value = order.price;
+                OrderParms[2].Value = order.symbol;
+                OrderParms[3].Value = (float)order.quantity;
+                OrderParms[4].Value = order.orderType;
+                OrderParms[5].Value = order.accountID;
+                OrderParms[6].Value = holdingID;
+                order.orderID = Convert.ToInt32(MySQLHelper.ExecuteScalar(_internalConnection, _internalADOTransaction, CommandType.Text, MySQL_INSERT_ORDER, OrderParms));
+                return order;
+            }
+            catch
+            {
+                throw;
+            }
+        }
+
+        public HoldingDataModel getHolding(int holdingID)
+        {
+            MySqlParameter parm1 = new MySqlParameter(PARM_HOLDINGID, MySqlDbType.Int32, 10);
+            parm1.Value = holdingID;
+            MySqlDataReader rdr = MySQLHelper.ExecuteReaderSingleRowSingleParm(_internalConnection, _internalADOTransaction, CommandType.Text, MySQL_SELECT_HOLDING, parm1);
+            if (rdr.Read())
+            {
+                HoldingDataModel holding = new HoldingDataModel(rdr.GetInt32(0), rdr.GetDouble(1), rdr.GetDecimal(2), rdr.GetDateTime(3), rdr.GetString(4), rdr.GetInt32(5));
+                rdr.Close();
+                return holding;
+            }
+            rdr.Close();
+            return null;
+        }
+
+        public int createHolding(OrderDataModel order)
+        {
+            try
+            {
+                MySqlParameter orderParm = new MySqlParameter(PARM_ORDERID, MySqlDbType.Int32, 10);
+                orderParm.Value = order.orderID;
+                order.accountID = Convert.ToInt32(MySQLHelper.ExecuteScalarSingleParm(_internalConnection, _internalADOTransaction, CommandType.Text, MySQL_GET_ACCOUNTID_ORDER, orderParm));
+                MySqlParameter[] HoldingParms = GetCreateHoldingParameters();
+                HoldingParms[0].Value = order.price;
+                HoldingParms[1].Value = (float)order.quantity;
+                HoldingParms[2].Value = order.openDate;
+                HoldingParms[3].Value = order.accountID;
+                HoldingParms[4].Value = order.symbol;
+                int holdingid = MySQLHelper.ExecuteScalar(_internalConnection, _internalADOTransaction, CommandType.Text, MySQL_INSERT_HOLDING, HoldingParms);
+                return holdingid;
+            }
+            catch
+            {
+                throw;
+            }
+        }
+
+        public void updateHolding(int holdingid, double quantity)
+        {
+            try
+            {
+                MySqlParameter[] HoldingParms2 = GetUpdateHoldingParameters();
+                HoldingParms2[0].Value = holdingid;
+                HoldingParms2[1].Value = quantity;
+                MySQLHelper.ExecuteNonQuery(_internalConnection, _internalADOTransaction, CommandType.Text, MySQL_UPDATE_HOLDING, HoldingParms2);
+                HoldingDataModel holding = new HoldingDataModel();
+                return;
+            }
+            catch
+            {
+                throw;
+            }
+        }
+
+        public void deleteHolding(int holdingid)
+        {
+            try
+            {
+                MySqlParameter[] HoldingParms2 = { new MySqlParameter(PARM_HOLDINGID, MySqlDbType.Int32) };
+                HoldingParms2[0].Value = holdingid;
+                MySQLHelper.ExecuteNonQuery(_internalConnection, _internalADOTransaction, CommandType.Text, MySQL_DELETE_HOLDING, HoldingParms2);
+                return;
+            }
+            catch
+            {
+                throw;
+            }
+        }
+
+        public void updateOrder(OrderDataModel order)
+        {
+            try
+            {
+                MySqlParameter[] orderparms = GetUpdateOrderParameters();
+                orderparms[0].Value = order.quantity;
+                orderparms[1].Value = order.orderID;
+                MySQLHelper.ExecuteNonQuery(_internalConnection, _internalADOTransaction, CommandType.Text, MySQL_UPDATE_ORDER, orderparms);
+            }
+            catch
+            {
+                throw;
+            }
+            return;
+        }
+
+        public void closeOrder(OrderDataModel order)
+        {
+            try
+            {
+                MySqlParameter[] closeorderparm = GetCloseOrdersParameters();
+                closeorderparm[0].Value = StockTraderUtility.ORDER_STATUS_CLOSED;
+                if (order.orderType.Equals(StockTraderUtility.ORDER_TYPE_SELL))
+                    closeorderparm[1].Value = DBNull.Value;
+                else
+                    closeorderparm[1].Value = order.holdingID;
+                closeorderparm[2].Value = order.price;
+                closeorderparm[3].Value = order.orderID;
+                MySQLHelper.ExecuteNonQuery(_internalConnection, _internalADOTransaction, CommandType.Text, MySQL_CLOSE_ORDER, closeorderparm);
+            }
+            catch
+            {
+                throw;
+            }
+            return;
+        }
+
+        private static MySqlParameter[] GetCreateOrderParameters()
+        {
+            // Get the paramters from the cache
+            MySqlParameter[] parms = MySQLHelper.GetCacheParameters(MySQL_INSERT_ORDER);
+            // If the cache is empty, rebuild the parameters
+            if (parms == null)
+            {
+                parms = new MySqlParameter[] {
+                           new MySqlParameter(PARM_ORDERFEE, MySqlDbType.Decimal, 14),
+                           new MySqlParameter(PARM_PRICE, MySqlDbType.Decimal, 14),
+	                  	   new MySqlParameter(PARM_SYMBOL, MySqlDbType.VarChar, 20),
+						   new MySqlParameter(PARM_QUANTITY, MySqlDbType.Float),
+                           new MySqlParameter(PARM_ORDERTYPE, MySqlDbType.VarChar,5),
+                           new MySqlParameter(PARM_ACCOUNTID, MySqlDbType.Int32, 10),
+                           new MySqlParameter(PARM_HOLDINGID, MySqlDbType.Int32,10)};
+                // Add the parametes to the cached
+                MySQLHelper.CacheParameters(MySQL_INSERT_ORDER, parms);
+            }
+            return parms;
+        }
+
+        private static MySqlParameter[] GetUpdateOrderParameters()
+        {
+            // Get the paramters from the cache
+            MySqlParameter[] parms = MySQLHelper.GetCacheParameters(MySQL_UPDATE_ORDER);
+            // If the cache is empty, rebuild the parameters
+            if (parms == null)
+            {
+                parms = new MySqlParameter[] {new MySqlParameter(PARM_QUANTITY, MySqlDbType.Float),
+                                            new MySqlParameter(PARM_ORDERID,SqlDbType.Int)};
+
+                MySQLHelper.CacheParameters(MySQL_UPDATE_ORDER, parms);
+            }
+            return parms;
+        }
+
+        private static MySqlParameter[] GetCreateHoldingParameters()
+        {
+
+            // Get the paramters from the cache
+            MySqlParameter[] parms = MySQLHelper.GetCacheParameters(MySQL_INSERT_HOLDING);
+            // If the cache is empty, rebuild the parameters
+            if (parms == null)
+            {
+                parms = new MySqlParameter[] {
+                           new MySqlParameter(PARM_PURCHASEPRICE, MySqlDbType.Decimal, 14),
+                           new MySqlParameter(PARM_QUANTITY, MySqlDbType.Float),
+                           new MySqlParameter(PARM_PURCHASEDATE, MySqlDbType.DateTime),
+                       	   new MySqlParameter(PARM_ACCOUNTID, MySqlDbType.Int32),
+                		   new MySqlParameter(PARM_SYMBOL, MySqlDbType.VarChar,20)};
+
+                // Add the parametes to the cached
+                MySQLHelper.CacheParameters(MySQL_INSERT_HOLDING, parms);
+            }
+            return parms;
+        }
+
+        private static MySqlParameter[] GetUpdateHoldingParameters()
+        {
+            // Get the paramters from the cache
+            MySqlParameter[] parms = MySQLHelper.GetCacheParameters(MySQL_UPDATE_HOLDING);
+            // If the cache is empty, rebuild the parameters
+            if (parms == null)
+            {
+                parms = new MySqlParameter[] {new MySqlParameter(PARM_HOLDINGID, MySqlDbType.Int32),
+                                            new MySqlParameter(PARM_QUANTITY, MySqlDbType.Float)};
+                // Add the parametes to the cached
+                MySQLHelper.CacheParameters(MySQL_UPDATE_HOLDING, parms);
+            }
+            return parms;
+        }
+
+        private static MySqlParameter[] GetCloseOrdersParameters()
+        {
+            // Get the paramters from the cache
+            MySqlParameter[] parms = MySQLHelper.GetCacheParameters(MySQL_CLOSE_ORDER);
+            // If the cache is empty, rebuild the parameters
+            if (parms == null)
+            {
+                parms = new MySqlParameter[] {
+                        new MySqlParameter(PARM_ORDERSTATUS, MySqlDbType.VarChar,10),
+                        new MySqlParameter(PARM_HOLDINGID, MySqlDbType.Int32),
+                        new MySqlParameter(PARM_PRICE, MySqlDbType.Decimal, 14),
+                        new MySqlParameter(PARM_ORDERID, MySqlDbType.Int32)};
+
+                // Add the parametes to the cached
+                MySQLHelper.CacheParameters(MySQL_CLOSE_ORDER, parms);
+            }
+            return parms;
+        }
+
+    }
+}

Added: incubator/stonehenge/trunk/stocktrader/dotnet/common/StockTraderDALMySQL/StockTraderDALMySQL.csproj
URL: http://svn.apache.org/viewvc/incubator/stonehenge/trunk/stocktrader/dotnet/common/StockTraderDALMySQL/StockTraderDALMySQL.csproj?rev=817792&view=auto
==============================================================================
--- incubator/stonehenge/trunk/stocktrader/dotnet/common/StockTraderDALMySQL/StockTraderDALMySQL.csproj (added)
+++ incubator/stonehenge/trunk/stocktrader/dotnet/common/StockTraderDALMySQL/StockTraderDALMySQL.csproj Tue Sep 22 19:34:18 2009
@@ -0,0 +1,93 @@
+<?xml version="1.0" encoding="utf-8"?>
+<Project ToolsVersion="3.5" DefaultTargets="Build" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
+  <PropertyGroup>
+    <Configuration Condition=" '$(Configuration)' == '' ">Debug</Configuration>
+    <Platform Condition=" '$(Platform)' == '' ">AnyCPU</Platform>
+    <ProductVersion>9.0.30729</ProductVersion>
+    <SchemaVersion>2.0</SchemaVersion>
+    <ProjectGuid>{DD924D91-04C2-4EBB-AFB9-E96E305E1F07}</ProjectGuid>
+    <OutputType>Library</OutputType>
+    <AppDesignerFolder>Properties</AppDesignerFolder>
+    <RootNamespace>Trade.DALMySQL</RootNamespace>
+    <AssemblyName>Trade.DALMySQL</AssemblyName>
+    <TargetFrameworkVersion>v3.5</TargetFrameworkVersion>
+    <FileAlignment>512</FileAlignment>
+    <SignAssembly>true</SignAssembly>
+    <AssemblyOriginatorKeyFile>stocktrader.snk</AssemblyOriginatorKeyFile>
+  </PropertyGroup>
+  <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Debug|AnyCPU' ">
+    <DebugSymbols>true</DebugSymbols>
+    <DebugType>full</DebugType>
+    <Optimize>false</Optimize>
+    <OutputPath>bin\Debug\</OutputPath>
+    <DefineConstants>DEBUG;TRACE</DefineConstants>
+    <ErrorReport>prompt</ErrorReport>
+    <WarningLevel>4</WarningLevel>
+  </PropertyGroup>
+  <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Release|AnyCPU' ">
+    <DebugType>pdbonly</DebugType>
+    <Optimize>true</Optimize>
+    <OutputPath>bin\Release\</OutputPath>
+    <DefineConstants>TRACE</DefineConstants>
+    <ErrorReport>prompt</ErrorReport>
+    <WarningLevel>4</WarningLevel>
+  </PropertyGroup>
+  <ItemGroup>
+    <Reference Include="MySql.Data, Version=6.1.2.0, Culture=neutral, PublicKeyToken=c5687fc88969c44d, processorArchitecture=MSIL" />
+    <Reference Include="System" />
+    <Reference Include="System.Core">
+      <RequiredTargetFramework>3.5</RequiredTargetFramework>
+    </Reference>
+    <Reference Include="System.Xml.Linq">
+      <RequiredTargetFramework>3.5</RequiredTargetFramework>
+    </Reference>
+    <Reference Include="System.Data.DataSetExtensions">
+      <RequiredTargetFramework>3.5</RequiredTargetFramework>
+    </Reference>
+    <Reference Include="System.Data" />
+    <Reference Include="System.Xml" />
+  </ItemGroup>
+  <ItemGroup>
+    <Compile Include="Config.cs" />
+    <Compile Include="Customer.cs" />
+    <Compile Include="MarketSummary.cs" />
+    <Compile Include="MySQLHelper.cs" />
+    <Compile Include="Order.cs" />
+    <Compile Include="Properties\AssemblyInfo.cs" />
+  </ItemGroup>
+  <ItemGroup>
+    <ProjectReference Include="..\..\business_service\BusinessServiceDataContract\BusinessServiceDataContract.csproj">
+      <Project>{EBB1604B-3F50-4A81-87C3-1AE4029EEEC6}</Project>
+      <Name>BusinessServiceDataContract</Name>
+    </ProjectReference>
+    <ProjectReference Include="..\..\config_service\ConfigServiceDataContract\ConfigServiceDataContract.csproj">
+      <Project>{82B5FA73-8A82-4DC0-B473-43B78543668B}</Project>
+      <Name>ConfigServiceDataContract</Name>
+    </ProjectReference>
+    <ProjectReference Include="..\IDAL\StockTraderIDAL.csproj">
+      <Project>{509EB16A-6586-4200-8323-32438C9B47DC}</Project>
+      <Name>StockTraderIDAL</Name>
+    </ProjectReference>
+    <ProjectReference Include="..\StockTraderUtility\Utility.csproj">
+      <Project>{382E6E1C-E430-4F6C-BC41-5D84A3798B02}</Project>
+      <Name>Utility</Name>
+    </ProjectReference>
+  </ItemGroup>
+  <ItemGroup>
+    <None Include="stocktrader.snk" />
+  </ItemGroup>
+  <Import Project="$(MSBuildToolsPath)\Microsoft.CSharp.targets" />
+  <!-- To modify your build process, add your task inside one of the targets below and uncomment it. 
+       Other similar extension points exist, see Microsoft.Common.targets.
+  <Target Name="BeforeBuild">
+  </Target>
+  <Target Name="AfterBuild">
+  </Target>
+  -->
+  <PropertyGroup>
+    <PostBuildEvent>if not exist "$(SolutionDir)$(OutDir)\
" mkdir  "$(SolutionDir)$(OutDir)\
"
+copy "$(TargetPath)"  "$(SolutionDir)$(OutDir)\
"
+
+copy "$(TargetDir)$(TargetName).pdb" "$(SolutionDir)$(OutDir)\"</PostBuildEvent>
+  </PropertyGroup>
+</Project>
\ No newline at end of file

Added: incubator/stonehenge/trunk/stocktrader/dotnet/common/StockTraderDALMySQL/stocktrader.snk
URL: http://svn.apache.org/viewvc/incubator/stonehenge/trunk/stocktrader/dotnet/common/StockTraderDALMySQL/stocktrader.snk?rev=817792&view=auto
==============================================================================
Binary file - no diff available.

Propchange: incubator/stonehenge/trunk/stocktrader/dotnet/common/StockTraderDALMySQL/stocktrader.snk
------------------------------------------------------------------------------
    svn:mime-type = application/octet-stream