Laden...
H
Benutzerbeschreibung

Forenbeiträge von honkman16 Ingesamt 87 Beiträge

26.06.2018 - 14:15 Uhr

Das Form meine ich ist ordentlich aufgebaut. Das Model dass ich an den Controller übergebe sieht wie folgt aus:

AnzahlLimits: "23"
Limits[0].DnCode: "100"
Limits[0].DnId: "7"
Limits[1].DnCode: "100"
Limits[1].DnId: "7"

Also meine ich, dass das Format eigentlich stimmt. Die Klasse sieht ja so aus:


public class M_LimitItems
    {
        public M_LimitItems()
        {
            AnzahlLimits = 0;
            Limits = new List<M_LimitEditItem>();
        }

        public int AnzahlLimits { get; set; }
        public List<M_LimitEditItem> Limits { get; set; }
    }

Beim Controller ist aber das Objekt immer NULL.

Übergebe ich das Objekt falsch?

JS Code sieht so aus:


$.ajax({
        cache: false,
        async: true,
        traditional: true,
        type: "POST",
        url: "SaveLimits",
        data: { 'LimitModel': viewModel },
        error: function (response) {
            fnLog(response.responseText);
        },
        success: function (response) {
            

        }
    });

25.06.2018 - 18:05 Uhr

Hallo,

ich habe in einem PartialView eine List als Model. Like this:
@model List<myModels.M_LimitEditItem>

Für jedes Element in der List gibt es ein Zeile in der Tabelle mit den entsprechenden Inputs. Alles natürlich in einem Form.

Wenn man nun einen Link anklickt, möchte ich den aktuellen Inhalt des Forms (also im Prinzip das List Objekt mit den aktuellen Werten) an meinen Controller schicken. Per Ajax.

Was ich schon habe:


function fnLimitsUseFirstForAll() {

    var $form = $("#torqueLimitsData");
    var formId = $form.attr('id');
    fnLog(formId);

    var jsonData = $form.serializeObjectIntoJson();
    var jsonString = JSON.stringify(jsonData);
    fnLog('JSON: ' + jsonString);

    $.ajax({
        url: '/Limit/SetLimitFromFirstForAll',
        data: jsonString,
        type: 'POST',
        error: function (xhr, status, error) {
            fnLog(error);
        },
        success: function () {
        }

    });
}

Controller sieht so aus:


[Authorize]
        [HttpPost]
        public ActionResult SetLimitFromFirstForAll(List<myModels.M_LimitEditItem> Limits)
        {
            Common.Debugger.WriteLog("Limits to save: " + Limits.Count.ToString());

            return Json(true);
        }

Der Controller wird zwar aufgerufen, aber das Limits Objekt (also die Liste) ist leer.

Hat jemand eine Ahnung woran das liegt?

LG
C

PS: Diese jQuery Erweiterung verwende ich auch noch. Kommt im Code oben vor.


$.fn.serializeObjectIntoJson = function () {
    var o = {};
    var a = this.serializeArray();
    $.each(a, function () {
        if (o[this.name] !== undefined) {
            if (!o[this.name].push) {
                o[this.name] = [o[this.name]];
            }
            o[this.name].push(this.value || '');
        } else {
            o[this.name] = this.value || '';
        }
    });
    return o;
};

02.11.2015 - 17:52 Uhr

Hallo,

ich muss eine neue WebApp entwickeln die auf MVC 5 basiert. Hier scheint sich einiges geändert zu haben im Vergleich zu MVC 3. Mein Szenario ist folgendes:

*) Vorhandene DB (User Tabelle ist schon vorhanden; kann aber angepaßt werden)
*) Datenzugriff mittels EF 6; die Repositories, Context, etc. sind daher schon vorhanden. Habe ich geschrieben und funktionieren auch tadellos.
*) Das VS Project habe ich mittels MVC 5 Template erstellt. Dies beinhaltet bereits einiges an Code hinsichtlich Registrierung, Login, etc.

Mein Problem ist nun, meine EF 6 Klassen und den MemberShip provider zusammenzuführen, sodass der MP eben meine EF Datenzugriffsklassen etc. verwendet.

Gibt es hier Beispiele einer Implementierung?

Bin dankbar für jede Info. Habe jetzt schon den ganzen Nachmittag bei Dr. Google verbracht. Aber alle Ansätze basieren auf Code First und das geht in meinem Fall leider nicht.

BG
H

11.01.2015 - 18:36 Uhr

Danke, das wäre sehr hilfreich.

Mir geht es darum den Verzeichnisbaum darzustellen und Files direkt bearbeiten zu können (hinzufügen, editieren, ev. auch löschen). Verzeichnisse zu bearbeiten ist z.B. nicht notwendig (neuen Ordner erstellen, etc.).

LG
C

11.01.2015 - 17:16 Uhr

Hallo,

in meiner Applikation werden Files und deren Struktur (Ordner) in einer SQL Datenbank abgespeichert. Um darauf auch per Windows Explorer zugreifen zu können, ist mir WebDAV in den Sinn gekommen.

Hat jemand Erfahrung mit der Implementierung eines eigenen WebDAV Servers bzw. kennt jemand brauchbare Bibliotheken, etc. (OpenSource wäre natürlich bevorzugt, kommerzielle wäre auch ok)? Implementierung über IIS scheidet aus.

Grüße
Honkman

10.07.2014 - 15:31 Uhr

