public void AddCommandParameter(EPField p, EnumParameterStyle style)
        {
            DbParameter pam = cmd.CreateParameter();

            pam.ParameterName = p.GetParameterNameForCommand(style);
            pam.DbType        = ValueConvertor.OleDbTypeToDbType(p.OleDbType);
            pam.Size          = p.DataSize;
            pam.Value         = p.Value;
            cmd.Parameters.Add(pam);
        }
示例#2
0
        public string ReceiveData(DataTable tblSrc, bool bSilent)
        {
            string error = string.Empty;

            try
            {
                if (TableName.Length > 0 && _fields != null && connect != null && tblSrc != null)
                {
                    if (_fields.Count > 0 && tblSrc.Columns.Count >= _fields.Count)
                    {
                        if (tblSrc.Rows.Count > 0)
                        {
                            bool bNeedUpdate    = false;
                            bool bNeedUpdateRun = false;
                            int  i;
                            for (i = 0; i < _fields.Count; i++)
                            {
                                if (_fields[i].Indexed)
                                {
                                    bNeedUpdate = true;
                                    break;
                                }
                            }
                            EnumParameterStyle pStyle  = connect.ConnectionObject.ParameterStyle;
                            string             n1      = connect.ConnectionObject.NameDelimiterBegin;
                            string             n2      = connect.ConnectionObject.NameDelimiterEnd;
                            string             sInsert = StringUtility.FormatInvString(
                                "INSERT INTO {0}{1}{2} ({0}{3}{2}",
                                n1, TableName, n2, _fields[0].Name);

                            string sValues = _fields[0].GetParameterName(pStyle);
                            string sUpdate = StringUtility.FormatInvString(
                                "UPDATE {0}{1}{2} SET ",
                                n1, TableName, n2);
                            string sExist;
                            if (connect.ConnectionObject.IsJet || connect.ConnectionObject.IsMSSQL)
                            {
                                sExist = StringUtility.FormatInvString(
                                    "SELECT TOP 1 1 FROM {0}{1}{2} WHERE ",
                                    n1, TableName, n2);
                            }
                            else
                            {
                                sExist = StringUtility.FormatInvString(
                                    "SELECT 1 FROM {0}{1}{2} WHERE ",
                                    n1, TableName, n2);
                            }
                            string sWhere = "";
                            int    k = 0, n = 0;
                            if (bNeedUpdate)
                            {
                                if (_fields[0].Indexed)
                                {
                                    sWhere = StringUtility.FormatInvString(
                                        "{0}{1}{2}={3}", n1, _fields[0].Name, n2, _fields[0].GetParameterName(pStyle));
                                }
                                else
                                {
                                    sUpdate += StringUtility.FormatInvString("{0}{1}{2}={3}", n1, _fields[0].Name, n2, _fields[0].GetParameterName(pStyle));
                                    k++;
                                }
                                for (i = 0; i < _fields.Count; i++)
                                {
                                    if (_fields[i].Indexed)
                                    {
                                        if (n == 0)
                                        {
                                            sExist += StringUtility.FormatInvString("{0}{1}{2}={3}", n1, _fields[i].Name, n2, _fields[i].GetParameterName(pStyle));
                                        }
                                        else
                                        {
                                            sExist += StringUtility.FormatInvString(" AND {0}{1}{2}={3}", n1, _fields[i].Name, n2, _fields[i].GetParameterName(pStyle));
                                        }
                                        n++;
                                    }
                                }
                            }
                            for (i = 1; i < _fields.Count; i++)
                            {
                                sInsert += StringUtility.FormatInvString(",{0}{1}{2}", n1, _fields[i].Name, n2);
                                sValues += "," + _fields[i].GetParameterName(pStyle);
                                if (bNeedUpdate)
                                {
                                    if (_fields[i].Indexed)
                                    {
                                        if (sWhere.Length == 0)
                                        {
                                            sWhere = StringUtility.FormatInvString("{0}{1}{2}={3}", n1, _fields[i].Name, n2, _fields[i].GetParameterName(pStyle));
                                        }
                                        else
                                        {
                                            sWhere += StringUtility.FormatInvString(" AND {0}{1}{2}={3}", n1, _fields[i].Name, n2, _fields[i].GetParameterName(pStyle));
                                        }
                                    }
                                    else
                                    {
                                        if (k == 0)
                                        {
                                            sUpdate += StringUtility.FormatInvString("{0}{1}{2}={3}", n1, _fields[i].Name, n2, _fields[i].GetParameterName(pStyle));
                                        }
                                        else
                                        {
                                            sUpdate += StringUtility.FormatInvString(",{0}{1}{2}={3}", n1, _fields[i].Name, n2, _fields[i].GetParameterName(pStyle));
                                        }
                                        k++;
                                    }
                                }
                            }
                            if (bNeedUpdate && k > 0)
                            {
                                bNeedUpdateRun = true;
                            }
                            sInsert += ") VALUES (";
                            sInsert += sValues;
                            sInsert += ")";
                            //
                            connect.ConnectionObject.Open();
                            //
                            if (connect.ConnectionObject.IsMSSQL)
                            {
                                dbWrapper dbHelp = new dbWrapper();
                                dbHelp.CreateCommand(connect.ConnectionObject);
                                string sHelp = string.Format(CultureInfo.InvariantCulture, "SET IDENTITY_INSERT {0} ON", TableName);
                                dbHelp.SetCommandText(sHelp);
                                dbHelp.ExecuteNonQuery();
                            }
                            //
                            dbWrapper dbUpdate = null;
                            dbWrapper dbExists = null;
                            dbWrapper dbInsert = new dbWrapper();
                            dbInsert.CreateCommand(connect.ConnectionObject);
                            dbInsert.SetCommandText(sInsert);
                            //
                            object vExist;
                            bool   bInsert;
                            //
                            for (i = 0; i < _fields.Count; i++)
                            {
                                dbInsert.AddCommandParameter(_fields[i], pStyle);
                            }
                            //
                            if (bNeedUpdate)
                            {
                                if (bNeedUpdateRun)
                                {
                                    dbUpdate = new dbWrapper();
                                    dbUpdate.CreateCommand(connect.ConnectionObject);
                                    dbUpdate.SetCommandText(StringUtility.FormatInvString("{0} WHERE {1}", sUpdate, sWhere));
                                }
                                dbExists = new dbWrapper();
                                dbExists.CreateCommand(connect.ConnectionObject);
                                dbExists.SetCommandText(sExist);
                                for (i = 0; i < _fields.Count; i++)
                                {
                                    if (_fields[i].Indexed)
                                    {
                                        dbExists.AddCommandParameter(_fields[i], pStyle);
                                    }
                                    else
                                    {
                                        if (bNeedUpdateRun)
                                        {
                                            dbUpdate.AddCommandParameter(_fields[i], pStyle);
                                        }
                                    }
                                }
                                if (bNeedUpdateRun)
                                {
                                    for (i = 0; i < _fields.Count; i++)
                                    {
                                        if (_fields[i].Indexed)
                                        {
                                            dbUpdate.AddCommandParameter(_fields[i], pStyle);
                                        }
                                    }
                                }
                            }
                            for (int m = 0; m < tblSrc.Rows.Count; m++)
                            {
                                bInsert = true;
                                if (bNeedUpdate)
                                {
                                    k = 0;
                                    for (i = 0; i < _fields.Count; i++)
                                    {
                                        if (_fields[i].Indexed)
                                        {
                                            dbExists.SetParameterValue(k, tblSrc.Rows[m][i]);
                                            k++;
                                        }
                                    }
                                    vExist = dbExists.ExecuteScalar();
                                    if (vExist != null && vExist != System.DBNull.Value)
                                    {
                                        bInsert = false;
                                    }
                                    if (!bInsert)
                                    {
                                        if (bNeedUpdateRun)
                                        {
                                            k = 0;
                                            for (i = 0; i < _fields.Count; i++)
                                            {
                                                if (!_fields[i].Indexed)
                                                {
                                                    if (dbUpdate.Parameters[k].DbType == System.Data.DbType.Binary)
                                                    {
                                                        object v = tblSrc.Rows[m][i];
                                                        if (v == null || v == System.DBNull.Value)
                                                        {
                                                            dbUpdate.Parameters[k].Value = System.DBNull.Value;
                                                        }
                                                        else
                                                        {
                                                            string s  = v.ToString();
                                                            byte[] bs = StringUtility.StringToBytes(s);
                                                            dbUpdate.Parameters[k].Value = bs;
                                                        }
                                                    }
                                                    else
                                                    {
                                                        dbUpdate.Parameters[k].Value = tblSrc.Rows[m][i];
                                                    }
                                                    k++;
                                                }
                                            }
                                            for (i = 0; i < _fields.Count; i++)
                                            {
                                                if (_fields[i].Indexed)
                                                {
                                                    if (dbUpdate.Parameters[k].DbType == System.Data.DbType.Binary)
                                                    {
                                                        object v = tblSrc.Rows[m][i];
                                                        if (v == null || v == System.DBNull.Value)
                                                        {
                                                            dbUpdate.Parameters[k].Value = System.DBNull.Value;
                                                        }
                                                        else
                                                        {
                                                            string s  = v.ToString();
                                                            byte[] bs = StringUtility.StringToBytes(s);
                                                            dbUpdate.Parameters[k].Value = bs;
                                                        }
                                                    }
                                                    else
                                                    {
                                                        dbUpdate.Parameters[k].Value = tblSrc.Rows[m][i];
                                                    }
                                                    k++;
                                                }
                                            }
                                            dbUpdate.ExecuteNonQuery();
                                        }
                                    }
                                }
                                if (bInsert)
                                {
                                    for (i = 0; i < _fields.Count; i++)
                                    {
                                        object v = tblSrc.Rows[m][i];
                                        if (v == null || v == System.DBNull.Value)
                                        {
                                            dbInsert.Parameters[i].Value = System.DBNull.Value;
                                        }
                                        else
                                        {
                                            if (dbInsert.Parameters[i].DbType == System.Data.DbType.Binary)
                                            {
                                                string s  = v.ToString();
                                                byte[] bs = StringUtility.StringToBytes(s);
                                                dbInsert.Parameters[i].Value = bs;
                                            }
                                            else
                                            {
                                                bool   b;
                                                object v2 = VPLUtil.ConvertObject(v, EPField.ToSystemType(dbInsert.Parameters[i].DbType), out b);
                                                dbInsert.Parameters[i].Value = v2;
                                            }
                                        }
                                    }
                                    dbInsert.ExecuteNonQuery();
                                }
                            }
                            if (connect.ConnectionObject.IsMSSQL)
                            {
                                dbWrapper dbHelp = new dbWrapper();
                                dbHelp.CreateCommand(connect.ConnectionObject);
                                string sHelp = string.Format(CultureInfo.InvariantCulture, "SET IDENTITY_INSERT {0} OFF", TableName);
                                dbHelp.SetCommandText(sHelp);
                                dbHelp.ExecuteNonQuery();
                            }
                            connect.ConnectionObject.Close();
                            //
                        }
                    }
                }
            }
            catch (Exception er)
            {
                error = ExceptionLimnorDatabase.FormExceptionText(er, "Error saving data to database");
                TraceLogClass.TraceLog.ShowMessageBox = !bSilent;
                TraceLogClass.TraceLog.Log(er);
            }
            finally
            {
                connect.ConnectionObject.Close();
            }
            return(error);
        }
        public override string Execute()
        {
            string sMsg = string.Empty;

            SetError(sMsg);
            ResetAffectedRows();
            SQLNoneQuery   sql         = base.ExecutionCommand;
            ConnectionItem connect     = Connection;
            DbTransaction  transaction = Transaction;

            if (sql != null && connect != null)
            {
                DbCommand cmd = connect.ConnectionObject.CreateCommand();
                if (transaction != null)
                {
                    cmd.Transaction = transaction;
                }
                bool bClosed = !connect.ConnectionObject.Opened;
                if (bClosed)
                {
                    connect.ConnectionObject.Open();
                }
                if (connect.ConnectionObject.Opened)
                {
                    try
                    {
                        int i;
                        EnumParameterStyle pstyle = connect.ParameterStyle;
                        cmd.CommandText = sql.SQL;
                        if (sql.CommandType == enmNonQueryType.StoredProcedure)
                        {
                            cmd.CommandType = CommandType.StoredProcedure;
                        }
                        else
                        {
                            cmd.CommandType = CommandType.Text;
                        }
                        int nCount = ParameterCount;
                        for (i = 0; i < nCount; i++)
                        {
                            DbParameter pam = cmd.CreateParameter();
                            if (pstyle == EnumParameterStyle.LeadingQuestionMark)
                            {
                                if (sql.Param_Name[i].StartsWith("@", StringComparison.OrdinalIgnoreCase))
                                {
                                    pam.ParameterName = string.Format(CultureInfo.InvariantCulture, "?{0}", sql.Param_Name[i].Substring(1));
                                }
                                else if (sql.Param_Name[i].StartsWith("?", StringComparison.OrdinalIgnoreCase))
                                {
                                    pam.ParameterName = sql.Param_Name[i];
                                }
                                else
                                {
                                    pam.ParameterName = string.Format(CultureInfo.InvariantCulture, "?{0}", sql.Param_Name[i]);
                                }
                            }
                            else
                            {
                                if (sql.Param_Name[i].StartsWith("@", StringComparison.OrdinalIgnoreCase))
                                {
                                    pam.ParameterName = sql.Param_Name[i];
                                }
                                else
                                {
                                    pam.ParameterName = string.Format(CultureInfo.InvariantCulture, "@{0}", sql.Param_Name[i]);
                                }
                            }
                            pam.DbType    = ValueConvertor.OleDbTypeToDbType(sql.Param_OleDbType[i]);
                            pam.Direction = this.Param_Directions[i];
                            pam.Size      = EPField.FieldDataSize(sql.Param_OleDbType[i], this.Param_DataSize[i]);
                            pam.Value     = ValueConvertor.ConvertByOleDbType(sql.Parameters[i].Value, sql.Param_OleDbType[i]);
                            cmd.Parameters.Add(pam);
                        }
                        cmd.Prepare();
                        DbDataReader dr = cmd.ExecuteReader();

                        _dataset = new DataSet("Results");
                        int n = 1;
                        while (true)
                        {
                            DataTable tbl = new DataTable(string.Format("Table{0}", n));
                            for (i = 0; i < dr.FieldCount; i++)
                            {
                                DataColumn dc = new DataColumn(dr.GetName(i), dr.GetFieldType(i));
                                tbl.Columns.Add(dc);
                            }
                            _dataset.Tables.Add(tbl);
                            while (dr.Read())
                            {
                                object[] vs = new object[dr.FieldCount];
                                for (int k = 0; k < dr.FieldCount; k++)
                                {
                                    vs[k] = dr.GetValue(k);
                                }
                                tbl.Rows.Add(vs);
                            }
                            n++;
                            if (!dr.NextResult())
                            {
                                break;
                            }
                        }
                        dr.Close();
                        if (bClosed)
                        {
                            closeConnections();
                        }
                        for (i = 0; i < nCount; i++)
                        {
                            ParameterDirection pt = cmd.Parameters[i].Direction;
                            if (pt != ParameterDirection.Input)
                            {
                                sql.Parameters[i].Value = cmd.Parameters[i].Value;
                            }
                        }
                        FireExecuteFinish();
                    }
                    catch (Exception er)
                    {
                        if (transaction != null)
                        {
                            transaction.Rollback();
                            transaction.Dispose();
                            ResetTransaction();
                            throw;
                        }
                        else
                        {
                            sMsg = ExceptionLimnorDatabase.FormExceptionText(er);
                        }
                    }
                    finally
                    {
                        if (bClosed)
                        {
                            if (connect.ConnectionObject.State != ConnectionState.Closed)
                            {
                                connect.ConnectionObject.Close();
                            }
                        }
                    }
                }
                else
                {
                    sMsg = "Database connection not set";
                }
            }
            else
            {
                sMsg = "SQL statement not set";
            }
            if (!string.IsNullOrEmpty(sMsg))
            {
                SetError(sMsg);
            }
            return(sMsg);
        }
        public virtual string Execute()
        {
            string sMsg = string.Empty;

            SetError(sMsg);
            _affectedRows = 0;
            if (_sql != null && connect != null)
            {
                DbCommand cmd = connect.ConnectionObject.CreateCommand();
                if (_transaction != null)
                {
                    cmd.Transaction = _transaction;
                }
                bool bClosed = !connect.ConnectionObject.Opened;
                if (bClosed)
                {
                    connect.ConnectionObject.Open();
                }
                if (connect.ConnectionObject.Opened)
                {
                    try
                    {
                        int i;
                        EnumParameterStyle pstyle = connect.ParameterStyle;
                        FieldList          pmMap  = new FieldList();
                        string             s;
                        int nCount;
                        s = _sql.GetSQLStatement(pmMap, pstyle);
                        if (pstyle == EnumParameterStyle.QuestionMark)
                        {
                            nCount = pmMap.Count;
                        }
                        else
                        {
                            nCount = _sql.ParamCount;
                        }
                        connect.Log("Command:{0}, params:{1}", s, nCount);
                        cmd.CommandText = s;
                        cmd.CommandType = CommandType.Text;
                        for (i = 0; i < nCount; i++)
                        {
                            DbParameter pam = cmd.CreateParameter();
                            EPField     f;
                            if (pstyle == EnumParameterStyle.QuestionMark)
                            {
                                f = pmMap[i];
                                pam.ParameterName = "@P" + i.ToString();
                            }
                            else
                            {
                                f = _sql.Parameters[i];
                                pam.ParameterName = ParameterList.GetParameterName(pstyle, _sql.Parameters[i].Name);
                            }
                            pam.DbType = ValueConvertor.OleDbTypeToDbType(f.OleDbType);
                            pam.Size   = f.DataSize;

                            OleDbParameter op = pam as OleDbParameter;
                            if (op != null && f.OleDbType == OleDbType.DBTimeStamp)
                            {
                                if (f.Value != null && f.Value != DBNull.Value)
                                {
                                    DateTime dt = (DateTime)(f.Value);
                                    dt = new DateTime(dt.Year, dt.Month, dt.Day, dt.Hour, dt.Minute, dt.Second);
                                    f.SetValue(dt);
                                }
                            }
                            connect.Log("param{0}:{1},{2},{3}. Value type:{4}. Value:{5}", i, pam.ParameterName, pam.DbType, pam.Size, f.OleDbType, f.Value);
                            if (EPField.IsDatetime(f.OleDbType))
                            {
                                if (f.IsNullOrEmpty)
                                {
                                    pam.Value = System.DBNull.Value;
                                }
                                else
                                {
                                    object dt0 = ValueConvertor.ConvertByOleDbType(f.Value, f.OleDbType);
                                    try
                                    {
                                        DateTime dt = (DateTime)dt0;
                                        if (dt.Ticks == 0)
                                        {
                                            pam.Value = System.DBNull.Value;
                                        }
                                        else
                                        {
                                            pam.Value = dt;
                                        }
                                    }
                                    catch
                                    {
                                        pam.Value = dt0;
                                    }
                                }
                            }
                            else
                            {
                                pam.Value = ValueConvertor.ConvertByOleDbType(f.Value, f.OleDbType);
                            }
                            cmd.Parameters.Add(pam);
                        }
                        _affectedRows = cmd.ExecuteNonQuery();
                        connect.Log("Affected rows:{0}", _affectedRows);
                        if (bClosed)
                        {
                            closeConnections();
                        }
                        if (this.ExecuteFinish != null)
                        {
                            ExecuteFinish(this, EventArgs.Empty);
                        }
                        if (_webPage != null && !string.IsNullOrEmpty(_name))
                        {
                            _webPage.SetServerComponentName(_name);
                        }
                    }
                    catch (Exception er)
                    {
                        if (_transaction != null)
                        {
                            _transaction.Rollback();
                            _transaction.Dispose();
                            _transaction = null;
                            connect.Log("rollback with error {0}", er.Message);
                            throw;
                        }
                        else
                        {
                            sMsg = ExceptionLimnorDatabase.FormExceptionText(er);
                        }
                    }
                    finally
                    {
                        if (bClosed)
                        {
                            if (connect.ConnectionObject.State != ConnectionState.Closed)
                            {
                                connect.ConnectionObject.Close();
                            }
                        }
                    }
                }
                else
                {
                    sMsg = "Database connection not set";
                }
            }
            else
            {
                sMsg = "SQL statement not set";
            }
            if (!string.IsNullOrEmpty(sMsg))
            {
                SetError(sMsg);
                if (connect != null)
                {
                    connect.Log("Error executing EasyUpdator.Execute. {0}", sMsg);
                }
            }
            return(sMsg);
        }
        /// <summary>
        /// replace parameters with ? and collect non-unique parameter names in paramMap
        /// </summary>
        /// <param name="sSQL">the SQL string to parse, it can be any part of SQL</param>
        /// <param name="paramList">for validation. parameter names must be in this list</param>
        /// <param name="paramMap">this list is filled with the non-unique parameter names</param>
        /// <returns>the SQL string with parameters replaced with ?</returns>
        public static string MapParameters(string sSQL, EnumParameterStyle paramStyle, string sepStart, string sepEnd, FieldList paramList, FieldList paramMap, ParameterList psOld)
        {
            if (sSQL == null)
            {
                sSQL = "";
            }
            string S = sSQL;

            if (S.Length > 0)
            {
                string  name;
                EPField fld;
                int     n = SQLParser.FindParameterIndex(S, 0, sepStart, sepEnd, out ParseError);
                while (n >= 0)
                {
                    int i = SQLParser.FindNameEnd(S, n);
                    name = S.Substring(n, i - n);
                    name = name.Trim();
                    if (paramStyle == EnumParameterStyle.QuestionMark)
                    {
                        S = string.Format(CultureInfo.InvariantCulture, "{0}? {1}", S.Substring(0, n), S.Substring(i));
                        n++;
                    }
                    else if (paramStyle == EnumParameterStyle.LeadingQuestionMark)
                    {
                        string pname = ParameterList.GetParameterName(paramStyle, name);
                        S  = string.Format(CultureInfo.InvariantCulture, "{0}{1} {2}", S.Substring(0, n), pname, S.Substring(i));
                        n += pname.Length + 1;
                    }
                    else
                    {
                        n += name.Length + 1;
                    }
                    fld = paramList[name];
                    if (fld == null)
                    {
                        EPField f0 = null;
                        if (psOld != null && psOld.Count > 0)
                        {
                            f0 = psOld[name];
                        }
                        if (f0 == null)
                        {
                            fld = new EPField(paramList.Count, name);
                        }
                        else
                        {
                            fld       = f0.Clone() as EPField;
                            fld.Index = paramList.Count;
                        }
                        paramList.Add(fld);
                    }
                    if (paramStyle == EnumParameterStyle.QuestionMark)
                    {
                        //non-unique name is added
                        paramMap.AddFieldDup(fld);
                    }
                    n = SQLParser.FindParameterIndex(S, n, sepStart, sepEnd, out ParseError);
                }
            }
            return(S);
        }