oh ja, bei sowas bin ich sehr ungeduldig 😃
im setup war 3.5 und ich habe bis einschließlich 4 alles installiert.
habe mal die Visual Studio CD rein gelegt. Der meckerte gleich rum, von wegen Installation fehlerhaft...
Hoffe, dass es daran liegt.
Reparatur ging allerdings auch nicht.
Habe jetzt erstmal eine VMWare mit Windows7 32 bit (statt 64 bit) aufgesetzt. Teste dort grade, ob die installation sauber durchläuft und wenn, dass Projekt dort einfügen kann. Also das Setup Projekt.
Das ist ein Sch... mit sowas musste ich mich bisher noch nie rumärgern, deswegen bin ich auch so ungeduldig 😃
niemand eine Idee?
Hallo Leute,
ich habe einen Windows Dienst geschrieben.
Nun wollte ich diesem ein Setup Projekt hinzufügen. Dies habe ich gemacht wie immer.
Windows-Dienst Installer hinzugefügt.
Konfigurationen für serviceProcessInstaller und serviceInstaller hinzugefügt.
Dann habe ich das Projekt neu erstellt.
Dann habe ich ein Setup Projekt hinzugefügt.
Sage dann "Projektausgabe hinzufügen"
Projekt ausgewählt und Primäre Ausgabe.
Sage ich dann ok, schreibt er mir immer:
"Der Vorgang konnte nicht abgeschlossen werden. Bibliothek nicht registriert."
Um welche Bibliothek handelt es sich?
Oder reicht es wenn ich aus dem Objektkatalog irgendwas bestimmtes hinzufüge?
Habe das schon so häufig gemacht, aber seitdem ich den neuen Rechner mit Visual Studio 2010 habe, bekomme ich diese Meldung.
Ich bin für jeden Tip dankbar. 😃
Gruß Loewchen
Hi,
ist return value immer der rückgabewert, der angibt, ob die Prozedur "ohne" Fehler gelaufen ist, bzw. einen Fehlercode zurück gibt?
Gruß Loewchen
PS.: ist meine erste Prozedur die ich schreibe
Nun bekomme ich schon den Rückgabewert als Varchar, aber ich bekomme außerdem immer noch einen int.
Meine Prozedur sieht nun so aus:
ALTER PROCEDURE [dbo].[TestCase] ( @Text VARCHAR(50), @Laenge INT, @EndErgebnis varchar(50) output)
AS
DECLARE @Zahl INT
DECLARE @Ergebnis VARCHAR(50)
DECLARE @Zeichen VARCHAR(50)
SET @Zahl = 1
SET @Ergebnis = ''
SET @EndErgebnis = ''
SET @Zeichen = ''
WHILE (@Zahl <=@Laenge)
BEGIN
SET @Zeichen = SUBSTRING(@text, @Zahl, 1)
SELECT
@Zeichen = CASE
WHEN @Zeichen = '0' THEN 'null'
WHEN @Zeichen = '1' THEN 'eins'
WHEN @Zeichen = '2' THEN 'zwei'
WHEN @Zeichen = '3' THEN 'drei'
WHEN @Zeichen = '4' THEN 'vier'
WHEN @Zeichen = '5' THEN 'fünf'
WHEN @Zeichen = '6' THEN 'sechs'
WHEN @Zeichen = '7' THEN 'sieben'
WHEN @Zeichen = '8' THEN 'acht'
WHEN @Zeichen = '9' THEN 'neun'
else
'blub'
END
SET @EndErgebnis = @EndErgebnis + '-' + @Zeichen
SET @Zahl = @Zahl + 1
END
wenn ich 173 übergebe, bekomme ich eins-sieben-drei zurück, aber außerdem auch noch die 0.
Was muss ich noch ändern, damit ich die 0 nicht mehr zurück bekomme?
Gruß Loewchen
Hi Leute,
ich habe ein Programm geschrieben, welches auch wunderbar funktioniert. Macht verschiedene Eingaben und Änderungen in einem SQL Server. Des Weiteren habe ich dort einen Trigger und eine Prozedur laufen. So Weit so gut. Das einzige Problem dass ich noch habe ist, dass meine Prozedur einen Fehler schmeißt.
dazu folgendes:
Ich möchte dass meine Prozedur aus der 173 eine eins sieben drei macht.
Also: Prozedur Übergabewert: 173
Rückgabe Wert: eins sieben drei
Doch wenn ich die Prozedur aufrufe dann kommt immer die Fehlermeldung:
Meldung 245, Ebene 16, Status 1, Prozedur TestCase, Zeile 39
Fehler beim Konvertieren des varchar-Werts '-eins-sieben-drei' in den int-Datentyp.
Wie rufe ich die Prozedur auf:
DECLARE @return_value varchar(50)
EXEC @return_value = [dbo].[TestCase]
@Text = N'173',
@Laenge = 3
SELECT 'Return Value' = @return_value
Wie sieht meine Prozedur aus:
CREATE PROCEDURE [dbo].[TestCase] ( @Text VARCHAR(50), @Laenge INT)
AS
DECLARE @EndErgebnis VARCHAR(50)
DECLARE @Zahl INT
DECLARE @Ergebnis VARCHAR(50)
DECLARE @Zeichen VARCHAR(50)
SET @Zahl = 1
SET @Ergebnis = ''
SET @EndErgebnis = ''
SET @Zeichen = ''
WHILE (@Zahl <=@Laenge)
BEGIN
SET @Zeichen = SUBSTRING(@text, @Zahl, 1)
SELECT
@Zeichen = CASE
WHEN @Zeichen = '0' THEN 'null'
WHEN @Zeichen = '1' THEN 'eins'
WHEN @Zeichen = '2' THEN 'zwei'
WHEN @Zeichen = '3' THEN 'drei'
WHEN @Zeichen = '4' THEN 'vier'
WHEN @Zeichen = '5' THEN 'fünf'
WHEN @Zeichen = '6' THEN 'sechs'
WHEN @Zeichen = '7' THEN 'sieben'
WHEN @Zeichen = '8' THEN 'acht'
WHEN @Zeichen = '9' THEN 'neun'
else
'blub'
END
SET @EndErgebnis = @EndErgebnis + '-' + @Zeichen
SET @Zahl = @Zahl + 1
END
RETURN @EndErgebnis
GO
Hi Leute,
ich verwende den SQL Server 2008 und Visual Studio 2008.
Ich habe zwei Fremdprogramme mit einer Datenbank im Hintergrund aus denen ich Daten übernehmen möchte.
Beim schreiben in eine Tabelle kommt die schöne fehlermeldung Binärdaten würden abgeschnitten. Ich habe geguckt, kann aber nicht feststellen, an welchem Datensatz das liegt.
Nun meine Frage:
Gibt es nicht eine Möglichkeit mit einer Option festzusetzen, dass alles was zu lang ist einfach nicht übertragen wird oder hart abgeschnitten wird?
Ich arbeite mit DataSets.
Source und Destination. die Destination schreibe ich dann einfach zurück mit:
DataAdapter.Update(Des);
Vielen Dank für Eure Anregungen.
LG Loewchen.
Lösung gefunden.
Ich habe im SQL Server den anderen als Sysserver hinzugefügt und kann nun mit folgendem Statement arbeiten:
update ADDRESSES
set SYMBOL0 = 'gelöscht'
FROM dbo.ADDRESSES LEFT OUTER JOIN
[olaf].[DBname].dbo.unter_adressen as b ON dbo.ADDRESSES.TEXT13 = b.ansprechpartner_id
WHERE (b.ansprechpartner_id IS NULL) AND (NOT (dbo.ADDRESSES.TEXT18 IS NULL))
Funktioniert einwandfrei.
Auch delete geht so. 😃
Bin also glücklich.
Hi,
ich habe ein Problem mit einem SQL Statement.
Ich habe mir eine Klasse geschrieben mit welcher ich Statements absetze. Alles wunderbar. nun habe ich an einer Stelle ein Problem:
Ich möchte ein Join über zwei tabellen ausführen. Das Statement sieht so aus:
delete from addresses
FROM dbo.ADDRESSES LEFT OUTER JOIN
dbo.cobra_adressen ON dbo.ADDRESSES.TEXT13 = dbo.cobra_adressen.ansprechpartner_id
WHERE (dbo.cobra_adressen.ansprechpartner_id IS NULL) AND (NOT (dbo.ADDRESSES.TEXT18 IS NULL))
nun liegt aber die Tabelle unter_adressen nicht nur in einer anderen Datenbank, sondern auch auf einem anderen Server?
Wie kann ich das Problem lösen?
Kann ich das ändern, indem ich einfach das SQL Statement umschreibe?
Geht das überhaupt über zwei verschiedene Datenbanken?
Wie kann ich das Problem sonst per Quellcode umgehen?
Ich bin für alle Ideen und Ratschläge offen.
Loewchen
Den Tiemout habe ich hochgesetzt. Schmeiße den Profiler gleich mit an, das ist eine gute Idee und dann lass ich das ganze mal unangetastet laufen. Wenn er fertig ist werte ich die Ergebnisse aus. Hoffe das bringt es.
Heißt dass, das SQLLinq nicht zu empfehlen ist für Massentransaktionen?
Meine update Statements beziehen sich lediglich auf Textspalten (varchar(50) (manchmal auch 255)) und es werden aus zwei beteits vorhanden Spalten, ebenfalls varchar, die Texte miteinander verknüpft. Hat was mit der Anzeige in der GUI zu tun. Es fehlt auch kein Index.
@FZelle:
Transaction nicht vergessen? Kannst Du mir mal auf die Sprünge helfen? Weis nicht worauf Du hinaus willst.
Hi Flo,
Das war nur ein Beispiel.
Ich hole mir Daten vom Server zum Client, speicher Sie dann in einem Dataset. Das bearbeite ich dann solange, bis es meinen "Wunschvorstellungen" entspricht, das schreibe ich dann zurück. Dabei habe ich ein "einfaches" Select Statement wie
Select Spalte1. Spalte2, Spalte3, Spalte4 ... from Tabelle1.
Ich arbeite noch nicht mit SQLinq in diesem Windows Dienst. Das gab es damals noch nicht als ich den Dienst geschrieben habe. Ich arbeite mit SQLCommand & Co. Alles was halt dazugehört.
Nachdem ich die Daten rüber geschoben habe, gehe ich dann halt nochmal mit Update Statements rüber wie zum Beispiel das von mir am Anfang geschriebene. Ich weis, es ist nicht schick, aber halt auch historisch gewachsen. Solche Statments schicke ich dann nacheinander mehrere rüber. Meiner Meinung nach, sollte das auch alles zu lasten des Servers gehen und nichts mit der Leitung zu tun haben und die IT sagt, dass der Server nicht ausgelastet ist.
Stimmt auch, die CPU Last geht auf maximal 50% Auslastung hoch, was aber auch daran liegen kann, dass es ein 2 Prozessor System ist und nicht beide mit einbezogen werden. Alles nicht so schön. An der Datenmenge sollte es eigentlich auch nicht liegen. Tja. Ich habe keine Idee, wie ich das sonst beschleunigen soll. Aber die Command Timeouts kann ich hochsetzen. Hauptsache ich lege den Server nicht Lahm 😉
Für weitere Ideen stehe ich jederzeit offen, so lange ich nicht mein Programm komplett umstricken soll.
Hi Leute,
ich habe einen Windows Dienst geschrieben welcher in regelmäßigen Intervallen Daten ließt, konvertiert und dann in eine SQL Datenbank schreibt. Dabei tritt es immer mal wieder auf, dass ich Timeouts erhalte. das Problem dabei ist, dass inzwischen eine solche Datenmenge übertragen wird, dass die Statements einfach eine gewisse Zeit brauchen. Ich habe Sie inzwischen schon optimiert und alles. Bei mir auf meinem Testsystem funktioniert auch alles einwandfrei auch mit großen Datenmengen. Sobald ich das ganze aber auf dem Server einspiele bekomme ich immer wieder Timeout Exceptions vom SQl Server. das ist natürlich ziemlich blöd und ich weis nicht was ich noch verändern kann.
Timeouts am SQL Server hochsetzen? Ist das Sinnvoll?
Es gibt zum Beispiel ein Update Statment, welches ich nachdem ich die Daten in die Tabelle eingefügt habe rüber laufen lasse. dieses Statement macht nichts weiter als einen Feldinhalt je Zeile zu setzen. Also es sieht so aus:
Update AP_Plan set Key_View = '050-' + Key_Number where (Key_View is null);
Da ich je Intervall um die 10.000 Datensätze in diese Tabelle importiere werden auch genausoviel Datensätze aktualisiert. Führe ich das Statement auf dem Server direkt aus dauert es um die 1,5 Sekunden. Da ich das Statement aber von einem anderen Server aus ausführe, dauert es teilweise 32 Sekunden. Das Netzwerk ist sonst super schnell, ich habe keine Ahnung, warum das so lange dauert.
Vielleicht hat diese Frage hier auch nichts zu suchen, aber ich weis nicht wo hin sonst damit.
Vielen Dank für jede Idee die Ihr habt.
LG Loewchen
Interessant,
das kannte ich noch nicht. Werde mir das mal anschauen und gegebenenfalls mit gegenfragen wieder kommen.
Hi Leute,
ich habe da ein Problem entdeckt. Habe einen Windows Dienst, welcher schon seit einem guten Jahr läuft für Windows 7 getestet. Und siehe da. Es treten haufenweise Fehler auf.
Dazu näheres. Ich habe in meiner Config Datei, SQL Statements stehen. In diesen Statements kommen <> und < vor. Also habe ich diese ersetzt durch <> und <. Funktioniert ja auch unter den bisherigen Betriebssystemen, aber nicht so Windows 7. Dort wandelt er diese nicht wieder automatisch in <> und < um, sondern gibt eine Fehlermeldung aus. So ein sch... wie kann ich das umgehen, damit ich das auch unter Windows7 laufen lassen kann und tritt dies auch noch unter anderen Betriebssystemen auf? Vielen Dank für Eure Hilfe im voraus.
LG Loewchen
Hi Leute,
habe ein kleines tool mit dem ich etikettenbedrucken möchte. Dazu lesen ich Daten aus einer Datenbank. So weit so gut. Alles funktioniert. Das einzige womit ich Probleme habe ist rtf. Ich habe ein Feld in dem die Werte wie folgt aussehen:
{\rtf1\ansi\ansicpg1252\deff0\deflang1031{\fonttbl{\f0\fnil\fcharset0 Arial;}}
{\colortbl ;\red0\green0\blue0;}
{*\generator Msftedit 5.41.15.1507;}\viewkind4\uc1\pard\cf1\fs20 Shipping and handling\par
}
interessieren tut mich aber nur der Text. also in diesem Fall:
Shipping and handling
Hand jemand eine Idee, wie man rtf in Text umwandeln kann? Ich meine damit nicht den Text aus dem Text raus schneiden. Das ist momentan meine "Notlösung"
Loewchen
Hi,
war ein sehr guter Tip. Bin noch dabei die Feinheiten herauszukitzeln, aber an sich funktioniert es wunderbar 😃
Vielen Dank!
Loewchen
Hi Leute,
gibt es eine Möglichkeit Textfelder oder MErgefelder in Wordvorlagen per Code zu füllen? Wenn ja wo finde ich zu diesem Thema Informationen. Da ich nicht genau weis, wonach ich suchen soll, finde ich nicht wirklich was.
Loewchen
Hallo Tom,
habe mich mit dem Thema befasst. Du hast Recht der Aufwand ist um einiges höher, aber wenn man das in eine Klasse auslagert, dann macht man die Arbeit nur einmal. 😉. Wenn ich es gemacht habe und Du Dich dafür interessierst, dann kann ich es Dir ja schicken.
Loewchen
Hi,
also die beiden Links sind sehr interessant. Mit dem neu erlangten Wissen werde ich mal ein wenig rumspielen. Allerdings erstmal in einem neuen Projekt. Mal sehen in wie weit ich das für meine Zwecke gebrauchen kann.
@Tom:
grundsätzlich gebe ich dir Recht. Allerdings hilft mir das in meinem Fall nciht wirklich weiter. die Schnittstelle, die ich gebaut habe, versucht grundlegend Datensätze zu aktualisieren. Doch bei einigen tabellen kann ich dies nicht tun, da ich keinen Punkt habe, der für mich eine eindeutige Erkennung des Datensatzes gibt. Das liegt daran, das ich zwischen zwei Produkten "repliziere" die sich überhaupt nicht kennen und auf komplett unterschiedliche Art und Weise Ihre Daten verwalten. Lange Rede kurzer Sinn. Ich habe daher bei einigen Tabellen nur die Möglichkeit die Tabelle komplett zu löschen und die Daten aus der Quelle neu aufzuarbeiten und komplett neu rüber schieben. Grundsätzlich funktioniert das auch immer wunderbar. Das einzige was stört ist, dass ich gerne alle 5 Minuten transferieren möchte. Doch die Delete Statements benötigen viel zu viel Zeit mit der Protokollierung. Daher habe ich mich für Truncate Table entschieden. Da wußte ich aber noch nicht, dass die Zieldatenbank, zu einem späteren Zeitpunkt in eine SQL Server Replikation eingebunden werden würde. Nun ja. Da musste ich wohl oder übel wieder auf Delete zurückgreifen. Ich werde das auf jedenfall im Auge haben. Ach ja und replikation stoppen und hinterher wieder starten kommt natürlich nicht in Frage. Da können ja imense Datenverluste bei entstehen. Das will ich natürlich nicht. Vielleicht finde ich ja irgendwann mal Informationen dazu, oder Microsoft bietet hierfür eine Lösung an.
Ach ja und zu dem Update Statement. Ganz blöde. Habe in dem Select Statement doch tatsächlich eine Spalte doppelt drin gehabt. Dann meckert er natürlich rum. Wenn Du in einem Update mit Set 2 gleiche Spalten verändern willst und dann auch noch mit zwei verschiedenen Werten. Das mag er halt nicht (blush)
Ansonsten funktioniert jetzt alles. Nur der Dienst braucht dreimal so lange wie zuvor (Nur wegen Delete 😭 )
Loewchen
Hallo,
@ Tom, ja du hast recht. Jetzt weis ich woran es liegt und kann es beheben. Aber gibt es denn keine Möglichkeit trotzdem Truncate zu verwenden? Kann ich die Daten nicht vorher irgendwie frei geben? Denn ein absetzen eines Delete Statements dauert im Verhältnis zum Truncate viel länger. Ich lösche 15 Tabellen mit zig tausenden von Datensätzen. Daher wäre es mir lieber, hierfür beim TRUNCATE zu bleiben. Vielleicht habt Ihr hier noch eine Idee.
@ LastGentleman, ja das using habe ich noch nicht überall eingebaut, da hast du recht, dispose kenn ich nicht... muss ich mich erstmal "schlaulesen" 😃 aber danke für den Tip. Als Frage dazu. Momentan arbeite ich immer mit conn.open und conn.close. Ich war immer der Meinung, dass bei einem close die Daten sowieso wieder freigegeben werden. Oder ist das nicht sauber?
Loewchen
Man ist das Konfus...
ich habe das ganze auf meinem Rechner (XP Prof und SQL Server 2005 laufen lassen. Beide Datenbanken vorher gesichert und bei mir zurückgespielt. Die gleiche Konfiguration genommen (also nur Servername, Passwort angepasst). läuft. Bei denen den Dienst mal auf den SQL Server selber installiert. laufen lassen. Keine Fehler. Doch Insert funktioniert nicht.
Löschen der Tabellen mit Truncate. Das ist allerdings sehr interessant. Mit Truncate ist folgendes passiert:
Fehlermeldung:
Tabelle kann nicht abgeschnitten werden, da Sie für die Replikation veröffentlicht oder für 'Change Data Capture' aktiviert ist.
ABER: mit SQL Server 2005 funktioniert das ganze. Obwohl identisch (also auch mit Repli)
Gleiche Tabelle mit DELETE funktioniert einwandfrei.
Merkwürdig oder?
Ist das was besonderes von SQL Server 2008? Oder kann man das mit einer Konfiguration ändern? Habe vor kurzem alles auf TRUNCATE geändert, weil das schneller ging. Nun kann ich wieder alles umkehren!? Lieber wäre mir eine Konfigurationsanpassung.
Ist das vielleicht auch der Grund warum Update nicht funktioniert? Obwohl ich da ja nicht wirklich Einfluß drauf habe, da das Update Statement ja nicht von mir erzeugt wird sondern über den CommandBuilder.
*seufz* naja. zumindest kommen wir hier der Sache schon ein ganzes Stück näher.
Loewchen
Hi,
also ich habe den Dienst nun auf einem 32 bit System installiert. Auf einer VMWare sozusagen. Dort läuft der Dienst ohne Fehler durch. Also ich bekomme keinerlei Exception.
ABER:
Die Daten werden auch nicht übertragen. Ich habe keine Idee warum. Die Felder in die ich etwas hineinschreibe werden einfach nicht aktualisiert und neue Daten werden auch nicht angelegt. Aber wie gesagt, ich bekomme keinerlei Exceptions. Im Profiler stehen keine Fehlermeldung drin. Ich verstehe nicht, warum hier nichts transferiert wird. Kann mir irgendjemand Tipps geben?
Loewchen
Ja da steht was drin.
Kryptisch aber auf die Schnittstelle bezogen und dann bricht sie auch ab.
Den Link schau ich mir mal an.
Bisher war das so, das TRUNCATE TABLE auch funktionierte wenn andere in den Daten drin waren. Da das Programm sich die Daten nur holt, aber nichts drin ändert.
Ich verzweifel hier grade...
Das mit dem ausführen der Statements auf verschiedenen Maschinen habe ich schon gemacht. Ich bekomme Ausführungszeiten von 1 Sekunde bis 7 Sekunden... Jenachdem ob es ein Server oder Client ist.
Aber ich habe eben einen Anruf bekommen von jemand anderen, der auch solch eine Schnittstelle im Einsatz hat. Die arbeiten nicht mit 64 bit Systemen aber haben grade umgestellt auf den SQL Server 2008. Dort ist es genau ersichtlich wo es hängen bleibt. Nämlich beim löschen der Tabellen.
for (int y = 0; y < Additional.Length; y++)
{
Delete = SQLClass.RunSqlStatement(DesConStr, "TRUNCATE TABLE " + Additional[y].ToString() + "");
}
Die Funktion der Klasse sieht so aus
static public Boolean RunSqlStatement(String ConStr, String SqlStr)
{
Boolean ReturnValue = false;
SqlConnection Conn = new SqlConnection(ConStr);
SqlCommand Cmd = new SqlCommand(SqlStr, Conn);
try
{
Conn.Open();
Cmd.ExecuteNonQuery();
ReturnValue = true;
}
catch
{
ReturnValue = false;
}
finally
{
Conn.Close();
}
return ReturnValue;
}
Loewchen
Naja...
Es sind halt Datenbanken von Programmen, welche von USern (später mal) parallel genutzt werden sollen. Momentan läuft in diesem System der Dienst alleine auf der DB. Die einzigen Transaktionen die auf der Datenbank laufen, kommen von der Db. Die TAbelle hat soviele Spalten wie man konfiguriert. Momentan sind es glaube ich 21 Spalten, welche ich im Dataset benutzte. Die Tabelle auf der Datenbank hat allerdings ca. 70 Spalten und ja, ich fülle alle Pflichtfelder aus 😉. Trigger gibt es auf der Tabelle nicht.
Diese Schnittstelle existiert schon seit 2007 und lief bisher einwandfrei, auch wenn in beiden Programmen von mehreren Benutzern normal gearbeitet wird. In der Regel habe ich dann einen Intervall von 10 Minuten, in denen der Dienst läuft. Bisher auch ohne Probleme. Hier wurde nun aber in neue Hardware und Software investiert. Was ich eigentlich auch super finde. Aber dafür läuft meine Schnitte jetzt nicht. Der IT Fredi fragte mich auch schon, ob er noch was machen kann. Kann ja eigentlich an allem liegen. Ist ja so ziemlich alles neu.
Ach ja. Die Ports müssten noch überprüft werden. Nicht dass die durch die Firewall gesperrt werden.
Loewchen
Also beim debugen habe ich festgestellt das er an sich super schnell durchläuft richtig lange braucht er bei dieser zeile:
dab.Update(Des.Tables[0]);
Da ich an dieser Stelle immer nur eine Zeile habe finde ich das ziemlich merkwürdig.
Vorher hatte ich es so gemacht, das ich erst das gesamte Dataset erstelle und dann rüber gebe. Da ging garnichts mehr. Zumindest bei großen Datenmengen. Wenn ich da um die 20.000 Datensätze drin habe, dann kackt das ding ab.
Echt blöd, wenn man so gut wie garkeinen Ansantz hat.
Kann das auch an Timeouts oder Einstellungen auf dem SQL server liegen?
An der Datenbankverbindung kann es nicht liegen. Die stimmt. Es werden auch Daten übertragen. Allerdings extrem langsam. Fehlerbehandlung habe ich überall eingebaut. Den Profiler habe ich mitlaufen lassen. Aber ich kann daraus auch nur erkennen, dass es ewig dauert, bis der SQL Server antwortet.
Was ich im code mache ist schnell erklärt.
Ich hole mir die Daten aus der Quelle und schreibe Sie in ein Dataset.
Mit dem Wert aus der ersten Spalte mache ich dann eine Abfrage auf das Ziel. Daran erkenne ich ob dieser Datensatz schon vorhanden ist oder nicht. Ist er vorhanden so aktualisiere ich die Daten. Ist er noch nicht vorhanden, so erzeuge ich einen neuen Datensatz. Hat bisher mit allen Varianten von Betriebssystem und SQL Servern funktioniert. In dem Netzwerk indem ich momentan die Schnittstelle installiert habe existiert auch ein XP Rechner mit 32 bit. Installiere ich die Schnittstelle auf diesem Rechner, so dass von dort aus auf den SQL Server zugegriffen wird, so funktioniert alles einwandfrei. Das Problem ist dort nur die Netzwerkverbindung.
Bilde ich das gleiche System auf meinem Laptop nach. XP Prof und SQL Server 2005, so läuft die gleiche Datenmenge in 5 Minuten durch. Die Speicherkapazität übersteigt dabei nicht mal 50.000 MB und baut sich nach erfolgreichem Durchlauf auch wieder ab.
Ich bekomme auch keinerlei Fehlermeldungen, was mich sehr stutzig macht. Sonst bekomme ich Timeouts vom SQL Server oder Fehlermeldungen, dass die Verbindung zum SQL Server nicht aufgebaut werden kann, oder das ein Statement nicht funktioniert usw. Doch meine Errorlogdatei ist leer. Daten werden übertragen, aber es sind halt maximal 30 Datensätze die Sekunde. Statt 300. Vielleicht muss ich auch noch was nachkonfigurieren oder was anders schreiben... mag alles sein...
Hier mal der Codeschnipsel von der zentralen Routine:
for (int i = 0; i < Source.Tables[0].Rows.Count; i++)
{
DrSource = Source.Tables[0].Rows[i];
//Desabfrage mit KundennummerWINLine
SqlStr = SqlStr + " AND " + Properties.CoWi.Default.KDNR + " = '" + DrSource[0].ToString() + "'";
cmd = new SqlCommand(SqlStr, SqlConn);
//SqlConn.Open();
//SqlDataReader reader = cmd.ExecuteReader();
SqlDataAdapter dab = new SqlDataAdapter(SqlStr, SqlConn);
Des.Tables[0].Clear();
dab.AcceptChangesDuringFill = true;
dab.Fill(Des.Tables[0]);
SqlCommandBuilder commandBuilder = new SqlCommandBuilder(dab);
if (Des.Tables[0].Rows.Count >0)// reader.HasRows)
{
DrDes = Des.Tables[0].Rows[0];
for (int j = 1; j < Source.Tables[0].Columns.Count; j++)
{
DrDes[j] = DrSource[j];
}
//reader.Close();
}
else
{
if (SqlStr.Contains("addresses"))
{
DrDes = Des.Tables[0].Rows.Add();
for (int j = 0; j < Source.Tables[0].Columns.Count; j++)
{
DrDes[j] = DrSource[j];
}
}
//reader.Close();
}
//SqlConn.Close();
SqlStr = help;
dab.AcceptChangesDuringUpdate = true;
dab.ContinueUpdateOnError = true;
dab.FillLoadOption = LoadOption.OverwriteChanges;
dab.Update(Des.Tables[0]);
Loewchen
Wie sieht das denn mit .NET Framework aus?
Ich benutzte Komponenten aus .NET Framework 2.0. Das wird beim Setup auch direkt mit installiert. Allerdings ist das ja nur 32 bit. oder? Muss man dort eventuell etwas nach installieren?
Loewchen
Hi,
ich habe eine kleine Schnittstelle, einen Windows Dienst geschrieben, welcher Daten aus verschiedenen Datenquellen in andere transferiert. Funktioniert auch wunderbar. Bis vor ein paar Tagen. Da habe ich den Dienst auf einem 64 Bit System installiert. Einen Small Business Server mit 8 GB Speicherkapazität. Doch auf diesem System läuft mein Dienst extrem langsam. Statt zuvor drei Minuten, legt der Dienst den Server nach ein paar Minuten vollkommen lahm. Grund dafür ist, dass die Speicherauslastung auf dem Server auf 7,5 GB (nur für den Dienst) steigt. Ich habe danach erstmal geprüft was ich in den Einstellungen des Projektes bei CPU eingetragen habe. Dort habe ich Any CPU gewählt. Daher gehe ich davon aus, dass hier kein Problem besteht. Habt Ihr eine Ahnung woran das liegen könnte und wie man das Problem umgehen könnte?
Loewchen
Ich gehe mal davon aus, dass du wenn Du Table Adapter erwähnst auch mit Datasets arbeitest. Dann hast Du doch schon alles an der Hand. Wenn Du das Dataset geschickt füllst (sortiert) etc. dann kannst Du doch innerhalb dessen schnell an die entsprechenden Positionen springen. Ansonsten muss ich dem "ErfinderDesRades" (chuckle) recht geben. Eleganter ist es so wie er es beschrieben hat.
Ansonsten, vielleicht hast Du auch die Möglichkeit mit SQLLinq zu arbeiten. Das vereinfacht auch vieles. Aber dazu können wir nicht wirklich viel sagen, da wir nicht den Einblick in Dein Projekt haben und uns so kein Urteil darüber erlauben können.
Also stell doch sonst einfach noch ein paar mehr Informationen und Screenshoots rein. Wenn mans vor Augen hat ist es oft leichter zu verstehen.
Loewchen
Hi,
Deine Lösung scheint mir ok zu sein.
Etwas besseres fällt mir auch nicht ein.
Loewchen
Hi Leute,
ich hab es hinbekommen.
Ich habe den Timeout für die Anmeldung höher gesetzt. Nun funktioniert es an dieser Stelle.
Dafür funktionierts jetzt an anderer Stelle nicht mehr. Ich bekomme teilweise Timeouts beim löschen. Um eine Tabelle zu löschen benutzte ich
TRUNCATE TABLE tabelle1
Hat bisher, also mit dem SQL Server 2005 auch wunderbar geklappt. Nun sind wir aber umgezogen auf SQL Server 2008. Welche Timeouts würdet Ihr empfehlen hoch zu setzen?
Loewchen
Hallo,
also ich habe mal ein wenig rumgespielt.
Auch der Profiler gibt mir beim laufen des Dienstes für diese Abfrage an, dass er ca. 20 Sekunden braucht, bis er die Ergebnisse hat.
Die Statements mit Autoclose und autoshrink haben leider auch nichts gebracht.
Ich benutze hier keine globalen conenctionstrings, auch keine statische Zugriffsfunktion.
Was du da siehst ist lediglich eine Funktion in einer Klasse, die ich dazu verwende mir beliebige Daten aus beliebigen Datenbanken zu holen und diese in ein Dataset zu schreiben, um dann damit weiter zu arbeiten. Ich habe es noch nicht geschafft, alle meine Programme auf SQLLinq umzuschreiben und ich will auch keine Grundsatzdiskussion hervorrufen. Es hatte damals seine Gründe warum das so ist wie es ist. Ich will jetzt erstmal die Ursache für das momentane Verhalten finden.
Loewchen
Hi Jelly,
sehr gute Anregung.
Musste ich grade mal nachgucken. Aber dort habe ich mir doch tatsächlich mal Mühe gegeben und das Statement ausgeschrieben.
Was können denn Grundlegende Gründe für diese Fehlermeldung sein?
Ich kenn nur diese:
Fehler im SQL Statement
Abgebrochene Verbindung zum SQL Server
Loewchen
der aktuelle Ausführungszeit beträgt zwischen 17 und 20 Sekunden. Dann bricht er ab. Der Command Timeout ist ebenfalls auf 600 Sekunden eingestellt.
Hi,
ich habe einen Dienst geschrieben noch mit Visual Studio 2005 und .Net Framework 2.
Dieser läuft schon eine ganze Weile bei mir. Seit neustem bekomme ich allerdings immer wieder eine Fehlermeldung. Dazu mehr:
Es handelt sich um eine Datenmenge einer anderen Datenbank, welche ich bereits in eine View gesammelt habe. Im code hole ich mir diese Werte mit einem SQL Statement in ein Dataset. Das ganze sieht bei mir so aus:
static protected DataSet DataSetSql(String SQLStr, SqlConnection conn)
{
DataSet DS = new DataSet();
SqlDataAdapter dataAdpaterAccess = new SqlDataAdapter(SQLStr,conn);
try
{
conn.Open();
dataAdpaterAccess.AcceptChangesDuringFill = true;
dataAdpaterAccess.Fill(DS);
conn.Close();
}
catch (Exception ex)
{
ErrorLogging("Connectionstring ", SQLStr, "DataSetSql");
ErrorLogging(ex.GetType().ToString(), ex.Message, "DataSetSql");
}
finally
{
conn.Close();
}
return DS;
}
Genau an dieser Stelle läuft er dann in die Exception rein.
Die Fehlermeldung lautet dann:
Connectionstring
select kundennummer, kundenname, artikelnummer, [Menge LJ], [Wert LJ], [Menge VJ], [Wert VJ], [Menge VJ-2], [Wert VJ-2], [Menge VJ-3], [Wert VJ-3], [Menge VJ-4], [Wert VJ-4], [Menge VJ-5], [Wert VJ-5] from tbl_umsatz
System.Data.SqlClient.SqlExceptionwTimeout ist abgelaufen. Das Zeitlimit wurde vor dem Beenden des Vorgangs überschritten oder der Server reagiert nicht.
Führe ich das Statement im Management Studio aus, so benötigt er 17 Sekunden. Timeout auf dem SQL Server ist eingestellt auf 600 Sekunden. (Hatte auch schon auf 0 für unendlich gesetzt). Mit dem gleichen Code laufen Zig andere Abfragen deren Connectionstring immer gleich ist. Nur die Abfragen unterscheiden sich.
Wenn jemand eine Idee hat, würde ich mich seeeeehr freuen. 😃
LG Loewchen
habe einiges ausprobiert... festgestellt habe ich, dass der string so angezeigt wird wie er da ist... schade ist es natürlich, dass es keine andere möglichkeit gibt... wollte die schnittstelle nicht über nacht, sondern während der benutztung laufen lassen... dass ist nun nicht mehr möglich... da dass übertragen inklusive konvertierung nun ca. 15 minuten läuft... aber dann muss es wohl so sein...
dennoch, danke für eure hilfe... das problem ist soweit gelöst... 😃
LG Loewchen
hm... da habe ich was vergessen zu erwähnen...
die datenbanken gehören zu zwei "fremdprogrammen" somit kann ich beim anzeigen der gui nichts ändern... aber ich kann natürlich in der datenbank rumfurwerken... in der datenbank aus der ich die daten lese, kann ich die werte sogar als decimal abspeichern... aber in der datenbank, in die ich die werte schreibe leider nicht... wenn ich dort ein datenbankfeld von text auf decimal oder float oder int stelle, meckert er rum und das programm geht nicht mehr.
Daher habe ich gedacht, ich schreibe in diese textfelder die kommas und punkte irgendwie mit rein... ich find das nur blöd innerhalb der routine wo ich die werte rüberhole noch einzubauen... das ist einfach viel zu umfangreich und artet in spaghetticode aus...
beim transfer habe ich zwei datasets:
die werte schiebe ich wie folgt rüber:
if (Update)
{
//Adresse schon vorhanden
DrDes = Des.Tables[0].Rows[0];
}
else
{
//Adresse noch nicht vorhanden
DrDes = Des.Tables[0].NewRow();
}
for (int j = 0; j < Des.Tables[0].Columns.Count - 1; j++)
{
DrDes[j] = DrSource[j];
}
if (!Update)
{
Des.Tables[0].Rows.Add(DrDes);
}
DataAdapter.AcceptChangesDuringUpdate = true;
DataAdapter.ContinueUpdateOnError = true;
DataAdapter.FillLoadOption = LoadOption.OverwriteChanges;
DataAdapter.Update(Des.Tables[0]);
das ist mal der zentrale ausschnitt... steht natürlich noch mehr drum rum...
Loewchen
SQL Statement dafür bekomme ich auch momentan nicht hin... habe schon überlegt eine prozedur zu schreiben... oder einen trigger... aber der trigger kostet richtig viel systemzeit...
Hi Leute,
ich habe mir ein kleines Tool geschrieben, einen Windows Dienst, dieser lädt aus einer Datenbanktabelle verschiede Werte und Mengen. Nun sind diese aber im Textformat gespeichert. Die Werte werden in dem Programm in dem ich Sie dann anzeigen lasse (es steht ebenfalls ein Datenbankserver im Hintergrund) auch angezeigt. Dort sind die Felder ebenfalls Textfelder, kann ich aber ändern wenn ich will. Mein Problem ist die Anzeige. Ich möchte gerne das die Werte mit tausendertrennzeichen, aber ohne Nachkommastellen angezeigt werden. Andere Werte möchte ich ebenfalls mit tausendertrennzeichen, aber auch mit genau 2 Nachkommastellen angezeigt haben.
Hier mal ein paar Datenbeispiele (nur tausendertrennzeichen):
Ich habe ich will haben
12345 12.345
12345,0 12.345
12345,12 12.345
12345,123 12.345
Hier mal ein paar Datenbeispiele (tausendertrennzeichen und zwei nachkommastelklen):
Ich habe ich will haben
12345 12.345,00
12345,1 12.345,10
12345,12 12.345,12
12345,123 12.345,12
ich habe momentan keinerlei Ansatz, wie ich das machen könnte... das ganze müsste ich über 15 tabellen machen... und in jeder tabelle sind zw. 5 und 10 solcher konvertierungen nötig.
hat jemand einen ansatz, wie man das machen könnte, ohne spaghetticode zu schreiben? Habe auch eine Config, die ich gegebenenfalls erweitern kann. Mir fehlt momentan jegliche art von idee.
LG Loewchen
Danke LaTino,
der von Dir gepostete Link hat mir sehr geholfen. Habe mich mit dem Thema intensiv beschäftigt und in einem Projekt herumgefurhwerkt. Wirklich SEHR SEHR Nett. 😃
LG Loewchen
danke kleines_eichhörnchen... ich sollte wirkich mehr mit dem connectionStringBuilder machen... aber ich habe gehört, dass es bei .NetFramework 3.5 neue Möglichkeiten in Bezug auf die Kommunikation mit dem SQL Server gibt. Damit soll man dann schneller und effektiver arbeiten/kommunizieren können. Das muss ich mir mal anschauen... habt Ihr schon Erfahrungen damit gesammelt???
😄 ooh mein Gott... 1000 mal rauf geguckt und 1000 mal nicht gesehen... Danke Khalid... ich sollte mir wohl mal 'ne Brille besorgen... Also in 2005 geht es... weil es dort auch tatsächlich data sourcE heißt... keine Ahnung wieso das e weg gekommen ist... ist auch nur an dieser einen stelle... an allen anderen wo ich den string erneut setze ist das e auch vorhanden...
trotzdem vielen dank... 😃
Hi Leute,
seit einiger Zeit bin ich von Visual Studio 2005 auf Visual Studio 2008 umgestiegen.
Nun habe ich mit einem meiner älteren Projekte ein Problem. Ich habe das ganz normal mit der Visual Studio 2008er Version geladen. Dort bekomme ich jetzt immer den Fehler:
"Schlüsselwort wird nicht unterstützt: 'data sourc'."
Dazu der Code:
using System.Data.Sql;
using System.Data.SqlClient;
using System.Data;
static public SqlConnection SourceBelege = new SqlConnection();
String SourceBelStrSys = "";
SourceBelStrSys = "Data Sourc=" + Properties.CoWi.Default.DesServer.ToString() + ";Initial Catalog=" + Properties.CoWi.Default.DesDB.ToString() + ";User Id=" + Properties.CoWi.Default.DesUser.ToString() + ";Password=" + Properties.CoWi.Default.DesPWD.ToString() + ";";
SourceBelege.ConnectionString = SourceBelStrSys;
Und genau an der Stelle, wo ich den ConnectionString Übergebe meckert er rum. Ich habe an dem Code nichts verändert. Ich habe auch keine Fehlermeldungen lediglich eine Warnung, die da lautet:
"Could not match culture 'de-DE' for item '.NET Framework 2.0 (x86)'. Using culture 'en' instead."
Wo ich aber der Meinungd bin, dass das egal ist. Ich bekomme Sie allerdings auch nicht weg.
Ich hoffe Ihr habt eine Idee und könnt mir helfen. In 2005 funktioniert das Projekt noch einwandfrei.
LG Loewchen
Oh Mann,
ich danke Euch... so was blödes... ja... das add habe ich vollkommen vergessen... so kann dass ja auch nicht funktionieren...
Vielen dank für Eure Hilfe 😃
oh... habe jetzt erst gelesen dass ihr schon geschrieben habt...
na ja der rest steht ja oben drin.
LG Loewchen
habe das Problem gelöst.
Ich war nebenbei mit dem Management Studio an der Datenbank angemeldet und habe dort verschiedene Abfragen gestartet, damit ich das beobachten kann. Dass funktionierte nicht. Dabei traten die Fehler auf.
Dafür habe ich jetzt ein anderes Problem.
Ich habe ein Dataset (Quelle) und ein Dataset (Ziel).
Während in dem DataSet (Quelle) etwas drin steht, ist die Tabelle auf die das Dataset (Ziel) zeigt leer. Nun schreibe ich die Werte von der Quelle in die Ziel. Mit dem unten beschrieben Code. Das Resultat läßt aber zu wünschen übrig. In der Zieltabelle sind nämlich keine DAten vorhanden.
Was habe ich verkehrt gemacht!?
SqlDataAdapter DataAdapter = new SqlDataAdapter(SqlStr, SqlConn);
Des.Tables[0].Clear();
DataAdapter.Fill(Des.Tables[0]);
for (int i = 0; i < Source.Tables[0].Rows.Count; i++)
{
DrSource = Source.Tables[0].Rows[i];
DrDes = Des.Tables[0].NewRow();
for (int j = 0; j < Source.Tables[0].Columns.Count; j++)
{
DrDes[j] = DrSource[j];
}
DataAdapter.Update(Des.Tables[0]);
}
vielleicht hier jemand eine Idee!?
LG Loewchen
Zur Ergänzung:
Gelöscht wird mit dieser Funktion:
static public Boolean RunSqlStatement(String ConStr, String SqlStr)
{
Boolean ReturnValue = false;
SqlConnection Conn = new SqlConnection(ConStr);
SqlCommand Cmd = new SqlCommand(SqlStr, Conn);
try
{
Conn.Open();
Cmd.ExecuteNonQuery();
ReturnValue = true;
}
catch
{
ReturnValue = false;
}
finally
{
Conn.Close();
}
return ReturnValue;
}
Loewchen
Hi Leute,
ich habe ein dickes Problem bei meinem Datentransfer.
Ich solle eine Tabelle immer wieder mit den frischen Daten füllen.
Vorgehensweise:
Ich fange also mit dem löschen an, indem ich ein Delete from table statement absetze. Das funktioniert auch.
Danach fülle ich mein DataSet (Quelle)
oder versuche es zumindest. Dort kommt er mir dann aber immer mit einer Fehlermeldung. Öffnen des Datasets klappt noch. Doch das füllen dann nicht mehr.
Der Code:
static protected DataSet DataSetSql(String SQLStr, SqlConnection conn)
{
DataSet ds = new DataSet();
SqlDataAdapter dataAdpaterAccess = new SqlDataAdapter();
try
{
conn.Open();
dataAdpaterAccess.SelectCommand = new SqlCommand(SQLStr, conn);
dataAdpaterAccess.Fill(Cobra);
conn.Close();
}
catch (Exception ex)
{
ErrorLogging("Connectionstring ", SQLStr, "DataSetSql");
ErrorLogging(ex.GetType().ToString(), ex.Message, "DataSetSql");
}
finally
{
conn.Close();
}
return ds;
}
Die Fehlermeldung lautet:
DataSetSql
System.Data.SqlClient.SqlException
Fehler auf Übertragungsebene beim Senden der Anforderung an den Server. (provider: Shared Memory-Provider, error: 0 - Kein Prozess ist am anderen Ende der Pipe.)
Die Datenbank selber wird hinterher auch als "Fehlerverdächtig" angezeigt (im Managementstudio).
Ich hoffe jemand von Euch hat eine Idee.
LG Loewchen
Hi Leute,
also ich habe es dann mit dem cast hinbekommen... bis auf ein datumsfeld... da gab es noch die millisekunden anzeige... also hh:mm:ss.000000000065 oder so ähnlich
die habe ich dann einfach vorher abgeschnitten und dann ging es... die brauchte ich eh nicht...
dann hatte ich noch eine fehler in einigen zeilen, da gab' es hinter dem datum an einigen stellen ein komma
auf jedenfall hat's nun geklappt
nochmals vielen dank an euch...
Liebe Grüße
Loewchen