Wie verhält es sich eigentlich, wenn ich aus einem MTA Thread einen oder mehrere STA Threads aufrufe? Bzw. aus einem STA Thread einen oder mehrere MTA Threads. Ist hierbei auf irgendwas zu achten? Insbesondere bei einer weiteren Kaskadierung?

Grundsätzlich sollte dies ja problemlos möglich sein, da ja eine WinForm Applikation als STA läuft und ich daraus ja MTA Threads aufrufen/starten kann.

Rufe ich also aus einem STA Thread (WinForm MainThread) einen MTA Thread auf und daraus mehrere STA Threads so gelten für die STAs einfach die Regeln für STA Threading. Korrekt?

Bin mir da jetzt nicht ganz sicher. 🤔

LG
H

26.06.2014 - 13:45 Uhr

Danke für die Infos!

Ich verwende jetzt einen anderen TaskScheduler. Den bis jetzt verwendeten, habe ich von der .Net Seite. Den neuen habe ich hier gefunden:

Task Parallel Library: A scheduler with priority, apartment state and maximum degree of parallelism

Ich denke, dass so die ApartmentStates dann richtig gesetzt werden wenn ich bei der Instanzierung des Schedulers STA angebe.

Falls es interessiert, hier der gesamte Code des Schedulers:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Threading;
using System.Collections.Concurrent;
using System.Diagnostics;
 
namespace Utility
{
    /// <summary>
    /// TaskScheduler that uses the task parallel library, complete with all the new wonderful task cancellation features
    /// This one adds the ability to set ApartmentState, ThreadPriority, MaximumConcurrency and does some logging
    /// </summary>
    public class TaskScheduler2 : TaskScheduler, IDisposable
    {
        private ApartmentState apartmentState;
        private ThreadPriority threadPriority;
 
        private readonly List<Thread> threads;
 
        private BlockingCollection<Task> tasks;
 
        /// <summary>
        /// An MTA, BelowNormal TaskScheduler with the appropriate number of threads
        /// </summary>
        public TaskScheduler2 (int numberOfThreads)
            : this(numberOfThreads, ApartmentState.MTA, ThreadPriority.BelowNormal)
        {
        }
 
        public TaskScheduler2(int numberOfThreads, ApartmentState apartmentState, ThreadPriority threadPriority)
        {
            this.apartmentState = apartmentState;
            this.threadPriority = threadPriority;
 
            if (numberOfThreads < 1) throw new ArgumentOutOfRangeException("numberOfThreads");
 
            tasks = new BlockingCollection<Task>();
 
            threads = Enumerable.Range(0, numberOfThreads).Select(i =>
            {
                var thread = new Thread(() =>
                {
                    foreach (var task in tasks.GetConsumingEnumerable())
                    {
                        ExecuteTaskWithTiming(task, "queued");
                    }
                });
                thread.IsBackground = true;
                thread.Priority = this.threadPriority;
                thread.SetApartmentState(this.apartmentState);
                return thread;
            }).ToList();
 
            threads.ForEach(t => t.Start());
        }
 
        protected override void QueueTask(Task task)
        {
            tasks.Add(task);
        }
 
        protected override IEnumerable<Task> GetScheduledTasks()
        {
            return tasks.ToArray();
        }
 
        protected override bool TryExecuteTaskInline(Task task, bool taskWasPreviouslyQueued)
        {
            // this is used to execute the Task on the thread that is waiting for it - i.e. INLINE
            // it needs to check the Apartment state and any other requirements
            if (Thread.CurrentThread.GetApartmentState() != this.apartmentState) return false;          // can't execute on wrong Appt state
            if (Thread.CurrentThread.Priority != this.threadPriority) return false;                     // can't execute on wrong priority of thread either
            return ExecuteTaskWithTiming(task, "inline");
        }
 
        private bool ExecuteTaskWithTiming(Task task, string contextInfo)
        {
            Stopwatch sw = Stopwatch.StartNew();
            Debug.WriteLine("Starting " + contextInfo + " task");
            bool ok = TryExecuteTask(task);
            Debug.WriteLine("Ending " + contextInfo + " task, took " + sw.ElapsedMilliseconds + "ms");
            return ok;
        }
 
        protected override bool TryDequeue(Task task)
        {
            return base.TryDequeue(task);
        }
 
 
        public override int MaximumConcurrencyLevel
        {
            get { return threads.Count; }
        }
 
        public void Dispose()
        {
            if (tasks != null)
            {
                tasks.CompleteAdding();
 
                foreach (var thread in threads) thread.Join();
 
                tasks.Dispose();
                tasks = null;
            }
        }
    }
}

Sollte dieser Ansatz nicht in Ordnung sein, bitte um Info. Dann lösche ich das hier raus. Aber wenn es so korrekt ist, hilft es ev. auch anderen mit ähnlichem oder gleichem Problem weiter.

Eine gute Erklärung zu dem Thema findet sich auch hier: Thread Priority und Task Parallel Library: Ist das möglich?

26.06.2014 - 09:35 Uhr

Reicht es aus, wenn ich kurz nach dem Start der Funktion folgenden Code verwende?

System.Threading.Thread.CurrentThread.SetApartmentState(System.Threading.ApartmentState.STA);

Oder muss ich dass in meinem Scheduler definieren und es dort definieren (vermutlich mit dem gleichen Code).

Herzlichen Dank für die Hilfe!

25.06.2014 - 17:16 Uhr

Gerade noch folgendes gefunden:

The API threading model has been changed from COM single-threaded apartment (STA) to Both, thus simplifying use in .NET applications.

Sollte also Thread Safe sein.

