danke für die Info, aber auch dort sehe ich im kontextmenü schon wieder einchecken / auschecken usw.
Für meine bescheidenen Zwecke ist denke ich die kostenlose Variante für die ich keine Zusatzmodule brauche die bessere Variante.
Ich denke zumindest das ich es auf einen Versuch ankommen lassen werde.
ich möchte ohne mehraufwand einen größeren Nutzen.
D.h. wenn ich ein emuliertes netzlaufwerk habe ändert sich für die nutzer
gar nichts sie arbeiten genau wie bisher im explorer offnen ändern und speichern Dateien.
Sie brauchen sich nicht mit neuen oberflächen auseinanderzusetzten sie brauchen nicht ein- oder auschecken sie kriegen es nicht einmal mit das sich irgendetwas geändert hat.
Trotzdem habe ich automatisch alle Dateien in der DB und versionierung, volltextsuche und alle anderen features eines DMS.
Danke für den Tip Khalid, aber ich glaube bei SharePoint hat man kein Netbios Netzlaufwerk.
ich möchte nicht den bestehenden Fileserver ersetzten.
Was ich möchte ist: Die dateien für die ich die features eines DMS benötige
(Arbeitsanweisungen, Formblätter usw.) in die Datenbank auslagern weil ich über den Fileserver keine automatische versionierung, historienerhaltung, volltextsuche usw. habe. Alle "normalen Dateien" für die diese Features nicht benötigt werden können auf dem bestehenden NTFS fileserver bleiben.
Ach ja als Alternative zu MySQL4 wäre PostgreSQL möglich.
@roeb, welche DB benutzt du dazu?
zur info zunächst werden es bei mir nur ca 3000 Dateien mit einer Durchschnittsgröße von 0,7MB sein.
@BerndFfm: Mit die Datenbank wird größer meinst du größer als gleicher inhalt auf einem Fileserver?
wow, hatte nicht mit einem positiv ausfallendem kommentar gerechnet.
Ich sehe natürlich auch die Vorteile die das bringen könnte, bin aber natürlich genauso an den Nachteilen interessiert, erstmal vielen Dank für deine Meinung.
verwendetes Datenbanksystem: MySQL
Kurze Vorgeschichte:
ich suche gerade ein Open source Dokumentenmanagement System.
In der engeren Auswahl waren: Alfresco, Knowledgetree, Xinco und Agorum core.
Letzteres finde ich für den Zweck für den ich es brauche am passensten.
Jetzt mein Problem / Frage:
Agorum Core emuliert über Netbios eine Art Netzlaufwerk (wie ein Fileserver)
allerdings werden alle Daten / Dateien in einer MySQL 4 Datenbank gespeichert.
D.h. die dort abgespeicherten Dateien sind nur in der Datenbank vorhanden nicht im Dateisystem.
Was haltet Ihr davon? zumal mal nicht sehr oft positives darüber hört wenn leute BLOBs in einer DB speichern.
Aber die Entwickler müssen sich ja was dabei dedacht haben oder?
die eigentliche frage sollte sein wieso du deine daten in excel speicherst.
einen bug im framework schließ ich mal aus da ich mit dem datareader und odbc
auch schon mal daten aus excel eingelesen hab (allerdings ein bischen anders
als du, code siehe unten) .
was für daten sind denn das und was möchtest du damit anstellen?
OOP2_config config = new OOP2_config();
string connectionStringExcel = "Driver={Microsoft Excel Driver (*.xls)};driverid=790;dbq="
+ config.ExcelFilePath;
OdbcConnection excelConnetion = new OdbcConnection(connectionStringExcel);
OdbcCommand excelCommand = new OdbcCommand("SELECT date, resource, quantity FROM [Tabelle1$]", excelConnetion);
try
{
excelConnetion.Open();
}
catch (Exception openExcelException)
{
MessageBox.Show("Error: Could not open Excel file: " +
config.ExcelFilePath + ". " +
openExcelException.Message);
return;
}
OdbcDataReader ExcelDr = excelCommand.ExecuteReader();
//Create Datatable to store the data from excel spreadsheet
DataTable dt = new DataTable();
dt.Columns.Add("date");
dt.Columns.Add("resource");
dt.Columns.Add("quantity");
dt.Columns.Add("pmtype");
dt.Columns.Add("pmname");
try
{
while (ExcelDr.Read())
{
try
{
while (ExcelDr.IsDBNull(0) == false)
{
string date = ExcelDr.GetDate(0).ToString();
string resource = ExcelDr.GetValue(1).ToString();
string quantity = ExcelDr.GetValue(2).ToString();
string[] array = new string[5];
array[0] = date;
array[1] = resource;
array[2] = quantity;
dt.Rows.Add(array);
break;
}
}
catch (Exception dataToDataTableException)
{
MessageBox.Show("Error: Could not read from file. " + dataToDataTableException.Message);
}
}
}
catch (Exception ExcelReadException)
{
MessageBox.Show("Error: Could not read: " +
config.ExcelFilePath + ". " +
ExcelReadException.Message);
}
finally
{
excelConnetion.Close();
}
ich halte das auch für absoluten schwachsinn, soweit ich weiss funktioniert das auch nur für die windows anmeldung also ist damit nur windows geschützt wenn ich an die daten will legt man halt eben ne knopppix cd ein oder nicht? in dem fall bringt natürlich auch kein noch so gutes passwort etwas
ich glaube (hoffe) in diesem forum geht es nicht um den wettkampf über die meisten antworten, ausserdem hat die quantität nichts mit der qualität der beiträge zu tun.
wie wärs mit ner schleife und einem gridview pro gruppe?
bzw. bei gridviewguy wurde das schonmal behandelt allerdings für webform
aber vielleicht hilfts
mach doch
string message = "Speichern erfolgreich";
try
{
con.Open();
cmd.executeNonQuery();
}
catch(Exception e)
{
message = e.message;
}
finally
{
con.Close();
MessageBox.Show(message);
}
dann mach doch einfach select max(id) from .....
result + 1
code debuggen um rauszufinden wo die unbehandelte exception auftritt und
die methode die den fehler verursacht mit try catch block behandeln
Frage: warum willst du die id selber festlegen wenn du eh die nächst höhere suchst, dafür gibt es doch primary keys und autoincrement.
und wie ihr sichert...
start -> einstellungen -> systemsteuerung -> verwaltung -> ereignisanzeige
rechte maustaste auf anwendungsprotokoll -> eigenschaften
dort kannst du die max größe einstellen, und verschiedene einstellungen zum überschreiben festlegen.
ob deine anwendung ins ereignisprotokoll schreibt oder nicht legst du doch selbst fest oder nicht. Alternativ kannst du das ereignisprotokoll ja auf overwrite stellen dann werden die ältesten einträge beim erreichen der max größe mit neuen überschrieben.
wenn du generell zuviele log einträge hast dann konfigurier deine anwendung doch so das nur error oder warnings geschrieben werden und infos nicht.....
du teilst dem smptclient object ja auch nicht mit welcher der host ist
in etwa so
System.Net.Mail.SmtpClient smtp = new System.Net.Mail.SmtpClient("Srv-wdev04");
//edit: zu spät
mit dem parameter in der methode erstellts du kein neues lv.
du offnest die methode nur für ein object vom typ lv welches du dann
an die methode übergibst und veränderst.
PS. Was ist eigentlich eine WGR-Tabelle? Ich kenne nicht alle Abkürzungen.
FROM WGR A
kuck dir mal die produkte von dundas an, hab ich auch im einsatz, die genauen features findest du auf der webseite. ist auch nicht so teuer ich glaub so um die 400€
klingt einleuchtend herbivore, die frage ist ob sich dann nicht ein dictionary anbietet aber das hängt wohl von der verwendung des ganzen ab.
probier ma public void zeichne(int[] ln)
wenn du die möglichkeit hast dich zu einer iSeries zu verbinden kannst du auch per telnet damit arbeiten, aber pc5250 emulator ist schon komfortabler
und
Clipboard.SetDataObject(
this.dataGridView1.GetClipboardContent());
funktioniert nicht?
also ich glaube das das ganze mit manuellem code schreibe wesentlich schneller geht als mit dem assistenten.
das sind doch wirklich nur ein paar zeilen code:
entweder mit dem mysql for .net treiber http://dev.mysql.com/downloads/connector/net/1.0.html
oder per odbc (was nicht unbedingt empfehlenswert ist, langsamer)
hier trotzdem für ein bsp. per odbc (abfrage):
mit dem mysql connector gehts genauso nur die objektnamen sind anders
z.b. statt OdbcConnection dann MySqlConnetion
using System.Data.Odbc;
string conStr = deinConnnectionString;
OdbcConnection odbcConnection = new OdbcConnection(conStr);
string cmdTxt = @"Select ..... from .....";
OdbcCommand odbcCommand = new OdbcCommand(cmdTxt, odbcConnection);
OdbcDataAdapter odbcDataAdapter = new OdbcDataAdapter(odbcCommand);
odbcConnection.Open();
DataTable dt = new Datatable();
odbcDataAdapter.Fill(dt);
odbcConnection.Close();
thats it
ich glaube bei access: where year(xy) between ....
du kannst doch alle diese einstellungen im report vornehmen.
also ich würde entweder schon in der abfrage dafür sogen das in der besagten spalten
string zurückgegeben werden
etwa so
select ' ' + deine spalte + ' ' .....
oder einen cast beim abfragen (syntax hängt natürlich von deiner DB ab)
z.B select cast(deine spalte as varchar)..
oder mit bedingung select ifnull(deinespalte, ' ')....
oder die datentypen des datatables das du befüllt vor dem füllen festlegen
//Create new Table and give it a Name
DataTable dt = new DataTable("mytable");
//Add your colums
DataColumn Column1 = new DataColumn();
Column1.DataType = System.Type.GetType("System.String");
Column1.ColumnName = "1";
Column1.DefaultValue = "";
dt.Columns.Add(Column1);
....
wie weist du dem report den die datasource zu?
ich persönlich finde das hier ganz nett
http://www.codeproject.com/KB/custom-controls/asppopup.aspx
kuck dir ma den row state deiner zeile an, ein update mit dem cmdbuilder funktioniert nur wenn der status added oder changed ist.
ansonsten schreib mal vor dem füllen also vor adapter.fill
adapter.acceptchangesduringfill = false;
damit haben auf jeden fall alles rows den status added.
Vieleicht helfen dir die stichworte OPC oder wago controller
Wenn es dir um versionierung geht solltest du dir aml tortoise CVS ankucken.
(Open source)
http://www.tortoisecvs.org/
deinstring = deinstring.Replace(" ","#");
" ' " + string + " ' " mal probiert?
Wer einmal wichtige Daten bzw die Arbeit von Tagen Wochen Monaten verloren hat weiß wie wichtig regelmäßige backups sind.
Code wird bei mir auf dem CVS Server eingechecked welcher jede Nacht auf dem Backup Server gesichert wird und vom Backup Server 1x die Woche auf Tape.
select nvl(deinFeld, 'deinersatzwertwennnull')
hast du das
nvl(check_expression, replacement_value)
mal probiert?
das ist eigentlich genau dafür gedacht
in der select anweisung select ifnull(tabellenfeld,'') einsetzten
hab noch was für oracle gefunden
Zitat:
Oracle NVL Usage
nvl(check_expression, replacement_value)
T-SQL ISNULL Usage
ISNULL ( check_expression , replacement_value )
In both cases the function will return the replacement_value if check_expression is NULL otherwise they will return check_expression. Note that replacement_value needs to be of the same type as check_expression. You can't give the user back an orange when they ask for an apple so to speak!
Auf der Arbeit
P4 3 Ghz
2 GB Ram
40 GB Festplatte (lokal)
W2KSP4 und VS2005 Prof.
2x 17 Zoll TFT
zu haus
X2 5200
2 GB Ram
80 GB HD Win XP Prof.
250 GB Daten
80 GB Ubuntu 7
2x 17 Zoll Röhre
Auf beiden bin ich mit der performance zufrieden.
Ich denke auch das man nicht am Ram sparen sollte, gerade wenn du in erwägung
ziehst mit vista als OS zu arbeiten und / oder dazu tendierst viele anwendungen
auf einmal geöffnet zu haben.
Zwei Monitore ab 17 Zoll kann ich auch nur empfehlen.
kannst du mal bitte einen screenshot von deinem dataset visualizer posten.
ich glaube wir reden aneinander vorbei.
wenn du in der zieltabelle in der sql db eine tabelle hast mit einer spalte id vom typ autoincrementer wird die db beim einfügen neuer datensätze diese spalte per autoinc. füllen. d.h du brauchtst (bzw solltest) diese spalte nicht abfragen, nicht ins dataset schreiben und auch nicht updaten.
Desweitern hast du per row ids im dataset bzw datatable sowieso primary keys die du nicht sieht die VS aber automatisch vergibt.
hast du denn überhaupt einen primary key in der ziel tabelle und wenn ja ist das ein autoinkrement?
soweit ich weiß sollte man diesen key dann nicht angeben da die datenbank das erledigt.
davon abgesehen, wie ich vorher schon beschrieben habe müssen die rows die upgedated (um beim denglisch zu bleiben) den status changed oder added haben.
Das erreichst du indem du die eigenschaft des adapters !vor! dem füllen auf accept changesduringfill = false setzt desweiteren solltest du das acceptchanges() weglassen den daducht wird der row status wieder geändert und der command builder wird kein update für diese rows durchführen.
ich glaub ich hab deine frage beim ersten mal nicht verstanden, ich dachte du wolltest ein update der csv daten in eine sql db machen. aber gut.
wenn die zwei identisch aufgebaute datasets zusammenführen möchtest kannst du doch auch in einer schleife
die rows von ds1 an ds2 anhängen.
fantasie code:
for each (row myRow in ds1 rows)
{
ds2.rows.add(myRow);
}
dataset mit daten aus csv füllen, connection und cmd vom adapter auf den von der sql quelle ändern und dann adapter. update()
ich hatte das problem mal um daten von einer db2 nach mysql zu bekommen
das kannst du genauso machen, wichtig ist nur das die spaltennamen in den beiden tabellen bzw die spaltennamen in deiner sqt tabelle so heissen wie die columns im dataset.
siehe
Dataset Inhalte in Tabelle in Datenbank schreiben
ach ja diese stelle ist sehr wichtig
myodbcDataAdapter.AcceptChangesDuringFill = false;
damit haben alle rows im dataset den status added und werden somit beim
update command auch mit erfasst.
Netzlaufwerk verbinden ist hier glaub ich das stichwort, das kannst du relativ einfach mit einer bat datei machen.
müsste ungefähr so funktionieren
net use laufwerksbuchstabe: \computername\c$ /user:computername\uid pwd