ich muss eine Sicht mit Oracle und EF5 abfragen und habe dabei folgendes Problem.
Es gibt eine Spalte die vom Typ VARCHAR ist und bis auf einen Spezialfall nur Nummern enthält.
Die Sicht ist nicht von mir und ich kann die Sicht leider auch nicht ändern.
Nun muss ich einen Filter hinzufügen, der die Nummern in der Spalte filtert (Nummern > x usw.). Ich habe leider keine Möglichkeit gefunden diesen Cast in SQL zu übersetzen. Es gibt ja diese SqlFunctions, aber leider nicht für Cast. Kennt hier jemand eine Lösung?
SQL selbst zu schreiben wäre die letzte Lösung.
p.s.: Ich bin mir bewusst, dass die Umsetzung der Sicht unsauber ist. Ich habe es aber leider nicht in der Hand.
ich bin auf der Suche nach einem Framework mit folgenden Anforderungen:
Versionisierung von Datenbankänderungen in Changesets
Unterstützung von MSSQL, Oracle
native .Net-Unterstützung - Ausführen der Changesets z.B. beim Hochfahren der Anwendung
Im Java-Umfeld verwenden wir hier Liquibase. Die Changesets werden dabei als Xml beschrieben (Datenbankunabhängig). Der .Net Port von Liquibase ist leider nie wirklich auf einen vernünftigen Stand gekommen.
ja - das betrifft sämtliche Seiten mit colgroup und (html) table {runat=server}. Mir würde es schon helfen, wenn ihr sagt, dass ihr das Problem mit der VS2012-Kombination nicht habt. Dann weiß ich, dass es an der Konfiguration des Projekts liegt. Wir haben hier aber schon mindestens zwei Projekte mit diesem Phänomen.
nachdem ich ein ASP.NET (Webforms) Projekt von VS2010 auf VS2012 umgestellt hab, kommt es zu einem Kompilierfehler:
Error 5 Die beste Übereinstimmung für die überladene System.Web.UI.HtmlControls.HtmlTableRowCollection.Add(System.Web.UI.HtmlControls.HtmlTableRow)-Methode hat einige ungültige Argumente. ...Default.aspx 312
bzw.
Error 6 1-Argument: kann nicht von "System.Web.UI.HtmlControls.HtmlGenericControl" in "System.Web.UI.HtmlControls.HtmlTableRow" konvertiert werden. ...Default.aspx 312
Ich muss leider die Tabelle mit "runat=server" vesehen, da auf diese Tabelle im Code-Behind zu gegriffen wird. Was die Fehlermeldung aussagt ist mir klar. Ich kann mir aber nicht erklären warum das "runat=server" für Ihn ein Problem darstellt. Nach meinem Wissen ist Colgroup auch bei HTML5 erlaubt. Hat jemand eine Lösung für das Problem?
Eine andere Möglichkeit besteht auch darin eine native Excel Lib zu verwenden (z.B. diese). Es muss dann kein Office vorhanden sein und die Lizenzgebühren fallen einmalig an.
Die Datenbanken siehst du, wenn du dich mit der Datenbankinstanz verbindest. Wenn die Datenbank bei dir lokal auf dem Rechner als Dienst läuft sieht das z.B. so aus:
localhost
localhost\sqlexpress
Das mit dem Anlegen der Datenbank aus dem VisualStudio hört sich sehr eigenartig an. Ich denke das geht gar nicht (nur embedded Datenbanken; sdf). Bist du dir da sicher? Wenn du im SQL\Data Ordner nur die master.mdf siehst gibt es die Datenbank wohl auch nicht mehr.
Kannst du dich denn mit dem Benutzer "sa" oder dem lokalen Administrator anmelden?
Ich würde das Ganze mal über das Mangement Studio durchführen.
Im Objekt-Explorer die DB auswählen -> rechte Maustaste-> Tasks -> Online schalten
Hört sich für mich so an, als wenn dein Nutzer nur Rechte in der jetzt offline geschalteten DB hat.
Zitat
Ähnliche Meldung gibt das SQL Server Management Studio, wenn ich die Datenbankdatei (MDF) attachen will.
Warum willst du die DB attachen? Wenn du die DB offline schaltest ist sie noch zugeordnet. Du solltest die DB weiterhin im Mangement Studio sehen (als offline gekennzeichnet).
Du kannst dir vielleicht mal SOAP-UI anschauen. Das hilft ggf. bei diesem Fummelaufgaben. Ansonsten ist es erstmal unverständlich einen SOAP-WS ohne WSDL anzubieten...
Muss es denn ein Rich-Client sein? Überlegt einmal, ob vielleicht auch eine Webanwendung in Betracht kommt. In Zeiten von Smartphones etc. hättest du auch unterwegs z
Zugriff und die Datenabfragen gehen nur zwischen Webserver und Datenbank hin und her.
Das Thema Replikation gerade mit der SQL-Server Replikation ist alles andere als trivial. Hier gilt es einiges zu beachten und vor allem sollte die Datenbankstruktur sehr simpel gehalten werden. Ich würde versuchen mir diese Probleme vom Leib zu halten. Die Replikation wird übrigens auch über UNC-Freigaben durchgeführt...sehr hässlich (ist gibt allerdings auch die bereits angesprochene Möglichkeit über HTTP).
Welche Rückgabewerte hast du denn in deiner Businesslogik? Ich vermute die Ergebnisse sind dann fix und es wird sich nur noch um Anzeige etc. gekümmert. Wenn wir schon bei dem Thema sind würde ich gerne mal wissen, wie du deine Businesslogik organisierst. Ist das ein ViewModel oder hast du eine separate Klassen - "Schicht"?
return a => SqlFunctions.StingConvert((double)a.Nummer) + a.Bezeichnung) == suchwort
Wow nicht schlecht, das wußte ich noch nicht :)
@Abt
Ich denke nicht, dass du mir erklären musst wie sich ToList() etc. auf das generierte SQL auswirkt.
Aber ich versuche meine Bedenken gegenüber dem gepostete Repository noch etwas anders zu erläutern. Was ich auf keinen Fall möchte ist, dass Business-Logik im Sinn von DRY mehrfach im Code steht. Ich habe demnzufolge meine Repositories die mir natürlich auch nur die Datensätze bringen sollen, die benötigt werden. Darüber brauchen wir gar nicht diskutieren.
Was ist deiner Meinung nach die Aufgabe eines Repositories? Ich denke es sollte für den Zugriff auf die Daten konzipiert sein. Mit IQueryable verlagerst du diese Logik in eine tiefere Schicht. Damit kann ich mich irgendwie wirklich schwer anfreunden. Zumal die Methode "GetXy" heißt - aber gar nichts "Gettet".
Das Argument mit dem zurückgeben sämtlicher Spalten finde ich wirklich stark. Lasst mich mal eine Nacht darüber schlafen :)
Ich könnte mich auch damit abfinden IQueryable zu nutzen, aber im Frontend sollte nach meiner derzeitigen Meinung davon nichts mehr zu sehen sein.
class Auftrag{
public int Nummer {get;set;}
public string Bezeichnung{get;set;}
}
Jetzt möchtest du für eine Automcomplete-Box eine Suche in der Datenbank starten. Der Nutzer kann also Nummer und Bezeichnung eingeben. Bei der Suche benötigst du dann den Ausdruck: angebot=>angebot.Nummer+angebot.Bezeichnung == suchwort.
String-Operation ist dann natürlich falsch ausgedrück. Ich hoffe aber du verstehst, was ich meine. Generell versuche ich auf jeden Fall den Wildwuchs mit Rückgabewerten gering zu behalten. Ich würde da lieber noch eine separate Methode hinzufügen. Ich denke schon, dass der Großteil der Repository-Anfragen im Bereich GetXy, GetAllXy liegt. Wenn hier sinnvoll sortierte Listen zurückkommen sollte das für die meisten Fälle passen. So sieht das zumindest bei mir im Umfeld aus.
edit: Meinst du nicht, dass IQueryable dazu verleitet irgendwo im Frontend noch Business-Logik zu implementieren?
Was ich z.B. meine ist, dass du bestimmte String-Operationen nicht ausführen kannst, da IQueryable kein SQL-Pendent kennt. Das führt dann direkt zum Laufzeitfehler.
Wenn ich Performance benötige, erstelle ich lieber eine zweite Methode.
Noch eine Frage zu deinem Repository: Warum gibst du IQueryable zurück und keine Liste? Die Abfrage wird so noch nicht ausgeführt. Einige Operationen sind mit IQueryable auch nicht möglich.
Ich habe mir mal jQuery.dataTables.js. angeschaut. Ich muss dir da wirklich Recht geben. Klappt wunderbar! Danke für den Tipp. Das einzige was auf den ersten Blick bisschen hässlich ist, ist die ungarische Notation bei den Properties.
Also das Feature was ich nutze ist ja nun gerade in MVC3 hereingekommen.
Ich habe schon alle Wege probiert (JQGrid, PlainHTML und jetzt WebGrid). In meinen Szenario ist es leider oft so, dass manchmal zwei Grids oder mehr auf der Seite existieren. Der Kunde möchte dann leider auch das volle Programm (Pageing, Sorting, Rowselect).
Was ich an sich schön finde an einem Grid ist, dass der Code direkt an einer Stelle steht. Wenn ich Plain-Html schreibe muss man schon ziemlich Scrollen.
Mit dem serverseitigen Filtern gebe ich dir recht. Das Feature brauche ich sehr selten.
Ich werde mir mal eine Plain-HTML-Lösung mit den genannten Features anschauen. Ich lass mich ja gerne bekehren :)
also in Plain-HTML würde ich eine colgroup definieren oder dem "<th>"-Tag über eine Klasse oder fast lieber direkt über das style-attribut eine Breite geben.
Warum ich kein Plain-Html-verwende:
- der Code eines Grids sieht nicht gerade leichtgewichtig aus
- kein Paging/Sorting
Eigentlich ist Paging und Sorting mein K.O.-Kriterium. Ich finde ein Framework sollte hierfür eine fertige Lösung haben. Ich würde mir sonst den Controller-Code ziemlich versauen. Vielleicht seh ich das auch völlig falsch. Deine Meinung würde mich dazu interessieren.
in ASP.NET MVC 3 gibt es ja das WebGrid. Ich bin eigentlich auch recht zufrieden bis auf einige Anwendungsfälle:
- Extensionsmethoden können nicht verwendet werden und müssen statisch aufgerufen werden
- Es kann nur der Name der Spalte angegeben werden. Die Spalte kann aber nicht weiter konfiguriert werden
Ich würde nun gern elegant meiner Spalte eine fest breite geben.
ich möchte gerne Daten aus einer Tabelle vom MS SQL-Server mocken. Ich dachte eigentlich ich brauche dafür nur die Bytes kopieren und im Mock einlesen. Kann mir jemand sagen, was ich hier falsch mache?
var geogr = BinaryHelper.GetStringToBytes(@"0xA210000001040B0000008872A2...03")
public class BinaryHelper
{
public static byte[] GetStringToBytes(string value)
{
var shb = SoapHexBinary.Parse(value);
return shb.Value;
}
}
Ich glaube du hast das Problem noch nicht ganz verstanden. Ich versuch es mal anders. Wenn ich ein DataGrid mit 100 Spalten erzeuge, habe ich keine Möglichkeit Horizontal zu schauen welche Spalten vorhanden sind - außer es werden Items eingefügt.
ich habe ein DataGrid, bei dem man über Eingaben des Suchbegriffs in den Spaltenheader eine Filterung durchführen kann. Ich habe leider das Verhalten, dass bei einem leeren Grid kein horizontales Scrolling mehr möglich ist. HorizontalScrollBarVisibility auf "true" zu setzen hat leider keine Auswirkung. Um das Problem noch zu verdeutlichen hänge ich einmal den Beispielcode an:
Man sieht hier, dass nur Column 1-4 sichtbar sind. Dadurch das ich aber ggf. in Spalte 9 meinen Suchbegriff eingegeben habe, gibt es keinen Weg zurück :)
Hat jemand eine Elegante Lösung für dieses Problem?