25.06.2014 - 16:48 Uhr

Kann ich irgendwie feststellen, ob eine Komponente Thread Safe ist? Vom Hersteller (Symantec) gibt es hier weder Doku noch Info.

Danke & LG

24.06.2014 - 17:45 Uhr

Ich muss eine Com+ Komponente eines anderen Herstellers in meine Applikation (C#) einbinden. Hier werden einfach viele Elemente (Emails) bearbeitet und das eben parallel. Das funktioniert grundsätzlich gut, jedoch bin ich mir hinsichtlich der Com+ Bibliothek nicht sicher.

Um das Multithreading zu steuern verwende ich den "TaskScheduler" (gibt es glaube ich ab .Net 4.0) der wiederum einfach "Tasks" verwendet. Aufruf/Start eines neuen Threads im Prinzip mit diesem Code:

//MyScheduler is eine Ableitung von TaskSchedulerM; MaxImportThreads definiert die max. Anzahl von parallelen Threads
MyScheduler scheduler = new MyScheduler (MaxImportThreads);
TaskFactory importTaskFactory = new TaskFactory(scheduler);
                            importTaskFactory.StartNew(() =>
                            {
                                importer.StartImport((object)aiii);
                            }, _cancelToken.Token);
                        }

In der Funktion "StartImport" und damit im jeweiligen Thread erstelle ich eine neue Instanz der Com+ Komponente und verwende diese dort. Abschließend verwerfe ich diese in dem Thread auch.

myComPlusApi myApiObject = new myComPlusApi();

Meine Frage ist nun: Wird auch wirklich immer eine eigene / unabhängige Instanz dieser Komponente in jedem Thread erstellt? Wie kann ich da sicher sein? Diese Komponente gibt mir Werte zurück und die müssen unbedingt stimmen und sind in jedem Thread unterschiedlich. Es wäre ziemlich unangenehm, wenn ich im Thread 1 den Wert eines anderes Threads (also z.B. Thread 2) erhalte.

Danke fürs Feedback
C

10.10.2013 - 14:56 Uhr

In meiner Applikation muss ich eine Vielzahl von Funktionen/Tasks abarbeiten die in Gruppen zusammengefasst sind. Konkret müssen Archive bearbeitet werden und für jedes Archiv müssen zumindest 6 Funktionen durchlaufen werden. Um die Performance zu steigern möchte ich mehrere Archive parallel abarbeiten.

In einer der Funktionen (die für jedes Archiv ausgeführt wird) werden Files aus einem Archiv geladen. Da verwende ich bereits erfolgreich den TaskScheduler. D.h. ich lade mehrere Elemente gleichzeitig.

Wenn ich jetzt Archive parallel abarbeiten möchte, verwende ich auch den TaskScheduler. Eine eigene Instanz einer Hilfsklasse "myScheduler" für den TaskScheduler. Diese sieht so aus:


