Ich habe es mittlerweile selbst gelöst: Ich gebe das Image als Base64 aus. Das geht im Firefox und ab IE7.
Hallo allerseits. Konkret geht es hier um SharePoint, ich finde aber, hier ist das Thema besser aufgehoben, als in Office-Technologien.
Ich möchte dynamisch Thumbnails von Bildern erstellen und diese dann im Cache ablegen, damit dies beim nächsten Mal nicht mehr notwendig ist.
Dies mache ich (stark verkürzt) so:
string presetName = string.Format("{0}{1}", preset, filename);
if (HttpContext.Current.Cache[presetName] == null)
{
System.Drawing.Image resizedImage = ResizeImage(GetImage(bigFileName), preset.Width, preset.Height, preset.AbsoluteValue);
HttpContext.Current.Cache.Insert(presetName, resizedImage, null, System.Web.Caching.Cache.NoAbsoluteExpiration, TimeSpan.FromDays(60));
}
Das geht auch so weit. Allerdings möchte ich am Ende nicht das Image-Objekt per Code in ein Image-Objekt übergeben, sondern ich möchte, da es viele Stellen gibt, die aufs ThumbNail zugreifen eigentlich im Code weiterhin einen einfachen "img src="xxxx" verwenden, wobei dann auf den Cache zugegriffen werden soll.
Gibt es da evtl. einfache naming conventions in Sharepoint, dass dann automatisch der richtige Wert gezogen wird?
Hallo allerseits. Ich habe einige Webparts mit Properties, die Sharepoint sich ja automatisch "merkt", d.h. ich kann sie in der PropertyPane bearbeiten, speichern und beim nächsten PageLoad sind sie auch noch da:
[ToolboxItemAttribute(false)]
public class MTContact : Microsoft.SharePoint.WebPartPages.WebPart
{
private int _leftContactId;
public int LeftContactId
{
get { return _leftContactId; }
set { _leftContactId = value; }
}
Mach ich also ein Reload auf der Seite ist "LeftContactId" noch immer mit meinem Wert gefüllt.
Versuche ich das Gleiche aber mit einer Liste oder Array:
private List<int> _allContacts;
public List<int> AllContacts {
get { return _allContacts; }
set { _allContacts=value; }
}
private int[] _allContactsArray;
public int[] AllContactsArray {
get { return _allContactsArray;}
set { _allContactsArray=value; }
}
}
"vergisst" Sharepoint meine Einstellungen. Ist das eine Sicherheitseinstellung oder muss ich sowas wie Serializable hinzufügen?
Hey. Danke für die Arbeit die Du Dir gemacht hast.
Werde da mal ein bisschen rumdoktorn und austesten. Schonmal ein schönes Wochenende.
Du meinst sowas wie:
DELETE FROM clearing_banktransfer WHERE id_bankTransfer IN
(SELECT cb.id_banktransfer FROM clearing_banktransfer cb
inner join clearing_debitor_invoice cdi on cdi.id = cb.id_clearing
Inner join clearing_debitor cd on cd.id = cdi.id_clearing_debitor
WHERE cd.id_clearing=@clearingId
)
?
Profiler ging noch nicht. Der Fehler ist leider nur im Live-System und ich muss warten, bis der Kunde diese Funktion wieder benötigt.
Ich könnte natürlich das ganze mit einem anschließenden Rollback testen, aber im Backend passieren dabei noch viele andere Aktionen (z.B. im filesystem), so dass ich das nicht riskieren will
Danke für Eure Anregungen, werde das mal durchtesten. CURSOR hatte ich sogar mal drin, ihn aber - in der Hoffnung das flotter zu kriegen - durch den Loop ersetzt.
Hat zwar nix gebracht, ist aber auch nicht langsamer geworden
verwendetes Datenbanksystem: MSSQL
Hallo allerseits. Vorab möchte ich schicken, dass ich schon ne ganze Weile mit LinQ to SQL arbeite, Fehler der Art "Du verbindest Dich falsch" etc. wohl eher nicht der Grund sind. Es gibt auch 1000 andere Procedures, die das Problem nicht haben.
Nun aber zum eigentlichen Problem:
Ich habe eine Stored Procedure, die relativ viele interne Selects, eine Schleife und Aggregatfunktionen hat etc. (Das sollte aber eigentlich unerheblich sein für mein Problem) :
ALTER PROCEDURE [dbo].[DeleteBankTransfersFromClearing]
(
@clearingId int
)
AS BEGIN
DECLARE @isTrans bit;
IF @@TRANCOUNT>0
SET @isTrans = 1;
ELSE
SET @isTrans = 0;
BEGIN TRY
IF @isTrans=0
BEGIN TRANSACTION
--] Ab hier individueller Code: [--
DECLARE
@loopReturnCode int,
@loopNextRowId int,
@loopCurrentRowId int,
@loopControl int,
@banktransferId int
--init
SELECT @loopControl = 1
SELECT @loopNextRowId = MIN(cb.id_banktransfer) FROM clearing_banktransfer cb
inner join clearing_debitor_invoice cdi on cdi.id = cb.id_clearing
Inner join clearing_debitor cd on cd.id = cdi.id_clearing_debitor
WHERE cd.id_clearing=@clearingId
IF ISNULL(@loopNextRowId,0) = 0
BEGIN
SELECT 'No data!'
RETURN ;
END
-- get first row
SELECT @loopCurrentRowId = cb.id_banktransfer
FROM clearing_banktransfer cb
WHERE cb.id_bankTransfer = @loopNextRowId
-- Löschen hier
WHILE @loopControl = 1
BEGIN
-- hier banktransferobjekte löschen (vorerst auskommentiert)
DELETE FROM clearing_banktransfer WHERE id_bankTransfer = @loopCurrentRowId
DELETE FROM bankTransfer WHERE id = @loopCurrentRowId;
-- für test select statt löschen
--SELECT t.id_bankTransfer AS BT_ID, t.id_clearing AS CL_ID
-- FROM clearing_banktransfer AS t
-- WHERE t.id_bankTransfer = @loopCurrentRowId
-- reset loop vars
SELECT @loopNextRowId = NULL
-- get next row
SELECT @loopNextRowId = MIN(cb.id_banktransfer)
FROM clearing_banktransfer cb
WHERE
cb.id_bankTransfer > @loopCurrentRowId
IF ISNULL(@loopNextRowId,0) = 0
BEGIN
BREAK
END
-- get next row
SELECT @loopCurrentRowId = cb.id_banktransfer
FROM clearing_banktransfer cb
WHERE cb.id_bankTransfer = @loopNextRowId
END
RETURN
--] Ende individueller Code [--
IF @isTrans=0
COMMIT TRANSACTION
return 0
END TRY
BEGIN CATCH
EXECUTE GetErrorInfo;
IF @isTrans=0
ROLLBACK TRANSACTION
RETURN (-1)*ERROR_NUMBER() -- negative Errorcodes
END CATCH
END
Diese procedure wird dann über LinQ verknüpft:
private int DeleteBanktransfersFromClearing(DL.LQImpersonalObjectsDataContext datacontext)
{
datacontext = datacontext ?? new DL.LQImpersonalObjectsDataContext();
int errCode = (int)ErrorCodes.NO_ERROR;
foreach (DL.DeleteBankTransfersFromClearingResult res in datacontext.DeleteBankTransfersFromClearing(_id))
{
if (res.ErrorLine.HasValue && res.ErrorLine.Value > 0)
{
return (int)ErrorCodes.DATABASE_ERROR;
}
}
if (errCode >= (int)ErrorCodes.NO_ERROR)
{
return this.CreateLog(null, ActionTypes.DELETE, "Löschen Banktransfers erfolgreich", string.Format("CLEARING {0} ", this._id));
}
return errCode;
}
Führe ich die Procedure direkt auf der Datenbank aus, dauert es <1 sekunde, bis die Ausführung abgeschlossen ist. Rufe ich die gleiche procedure über die Methode auf, kommt nach 30 Sekunden ein Datenbank-Timeout. Natürlich mit den gleichen Parametern.
Dabei ist es auch unerheblich, ob ich im Code eine Transaktion erstelle oder die Prozedur ohne Transaktion aufrufe.
Um ehrlich zu sein: Sollte mir jemand dieses Verhalten beschreiben würde ich ihm kein Wort glauben. Aber meine Kollegen kämpfen da jetzt auch schon Monate mit und haben letztendlich ihre letzte Hoffnung in mich gesetzt, die ich nun an Euch weiterleite 😃
In der Designer - Ansicht hast du die Events, in der Codebehind - Ansicht hast du die Events nicht in der Anzeige.
Nö. Ich habs in beiden schon gesehen, bzw. nicht gesehn
runat="server"
Vieleicht liegt es daran
Eher unwahrscheinlich. Schließlich handelt es sich um SERVER-Events. Das wäre relativ witzlos, wenn das mit runat="server" nicht gehen würde.
Hallo allerseits.
Wenn ich in einer ASPX-Quellcode-Datei arbeite und ein ASP-Element bearbeite habe ich hin und wieder in den Properties auch die Events, andere Male jedoch nicht. Ich bin bisher nicht dahinter gekommen, was verursacht, dass die Events gezeigt werden oder eben auch nicht:
(Markiert ist ein <asp:Button /> - Control, ich verwende VS2010
Woran liegt es, dass mal Events angeboten werden, mal nicht?
Konkret geht es hier um einen SharePoint-Webpart, aber das Problem ist eher ein generelles ASPX-Problem:
Ich möchte ein Control dynamisch einbinden:
private const string _ascxPath = @"~/_CONTROLTEMPLATES/WAS.WPs.RTContacts/RTContacts/RTContactsUserControl.ascx";
protected override void CreateChildControls()
{
Control control = Page.LoadControl(_ascxPath);
Controls.Add(control);
Control anotherControl = new RTContactsUserControl();
}
Während in der ersten Variante alles toll ist (control) hat die zweite Variante (anotherControl) nicht die untercontrols, die eigentlich an dem Control hängen; anotherControl.Controls.Count=0, während control.Controls.Count>0 ist.
Woran liegts?