public static void UpdateCustomFields(SplendidControl ctlPARENT, IDbTransaction trn, Guid gID, string sCUSTOM_MODULE, DataTable dtCustomFields)
        {
            if ( dtCustomFields.Rows.Count > 0 )
            {
                IDbConnection con = trn.Connection;
                using ( IDbCommand cmd = con.CreateCommand() )
                {
                    cmd.Transaction = trn;
                    cmd.CommandType = CommandType.Text;
                    cmd.CommandText = "update " + sCUSTOM_MODULE + "_CSTM" + ControlChars.CrLf;
                    int nFieldIndex = 0;
                    foreach(DataRow row in dtCustomFields.Rows)
                    {
                        // 01/11/2006 Paul.  Uppercase looks better.
                        string sNAME   = Sql.ToString(row["NAME"  ]).ToUpper();
                        string sCsType = Sql.ToString(row["CsType"]);
                        DynamicControl ctlCustomField = new DynamicControl(ctlPARENT, sNAME);
                        if ( ctlCustomField.Exists )
                        {
                            if ( nFieldIndex == 0 )
                                cmd.CommandText += "   set ";
                            else
                                cmd.CommandText += "     , ";
                            // 01/10/2006 Paul.  We can't use a StringBuilder because the Sql.AddParameter function
                            // needs to be able to replace the @ with the appropriate database specific token.
                            cmd.CommandText += sNAME + " = @" + sNAME + ControlChars.CrLf;

                            DynamicControl ctlCustomField_File = new DynamicControl(ctlPARENT, sNAME + "_File");
                            // 04/21/2006 Paul.  If the type is Guid and it is accompanied by a File control, then assume it is an image.
                            if ( sCsType == "Guid" && ctlCustomField.Type == "HtmlInputHidden" && ctlCustomField_File.Exists )
                            {
                                LoadImage(ctlPARENT, gID, sNAME, trn);
                            }
                            // 04/21/2006 Paul.  Even if there is no image to upload, we still need to update the field.
                            // This is so that the image can be cleared.
                            switch ( sCsType )
                            {
                                case "Guid"    :  Sql.AddParameter(cmd, "@" + sNAME, ctlCustomField.ID          );  break;
                                case "short"   :  Sql.AddParameter(cmd, "@" + sNAME, ctlCustomField.IntegerValue);  break;
                                case "Int32"   :  Sql.AddParameter(cmd, "@" + sNAME, ctlCustomField.IntegerValue);  break;
                                case "Int64"   :  Sql.AddParameter(cmd, "@" + sNAME, ctlCustomField.IntegerValue);  break;
                                case "float"   :  Sql.AddParameter(cmd, "@" + sNAME, ctlCustomField.FloatValue  );  break;
                                case "decimal" :  Sql.AddParameter(cmd, "@" + sNAME, ctlCustomField.DecimalValue);  break;
                                case "bool"    :  Sql.AddParameter(cmd, "@" + sNAME, ctlCustomField.Checked     );  break;
                                case "DateTime":  Sql.AddParameter(cmd, "@" + sNAME, ctlCustomField.DateValue   );  break;
                                default        :  Sql.AddParameter(cmd, "@" + sNAME, ctlCustomField.Text        );  break;
                            }
                            nFieldIndex++;
                        }
                    }
                    if ( nFieldIndex > 0 )
                    {
                        cmd.CommandText += " where ID_C = @ID_C" + ControlChars.CrLf;
                        Sql.AddParameter(cmd, "@ID_C", gID);
                        cmd.ExecuteNonQuery();
                    }
                }
            }
        }
        public static bool LoadImage(SplendidControl ctlPARENT, Guid gParentID, string sFIELD_NAME, IDbTransaction trn)
        {
            bool bNewFile = false;
            HtmlInputFile fileIMAGE = ctlPARENT.FindControl(sFIELD_NAME + "_File") as HtmlInputFile;
            if ( fileIMAGE != null )
            {
                HttpPostedFile pstIMAGE  = fileIMAGE.PostedFile;
                if ( pstIMAGE != null )
                {
                    long lFileSize      = pstIMAGE.ContentLength;
                    long lUploadMaxSize = Sql.ToLong(HttpContext.Current.Application["CONFIG.upload_maxsize"]);
                    if ( (lUploadMaxSize > 0) && (lFileSize > lUploadMaxSize) )
                    {
                        throw(new Exception("ERROR: uploaded file was too big: max filesize: " + lUploadMaxSize.ToString()));
                    }
                    // 04/13/2005 Paul.  File may not have been provided.
                    if ( pstIMAGE.FileName.Length > 0 )
                    {
                        string sFILENAME       = Path.GetFileName (pstIMAGE.FileName);
                        string sFILE_EXT       = Path.GetExtension(sFILENAME);
                        string sFILE_MIME_TYPE = pstIMAGE.ContentType;

                        Guid gImageID = Guid.Empty;
                        SqlProcs.spIMAGES_Insert
                            ( ref gImageID
                            , gParentID
                            , sFILENAME
                            , sFILE_EXT
                            , sFILE_MIME_TYPE
                            , trn
                            );
                        SplendidDynamic.LoadFile(gImageID, pstIMAGE.InputStream, trn);
                        // 04/17/2006 Paul.  Update the dynamic control so that it can be accessed below.
                        DynamicControl ctlIMAGE = new DynamicControl(ctlPARENT, sFIELD_NAME);
                        ctlIMAGE.ID = gImageID;
                        bNewFile = true;
                    }
                }
            }
            return bNewFile;
        }