public class MyScheduler : TaskScheduler
    {
        /// <summary>Whether the current thread is processing work items.</summary>
        [ThreadStatic]
        private static bool _currentThreadIsProcessingItems;
        /// <summary>The list of tasks to be executed.</summary>
        private readonly LinkedList<Task> _tasks = new LinkedList<Task>(); // protected by lock(_tasks)
        /// <summary>The maximum concurrency level allowed by this scheduler.</summary>
        private readonly int _maxDegreeOfParallelism;
        /// <summary>Whether the scheduler is currently processing work items.</summary>
        private int _delegatesQueuedOrRunning = 0; // protected by lock(_tasks)

        /// <summary>
        /// Initializes an instance of the LimitedConcurrencyLevelTaskScheduler class with the
        /// specified degree of parallelism.
        /// </summary>
        /// <param name="maxDegreeOfParallelism">The maximum degree of parallelism provided by this scheduler.</param>
        public VaultixScheduler(int maxDegreeOfParallelism)
        {
            if (maxDegreeOfParallelism < 1) throw new ArgumentOutOfRangeException("maxDegreeOfParallelism");
            _maxDegreeOfParallelism = maxDegreeOfParallelism;

            TaskList = new List<Task>();
        }

        public List<Task> TaskList { get; set; }

        /// <summary>Queues a task to the scheduler.</summary>
        /// <param name="task">The task to be queued.</param>
        protected sealed override void QueueTask(Task task)
        {
            // Add the task to the list of tasks to be processed.  If there aren't enough
            // delegates currently queued or running to process tasks, schedule another.
            lock (_tasks)
            {
                _tasks.AddLast(task);
                TaskList.Add(task);
                if (_delegatesQueuedOrRunning < _maxDegreeOfParallelism)
                {
                    ++_delegatesQueuedOrRunning;
                    NotifyThreadPoolOfPendingWork();
                }
            }
        }

        /// <summary>
        /// Informs the ThreadPool that there's work to be executed for this scheduler.
        /// </summary>
        private void NotifyThreadPoolOfPendingWork()
        {
            ThreadPool.UnsafeQueueUserWorkItem(_ =>
            {
                // Note that the current thread is now processing work items.
                // This is necessary to enable inlining of tasks into this thread.
                _currentThreadIsProcessingItems = true;
                try
                {
                    // Process all available items in the queue.
                    while (true)
                    {
                        Task item;
                        lock (_tasks)
                        {
                            // When there are no more items to be processed,
                            // note that we're done processing, and get out.
                            if (_tasks.Count == 0)
                            {
                                --_delegatesQueuedOrRunning;
                                break;
                            }

                            // Get the next item from the queue
                            item = _tasks.First.Value;
                            _tasks.RemoveFirst();
                        }

                        // Execute the task we pulled out of the queue
                        base.TryExecuteTask(item);
                    }
                }
                // We're done processing items on the current thread
                finally { _currentThreadIsProcessingItems = false; }
            }, null);
        }

        /// <summary>Attempts to execute the specified task on the current thread.</summary>
        /// <param name="task">The task to be executed.</param>
        /// <param name="taskWasPreviouslyQueued"></param>
        /// <returns>Whether the task could be executed on the current thread.</returns>
        protected sealed override bool TryExecuteTaskInline(Task task, bool taskWasPreviouslyQueued)
        {
            // If this thread isn't already processing a task, we don't support inlining
            if (!_currentThreadIsProcessingItems) return false;

            // If the task was previously queued, remove it from the queue
            if (taskWasPreviouslyQueued) TryDequeue(task);

            // Try to run the task.
            return base.TryExecuteTask(task);
        }

        /// <summary>Attempts to remove a previously scheduled task from the scheduler.</summary>
        /// <param name="task">The task to be removed.</param>
        /// <returns>Whether the task could be found and removed.</returns>
        protected sealed override bool TryDequeue(Task task)
        {
            lock (_tasks) return _tasks.Remove(task);
        }

        /// <summary>Gets the maximum concurrency level supported by this scheduler.</summary>
        public sealed override int MaximumConcurrencyLevel { get { return _maxDegreeOfParallelism; } }

        /// <summary>Gets an enumerable of the tasks currently scheduled on this scheduler.</summary>
        /// <returns>An enumerable of the tasks currently scheduled.</returns>
        protected sealed override IEnumerable<Task> GetScheduledTasks()
        {
            bool lockTaken = false;
            try
            {
                Monitor.TryEnter(_tasks, ref lockTaken);
                if (lockTaken) return _tasks.ToArray();
                else throw new NotSupportedException();
            }
            finally
            {
                if (lockTaken) Monitor.Exit(_tasks);
            }
        }

Frage dazu: Kann ich wirklich mehrere unabhängige Instanzen des TaskScheduler erstellen und verwenden, oder ist das eigentlich immer der Gleiche?

Danke fürs Feedback

15.10.2012 - 21:51 Uhr

Wenn ich ein Form einer View mittels Submit an den Controller übergebe, so enthält das Model im Controller nur die Werte, für die es im Form ein Element gibt. Konkretes Beispiel:

Mein Model hat ein Feld mit dem Namen "Test" und ein Feld mit dem Namen "Eingabe". Beide halten einen Wert bzw. haben einen Wert zugewiesen. Für das Feld "Eingabe" gibt es eine Textbox die an das Feld gebunden ist. Sende ich nun das Form ab, so hat mein Model im Controller nur im Feld "Eingabe" einen Wert. Im Feld "Test" keinen. Der ist Null.

Bis jetzt habe ich mir damit geholfen, dass ich für die Felder die kein Form Element haben, ein Hidden Field erstellt habe. Aber das scheint mir irgendwie nicht sehr elegant und ist auch im Handling mühevoll.

Kennt jemand alternativen hierfür bzw. einen besseren Lösungsansatz?

CG

05.09.2012 - 18:13 Uhr

Ich ärgere mich schon seit einiger Zeit mit Linq2SQL. Grundsätzlich verwende ich es sehr gerne aber manchmal ist es echt mühevoll, wenn Änderungen an den Daten die man eigentlich nicht mehr braucht im DataContext weiterleben. Aus diesem Grund habe ich mir eine kleine Hilfsfunktion geschrieben, die einfach alle Änderungen die im ChangeSet mitgeführt werden zurücksetzt auf die Originalwerte (aus der Datenbank).


public static void ResetChangesOnDataContext(bool IsUpdate, bool IsInsert, bool IsDelete)
        {
            if (_dataContext != null)
            {
                System.Data.Linq.ChangeSet set = GlobalData.DataContext.GetChangeSet();
                if (IsUpdate)
                {
                    foreach (object o in set.Updates)
                    {
                        GlobalData.DataContext.Refresh(System.Data.Linq.RefreshMode.OverwriteCurrentValues, o);
                    }
                }

                if (IsInsert)
                {
                    foreach (object o in set.Inserts)
                    {
                        GlobalData.DataContext.Refresh(System.Data.Linq.RefreshMode.OverwriteCurrentValues, o);
                    }
                }

                if (IsDelete)
                {
                    foreach (object o in set.Deletes)
                    {
                        GlobalData.DataContext.Refresh(System.Data.Linq.RefreshMode.OverwriteCurrentValues, o);
                    }
                }
            }

            GC.Collect();
        }

Eine wirklich einfache Funktion die den DataContext auf Datenbank Stand zurücksetzt ohne das man ihn neu instanzieren muss.

03.05.2012 - 18:14 Uhr

Ich habe einen MVC 4 / C# / Razor basierte Webapp und möchte folgendes realisieren:
Wenn bei 2 bestimmten (der insgesamt 10) DDLs eine Auswahl getroffen wurde, soll mittels AJAX über einen Controller ein bestimmter Text (Logik dafür im Controller) geladen und auf der Seite angezeigt werden ohne die ganze Seite neu zu laden.

Kann mir hier jemand weiterhelfen bzw. Tips geben wie dies zu realisieren ist. Ich bin .Net / C# Entwickler und habe von JavaScript leider nicht sehr viel Ahnung (noch nicht zumindest). Ein Beispiel das dem nahekommt wäre optimal.

Herzlichen Dank!

30.01.2012 - 17:16 Uhr

Habe es auch gerade rausgefunden. Aber Danke!!!

Wird Zeit das Amazon endlich das bestellte Buch liefert 😉
Professional ASP.NET MVC 3 (Wrox Programmer to Programmer)

30.01.2012 - 15:54 Uhr

Danke für den Input. Den Ansatz mit der Section werde ich weiter verfolgen.

Ich vermute ich muss diese Sections (=CustomControls oder so ähnlich) irgendwo definieren und diese in jeder View dann an entsprechender Stelle aufrufen.

In der Layout Page selber ist dies ja offenbar nicht möglich.

Danke jedenfalls fürs Feedback!!!

30.01.2012 - 15:26 Uhr

Ich erstelle gerade meine erste MVC Applikation. Folgende Frage dazu: Ich möchte auf alles Seiten (=Views) die gleiche Navigation haben. Dafür habe ich eine Komponente (=Control).

Leider kann ich offenbar in CSHTML Layout Seiten keine Controls einfügen/verwenden. Ist dies korrekt? Wie löst man das Problem sonst, dass man auf allen Seiten (=Views) die gleiche Navigations- bzw. Menükomponente verwendet?

Danke fürs Feedback

18.01.2012 - 18:34 Uhr

UPDATE:

Wenn ich beim Laden "context.DeferredLoadingEnabled = false;" setze, dann kann ich ohne Fehler speichern. Aber: Der Wert wird nicht in die DB geschrieben.

Wenn ich beim Speichern dann nach dem "Attach" noch folgenden Code hinzufüge, dann wird die Änderung in die Datenbank geschrieben:

context.Refresh(RefreshMode.KeepCurrentValues, booking);

Wirklich durchblicken bzw. verstehen kann ich es aber leider noch nicht 😦

18.01.2012 - 18:16 Uhr

Danke für die Antwort. Korrekt: Die 3 Layer habe ich nicht. Habe jetzt testweise die 3 Layer umgesetzt. Und zwar:

Mein Interface:

public interface IRepository<T>
    {
        T Get(int id);
        bool Save(T entity);
    }

Meine Entity Klasse:

class RBooking : IRepository<Booking>
    {
        public Booking Get(int id)
        {
            using (var context = new BookixDbDataContext(Constants.ConnectionString))
            {
                var booking = from b in context.Bookings where b.BookingId == id select b;
                return booking.SingleOrDefault();
            }
        }

        public bool Save(Booking booking)
        {
            using (var context = new BookixDbDataContext(Constants.ConnectionString))
            {
                context.Bookings.Attach(booking);
                context.SubmitChanges(ConflictMode.FailOnFirstConflict);
                return true;
            }
        }
    }

Aufruf:

private void Test()
        {
            RBooking rb = new RBooking();
            Booking booking = rb.Get(129);
            booking.IsFa = true; // nur drin um einen Wert zu ändern

            rb.Save(booking);
        }

Leider immer noch der gleiche Fehler. Was ist daran nicht korrekt?

18.01.2012 - 16:37 Uhr

verwendetes Datenbanksystem: MSSQL 2008 R2
Applikation: .Net 4.0 / C#

Gleich zu Beginn die Fehlermeldung: "Es wurde versucht, eine Entität anzufügen oder hinzuzufügen, die nicht neu ist und möglicherweise aus einem anderen DataContext geladen wurde. Dies wird nicht unterstützt."

Wie kommt es dazu?
Ich habe ein Objekt "Buchung" mit einigen relationalen Unterobjekten (Gast, etc.). Wenn ich nun mein Form lade erstelle ich einen neuen DataContext der so lange lebt, so lange das Form existiert. Von diesem DataContext lade ich nun mein Objekt "Buchung".

Wenn ich dieses nun speichern möchte, tritt der Fehler auf. Es ist aber immer noch der gleiche DataContext.

Was ich schon probiert habe:
*) Timestamp Feld in der Datenbank für alle Tabellen angelegt (zwecks Versionskontrolle des Datensatzes)
*) Vor dem Speichern verwerfen des DataContext, neu instanzieren und das Objekt mittel "Attach" dem DataContext anfügen. Hierfür ist beim Laden zu Beginn der Parameter "DeferredLoadingEnabled" auf false zu setzen.

Beide Lösungsansätze habe ich aus Foren. Ich bekomme den Fehler aber immer noch.

Kann mir jemand eine Erklärung oder einen Lösungsansatz dafür geben?

Herzlichen Dank!

17.11.2010 - 13:13 Uhr

So, wieder einen Schritt weiter: durch den Artikel von Dave Midgley war es mir letztendlich möglich an die gewünschten Daten zu kommen: Sie stecken im ReparsePoint Buffer ReparseTarget Objekt. Infos dazu hier.

Das Ergebnis ist ein Array von chars. Sieht dann so aus:


[0x0000009e]	0x0049 'I'	char
[0x0000009f]	0x0064 'd'	char
[0x000000a0]	0x003d '='	char
[0x000000a1]	0x0032 '2'	char
[0x000000a2]	0x0030 '0'	char

Das ist allerdings nur ein kleiner Ausschnitt. Gibt es hier eine elegantere Methode die Werte in einen String zusammenzusetzen als einfach das Array durchzulaufen, die Adresse zu prüfen (z.B. 0x0000009e) und den Werte dann zum Ergebnisstring hinzuzufügen?

Danke

15.11.2010 - 13:19 Uhr

Folgende Informationen habe ich mittlerweile zusammengetragen: Es handelt sich vermutlich um "Reparse Points" vom Typ "Remote Storage Servers". Jetzt muss ich nur noch herausfinden, wie ich die notwendigen Daten auslesen kann 😉

15.11.2010 - 12:53 Uhr

Ich habe im Forum folgenden Artikel gefunden: [Artikel] NTFS Datenströme

Wenn ich nun bei deaktiviertem Archivdienst das File auslesen möchte geht dies ohne Fehlermeldung (EnumerateDataStreams.GetFileStreams(MEINFILE")).

Der Stream hat folgenden Namen: "\0\0\0\0qùÂ߁ý)àr½Ý”›KÃqùÂ߁ý)à\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0מEøh-\f\0Àà". So wird es zumindest im Visual Studio angezeigt.

Die streamId lautet: streamId.streamId = 105825; Für diesen Wert gibt es in der Enumeration jedoch keine Übereinstimmung.

Kann man Metainformationen zu den Streams (wie Name, etc.) verschlüsseln?

Danke
H

15.11.2010 - 11:27 Uhr

das habe ich bereits versucht.

ich kann zwar ein FileInfo Objekt instanzieren, File.OpenText schlägt dann aber fehl.

Wenn ich mir beim FileInfo Objekt die Eigenschaften ansehen so findet sich bei den Attributes:

Attributes = Archive | SparseFile | ReparsePoint

H

15.11.2010 - 10:22 Uhr

Hallo zusammen,

ich stehe momentan bei einem Problem an und bin mir auch nicht sicher ob eine Lösung mit C# / .Net erreicht werden kann.

Wir verwenden eine File-Archivierungslösung. Diese funktioniert dahingehend, dass der Inhalt der Datei in eine SQL DB beschrieben wird und auf der Festplatte nur mehr eine Verknüpfung (keine Windows Verknüpfung!!!) übrigbleibt. Das archivierte File erhält dann das Attribut "O" (für offline).

Wenn man nun das archivierte File wieder öffnet, braucht es dazu den Windows Dienst der Archivierungslösung. Diese erkennt den Zugriff auf den Shortcut und lädt das File aus dem Archiv wieder auf die Festplatte. Diese Dienst muss relativ hoch abgesiedelt sein, da alle Zugriffe über System.IO etc. auch darüber laufen.

Mein Problem ist nun, dass ich den Inhalt der Datei auslesen möchte bevor der Dienst der Archivierungslösung den Zugriff abfängt (ich will den Inhalt der Verknüpfung auslesen). Alternativ wäre es auch möglich den Dienst abzudrehen. Wenn ich letzteres mache und die Datei mittels Streamreader auslesen möchte erhalte ich folgenden Fehler "Diese Datei ist momentan nicht für die Verwendung auf diesem Computer verfügbar.".

Gibt es eine Möglichkeit dieses File direkt von der Festplatte zu lesen? Hat jemand eine Idee dazu?

Kann ich irgendwie analysieren wie dieser Archivierungsdienst funktioniert?

Danke
H

20.06.2010 - 17:02 Uhr

Danke fürs Feedback. Die Grundlagen sind mir im großen und ganzen klar. Ich war mir nur nicht sicher ob mit Silverlight, WPF etc. ev. eine elegantere Lösung möglich ist die mir bis jetzt noch nicht untergekommen ist.

Wir wohl eine JS Lösung werden.

Danke trotzdem.

20.06.2010 - 11:01 Uhr

Hallo,

ich habe folgendes Problem: Ich brauche eine Lösung um auf einer Webseite ein Bild auszutauschen wenn der Server ein neues Bild zu Verfügung stellt. Konkret: Benutzer hat eine Seite im Browser geladen und ein Bild wird angezeigt. In unterschiedlichen Abständen stellt der Server ein neues Bild zu Verfügung das dann sofort im Browser beim Benutzer abgezeigt werden soll. Dies ohne das der Benutzer interagieren muss (Seite neu laden).

Ein AutoRefresh mittels JavaScript alle 2 bis 3 Sekunden scheint mir eine nicht sehr elegante Lösung zu sein. Hat jemand Ideen für eine bessere Lösung`?

Danke
H

25.03.2010 - 21:18 Uhr

Ich habe eine Applikation die als Vorraussetzung Komponenten von einem anderen Hersteller benötigt. Diese werden als Runtime mittels MSI installiert. Jetzt würde ich gerne in mein MSI Paket welches ich mit VS2008 erstelle dieses vorhandene MSI Paket als Vorraussetung integrieren. Wenn mein MSI aufgerufen wird soll automatisch das vorhandene MSI ebenfalls installiert werden (silent mode oder ähnliches).

Kann mir da wer weiterhelfen?
DANKE

20.05.2009 - 16:07 Uhr

Ich habe eine Forms Applikation die Webservices verwendet. Ich habe die Applikation damals in 2.0 geschrieben. Jetzt bin ich dabei sie auf 3.5 sp1 zu portieren. Dabei bin ich folgendes Problem gestoßen und komme nicht weiter:

Ich habe meine Webservices ganz normal als WebService Reference eingetragen. Jetzt kann ich aber auf die Funktionen nicht mehr zugreifen sondern habe für jede Funktion Request und Response Funktionen bzw. eine ...SoapClient Funktion etc.

Hat jemand eine Ahnung weshalb dies so ist? Wie kann ich meine Webservice Funktionen wieder ganz normal aufrufen?

Danke
H

25.02.2009 - 09:21 Uhr

Danke für die Hilfe. Mit OLEDB habe ich es auch schon versucht. Ohne Erfolg. Werde mir wohl einen eigenen Parser schreiben müssen 😦((

Grüße
Honkman

24.02.2009 - 21:50 Uhr

Ich habe eine Windows Applikation die liest ein CSV File in eine DataTable ein. Der Code dafür sieht wie folgt aus:

FileInfo fileInfo = new FileInfo(path);
string connectionString = String.Format("Driver={{Microsoft Text Driver (*.txt; *.csv)}};Dbq={0};", fileInfo.DirectoryName);
OdbcConnection connection = new OdbcConnection(connectionString);
OdbcDataAdapter da = new OdbcDataAdapter(String.Format("select * from [{0}]", fileInfo.Name), connection);
da.Fill(dataTable);

Das hat bis jetzt immer ohne Probleme funktioniert und ist sehr schnell. Jetzt bin ich vor kurzem auf Vista umgestiegen. Dort gehts das nicht mehr. Fast immer wird nur die erste Spalte (Column) importiert, der Rest nicht. Fehler wird auch keiner geworfen.

Führe ich den gleichen Code auf meinem XP Rechner aus, funktioniert er ohne Probleme und das komplette CSV File wird geladen. Unter Vista Ultimate wie gesagt nicht.

Kenn jemand das Problem bzw. eine Lösung darfür?

23.02.2009 - 16:44 Uhr

Danke fürs Feedback.


bindingSourceNsc.EndEdit();

habe ich hinzugefügt. Hat aber nix gebracht.

Die Datenbank ist eine SQL 2005 Exp. Liegt also nicht in der Solution.

Woran könnte es noch liegen?
Danke

PS:
zweisen:

bindingSourceNsc.DataSource = from n in _budgetDataContext.Nscs select n;
bindingSourceNsc.EndEdit();

aktualisieren

_budgetDataContext.SubmitChanges(System.Data.Linq.ConflictMode.FailOnFirstConflict);
23.02.2009 - 16:08 Uhr

Sorry. Natürlich ist das zu ungenau.

Also Fehler wird keiner geworfen. Die Daten in der Datenbank werden jedoch nicht geändert.

Meine Vermutung: Ich lade die Daten direkt mittels LINQ in die BindingSource. Dann bearbeite ich die Daten der BindingSource (im Grid). Die geänderten Daten werden aber nicht an mein LINQ Objekt _budgetDataContext zurückübergeben.

Konkrete Frage: Wie übernehme ich die Daten einer BindingSource eines Grids um diese mittels LINQ zurückzuschreiben?

Danke

23.02.2009 - 15:10 Uhr

verwendetes Datenbanksystem: MS SQL 2005 Exp.

Ich verwende zum ersten mal LINQ zum Lese und Schreiben von Daten. Das lesen funktioniert auch wunderbar einfach. Ich lese die Daten direkt in eine BindingSource von einem Grid.

bindingSourceNsc.DataSource = from n in _budgetDataContext.Nscs select n;

Wenn ich jetzt Daten im Grid ändere, möchte ich, dass die Änderungen in die Datenbank geschrieben werden. Das wollte ich mit folgendem Code erledigen:

_budgetDataContext.SubmitChanges(System.Data.Linq.ConflictMode.FailOnFirstConflict);

Leider funktioniert das nicht. Wahrscheinlich fehlt da noch ein Schritt vor dem SubmitChanges. Kann mir da einer weiterhelfen?

Danke
Honkman

15.10.2008 - 20:56 Uhr

Ok. Das mit dem Deadlock kann ich soweit nachvollziehen.

Ist es möglich, einen Event auszulösen, wenn alle Threads fertig sind? Wenn ja, wie? Wait ist ja dann die falsche Lösung.

Danke

15.10.2008 - 20:07 Uhr

Ich muss aus einem Funktion die ich in einem eigenen Thread aufgerufen habe, einen Progressbar im Hauptformular aktualisieren. Jetzt habe ich mir das mit Invoke etc. durchgelesen und auch so eingebaut. Mein Problem ist, dass ich eine Funktion implementiert habe, die wartet, bis alle Threads abgeschlossen sind. Dies funktioniert aber nur ohne dem Aufruf der Progressbar Aktualisieung. Wenn ich den Progressbar aktualisieren will, werden die Threads nie abgeschlossen.

Hier mein Code:

Funktion zum Aktualisieren:

public void IncrementProgressBar()
        {
            if (progressBarSearch.InvokeRequired)
            {
                progressBarSearch.Invoke(new MethodInvoker(IncrementProgressBar));
                return;
            }
            progressBarSearch.Increment();
        }

Die Funktion, die auf die Threads wartet:

private void WaitAll(WaitHandle[] waitHandles)
        {
            if (Thread.CurrentThread.GetApartmentState() == ApartmentState.STA)
            {
                foreach (WaitHandle myWaitHandle in waitHandles)
                {
                    WaitHandle.WaitAny(new WaitHandle[] { myWaitHandle });
                }
            }
            else
            {
                WaitHandle.WaitAll(waitHandles);
            }
        }

Aufgerufen wird die Funktion IncrementProgressBar aus dem Thread heraus über ein Interface.

Kann mir jemand einen Tipp geben, woran das liegen kann?
Danke

05.10.2008 - 21:53 Uhr

Folgenden Beitrag in einem anderen Forum habe ich gefunden:

http://forums.microsoft.com/MSDN/ShowPost.aspx?PostID=3908205&SiteID=1

Im Prinzip wird dort die These aufgestellt, dass SQL Compact bei zu vielen Anfragen in kurzer Zeit an seine Grenzen stößt und dann Fehler produziert. Wenn das wirklich so ist, habe ich ein ernstes Problem ...

05.10.2008 - 18:31 Uhr

Genau, Threading wird verwendet bzw. tritt das Problem auf seit ich Threading verwende. Es sind momentan 5 parallele Threads die Daten laden und auf die gleiche DB zugreifen bzw. die Connection teilen. Auch wenn ich für jeden Zugriff eine neue Connection erstelle, habe ich das Problem.

05.10.2008 - 10:54 Uhr

Hallo,

ich habe eine recht umfangreiche Applikation die bis jetzt sauber gelaufen ist. Für die Datenhaltung verwende ich die SQL Compact Edition DB. Da mittlerweile einige Daten in den Modulen geladen werden müssen, habe ich begonnen diese in eigenen Threads (also im Hintergund) direkt nach dem Programmstart zu laden. Die Funktionen sind die selben als wenn ich die Daten erst nach Aufforderung lade.

Mein Problem: Ich erhalte immer wieder, nicht immer und nicht reproduzierbar den Fehler: Attempted to read or write protected memory Exception. Der Fehler tritt auf direkt in der Funktion wo ich die Daten lade also den SQL Befehl ausführe.

Hat jemand eine Idee woran das liegen kann? Gezielt reproduzieren kann ich das Problem wie gesagt nicht. Und es tritt nicht immer an der gleichen Stelle auf, aber immer bei der Funktionen die SQL Befehle ausführen.

Ach ja: Ich verwende .Net 2.0.

Danke für die Hilfe

23.09.2008 - 14:33 Uhr

Ich habe ein Form, dem der Benutzer Label Controls hinzufügen kann. Jetzt habe ich auch ein zentrales ToolStrip bzw. ContextMenu. Dieses wird den Label Controls zugewiesen wenn diese hinztugefügt werden.

Mit einem Rechtsklick wird das Menü aufgerufen. Jetzt brauche ich dann aber im Click Event das Label Control welches das ContextMenu aufgerufen hat. Den dort im Tag Objekt habe ich Daten die ich für die weitere Bearbeitung brauche.

Frage: Wie kann ich das Control abfragen welches das ContextMenu aufgerufen hat?

20.09.2008 - 10:26 Uhr

Ich hatte folgenden Fehler nachdem ich meine Webservices überarbietet habe: 'myObject' is an ambiguous reference between 'API.myObject' and 'WebService.myObject' . Es hat mich einige Zeit gekostet den Fehler zu finden obwohl er ziemlich dämlich war. In einigen Foren taucht dieser Fehler auch auf und die Lösungen waren irgendwie nicht immer verständlich. Deswegen hier kurz meine Lösung zusammengefaßt:

Das Grundproblem war, dass ich in den Einstellungen meines Webservice Projektes den Assembly Name geändert habe, die Änderung aber bei den Codefiles der Webservices nicht nachgezogen habe. Der Namespace aller Webservices muss natürlich gleich lauten wie der Assembly Name des Projektes.

That's it.

10.06.2008 - 15:05 Uhr

merci vielmals. das habe ich beim lesen der dokumentation wohl übersehen.

10.06.2008 - 14:57 Uhr

Ist es möglich ein Shell Programm aufzurufen aber nicht das schwarze Shell Fenster anzuzeigen. Leider bietet das Programm das ich verwenden muss keinen "silent mode" oder ähnliches.

Ich rufe das Pogramm mit Diagnostics... auf.

Jemand eine Idee dazu?

Danke

08.06.2008 - 21:34 Uhr

Symantec Enterprise Vault / File Archivierung

08.06.2008 - 17:49 Uhr

Sehr eigenartig. Das habe ich schon befürchtet. Danke erstmal.

08.06.2008 - 17:34 Uhr

Diese Files sind nur ein Link. Eine Software auf unserem Server die als Dienst läuft lädt automatisch das File vom Backup Server wenn man einen Doppelklick auf so ein File macht. Es muss also irgendeine Information in dem File sein, die dieser Software sagt, worauf sie zugreifen muss. Ich weiss auch, das dafür bestimmte IDs verwendet werden. Und genau diese ID muss in dem File irgendwie gespeichert sein.

Die Software ist übrigens Symantec Enterprise Vault.

08.06.2008 - 17:26 Uhr

Sorry. Das File ist nur gezippt größer als ungezippt. Ist aber bei der Größe eh wurscht.

08.06.2008 - 17:17 Uhr

Ich habe Files deren Inhalt ich auslesen muss. Im Grund steht nur eine ID oder Ähnliches drin. Leider kann ich den Inhalt nicht auslesen, da ich das Format nicht kenne. Hat jemand eine Idee wie ich da weiterkomme? Ich habe so ein File als Anhang raufgeladen.

Anmerkung: Wenn ich das File mit Pspad (einem Editor) aufmache, wird kein Inhalt angezeigt. Wenn ich auf Hexadezimalanzeige umschalte, wird mir etwas angezeigt. Kann damit aber nix anfangen.

Kann mir da jemand einen Tip geben?
Danke

PS: Das File in Anhang ist natürlich kein PDF.

<Anhang entfernt. Wenn du die Datei hochladen willst, dann bitte gezippt>