verwendetes Datenbanksystem: MS SQL Server 2000
Ahoi zusammen 😃
Ich habe mir mehrere Update-SP gebastelt und alle bis auf Einer funktioniert. Der Unterschied des Einen zu den Anderen ist, dass ich mehr als nur einen Parameter mit auf den Weg gebe:
REATE PROCEDURE [delete_Ein_LeistungsFall]
(@ik [int],
@standort [char],
@entgeltbereich [char],
@fallnummer [varchar])
AS UPDATE [VerwaltungsDB2009].[dbo].[Fall_Geliefert]
SET [fg_storno] = 'J'
WHERE
( [fg_ik] = @ik AND
[fg_standort] = @standort AND
[fg_entgeltbereich] = @entgeltbereich AND
[fg_fallnummer] = @fallnummer)
GO
Egal ob ich das via C#oder Test-Weise im Query Anlayser laufen lassen, als Antwort kommt immer "0 Rows effekt", obwohl es ein Eintrag dazu in der Tabelle gibt.
DECLARE @RC int
DECLARE @ik int
DECLARE @standort varchar(1)
DECLARE @entgeltbereich varchar(1)
DECLARE @fallnummer varchar(1)
SELECT @ik = 260100012
SELECT @standort = '00'
SELECT @entgeltbereich = 'DRG'
SELECT @fallnummer = 'Fall_10001'
EXEC @RC = [VerwaltungsDB2009].[dbo].[delete_Ein_LeistungsFall] @ik, @standort, @entgeltbereich, @fallnummer
DECLARE @PrnLine nvarchar(4000)
PRINT 'Gespeicherte Prozedur: VerwaltungsDB2009.dbo.delete_Ein_LeistungsFall'
SELECT @PrnLine = ' Rückgabecode = ' + CONVERT(nvarchar, @RC)
PRINT @PrnLine
800374 260100012 00 DRG Fall_10001 N 0107 False N
Die SP habe ich vorsichtshalber nochmal mit dem Assistenten erstellen lassen, damit auch alle Datentypen & Co richtig gesetzt werden.
Jemand ne Idee, was ich falsch mache?
*Machts gut und danke für den vielen Fisch*
Hallo DjBepy
Führ' mal bitte das aus:
DECLARE @RC int
DECLARE @ik int
DECLARE @standort varchar(1)
DECLARE @entgeltbereich varchar(1)
DECLARE @fallnummer varchar(1)
SELECT @ik = 260100012
SELECT @standort = '00'
SELECT @entgeltbereich = 'DRG'
SELECT @fallnummer = 'Fall_10001'
--EXEC @RC = [VerwaltungsDB2009].[dbo].[delete_Ein_LeistungsFall] @ik, @standort, @entgeltbereich, @fallnummer
--DECLARE @PrnLine nvarchar(4000)
--PRINT 'Gespeicherte Prozedur: VerwaltungsDB2009.dbo.delete_Ein_LeistungsFall'
--SELECT @PrnLine = ' Rückgabecode = ' + CONVERT(nvarchar, @RC)
--PRINT @PrnLine
--UPDATE [VerwaltungsDB2009].[dbo].[Fall_Geliefert]
--SET [fg_storno] = 'J'
SELECT * FROM [VerwaltungsDB2009].[dbo].[Fall_Geliefert]
WHERE
( [fg_ik] = @ik AND
[fg_standort] = @standort AND
[fg_entgeltbereich] = @entgeltbereich AND
[fg_fallnummer] = @fallnummer)
Bekommst du hier ein Ergebnis?
Grüße
Flo
Blog: Things about Software Architecture, .NET development and SQL Server
Twitter
Google+
Je mehr ich weiß, desto mehr weiß ich was ich noch nicht weiß.
Nö . . . sprich, er kann nichts updaten, weil er nichts findet . . . jetzt ist die Frage, warum findet er nichts? 😦
*Machts gut und danke für den vielen Fisch*
Na weil halt deine WHERE Klausel nicht passt. 😉
Prüfe deine Daten und die Parameter welche du übergibst, dann findest du den Fehler.
Grüße
Flo
Blog: Things about Software Architecture, .NET development and SQL Server
Twitter
Google+
Je mehr ich weiß, desto mehr weiß ich was ich noch nicht weiß.
Habe gerade händisch nachgeguckt, der Datensatz existiert in der DB (wie im ersten Post schon agezeigt). Habe nochmal nachgesehen, es existieren nirgendwo Leerzeichen in den Feldern.
Die Spalten-Namen stimmen auch:
jo_id fg_ik fg_standort fg_entgeltbereich fg_fallnummer fg_aufnahmeanlass fg_aufnahmeanlass fg_angenommen fg_storno
800374 260100012 00 DRG Fall_10001 N 0107 False N
Sprich, den Variablen sind die richtigen Werte zugewiesen (oder sehe ich das falsch?).
Welchen Punkt auf der Checkliste habe ich vergessen?
*Machts gut und danke für den vielen Fisch*
Auch die Datentypen stimmen:
1 jo_id int 4 0
0 fg_ik int 4 0
0 fg_standort char 2 0
0 fg_entgeltbereich char 3 0
0 fg_fallnummer varchar 15 0
0 fg_aufnahmeanlass char 1 1
0 fg_aufnahmegrund char 4 1
0 fg_angenommen char 5 1
0 fg_storno char 1 1
*Machts gut und danke für den vielen Fisch*
*LOL*
Hat jetzt auch ein bisschen gedauert bis ich draufgekommen bin... Deine Abfrage stimmt und deine Werte stimmen, aber alle Text-Parameter sind initialisiert mit einer Länge von 1 (z.B. "DECLARE @standort varchar**(1)**"). Passe die Stelle im Source-Code an, an der du die SqlCommand-Objekte erzeugst und die Parameter anhängst.
Grüße
Flo
Blog: Things about Software Architecture, .NET development and SQL Server
Twitter
Google+
Je mehr ich weiß, desto mehr weiß ich was ich noch nicht weiß.
Da war er wieder, der Wald vor lauter Bäumen . . . 😄
Danke für die Hilfe . . . wenn ich das in der Test-Abfrage anpasse geht es auf einmal 😉
Wundert mich nur, warum der doofe Assistent vom Querry Analyser das nciht automatisch macht argh
*Machts gut und danke für den vielen Fisch*
Hmm, und wie übergebe ich das Ganze in C#?
Ich habe das hinzufügen der Parameter aktuell so gelöst:
public void AddParameter(string strgParameterName, string strgParameterWert, OleDbType odbtDatentyp)
{
ocStoreProcedure.Parameters.AddWithValue(strgParameterName, strgParameterWert);
ocStoreProcedure.Parameters[strgParameterName].OleDbType = odbtDatentyp;
ocStoreProcedure.Parameters[strgParameterName].Precision = (byte)strgParameterWert.Length;
}
Wobei "Precision " scheinbar nicht die Zahl in Klammern ist, die in SQL hinter dem Datentyp in Klammern steht.
Wo lege ich denn das fest?
*Machts gut und danke für den vielen Fisch*
hmm . .. so gehts irgendwie auch nicht . . . dabei steht es so in der MSDN http://msdn.microsoft.com/en-us/library/yy6y35y8%28VS.71%29.aspx:
ocStoreProcedure.Parameters.Add(strgParameterName, odbtDatentyp, strgParameterWert.Length);
ocStoreProcedure.Parameters[strgParameterName].Value = strgParameterWert;
Wo ist denn nun der Wald wieder? 😦
*Machts gut und danke für den vielen Fisch*
Es gibt auch keine Exception . . . die SP läuft durch. Jedoch ist die Anzahl der effected Rows = 0 & eigentlich müsste es ja 1 sein 😦
Habe jetzt schon bissl rum gespielt & gesagt, wenn es ein Integer ist, dann keine Länge übergeben . . . weil vielelicht mag er das nicht . . . ändert aber auch nichts 😦
Hier meine SP-Klasse:
class StoreProcedureAusfuehren
{
OleDbConnection conStoreProcedure = new OleDbConnection();
OleDbCommand ocStoreProcedure = new OleDbCommand();
public StoreProcedureAusfuehren()
{
conStoreProcedure.ConnectionString = Properties.Settings.Default.strgDbConnectionString;
ocStoreProcedure.Connection = conStoreProcedure;
ocStoreProcedure.CommandType = System.Data.CommandType.StoredProcedure;
}
public int Ausfuehren(string strgStoreProcedureName)
{
ocStoreProcedure.CommandText = strgStoreProcedureName;
conStoreProcedure.Open();
int intAnzahlBetroffenerEintraege = ocStoreProcedure.ExecuteNonQuery();
conStoreProcedure.Close();
return intAnzahlBetroffenerEintraege;
}
public void AddParameter(string strgParameterName, string strgParameterWert, OleDbType odbtDatentyp)
{
if (odbtDatentyp == OleDbType.Integer)
{
ocStoreProcedure.Parameters.Add(strgParameterName, odbtDatentyp);
}
else
{
ocStoreProcedure.Parameters.Add(strgParameterName, odbtDatentyp, strgParameterWert.Length);
}
ocStoreProcedure.Parameters[strgParameterName].Value = strgParameterWert;
}
public void ClearParameter()
{
ocStoreProcedure.Parameters.Clear();
}
}
Und so rufe ich das Ganze dann auf:
StoreProcedureAusfuehren spaEinzelFallStorno = new StoreProcedureAusfuehren();
spaEinzelFallStorno.AddParameter("@ik", drAktuelleZeile["fg_ik"].ToString(), OleDbType.Integer);
spaEinzelFallStorno.AddParameter("@standort", drAktuelleZeile["fg_standort"].ToString(), OleDbType.Char);
spaEinzelFallStorno.AddParameter("@entgeltbereich", drAktuelleZeile["fg_entgeltbereich"].ToString(), OleDbType.Char);
spaEinzelFallStorno.AddParameter("@fallnummer", drAktuelleZeile["fg_fallnummer"].ToString(), OleDbType.VarChar);
spaEinzelFallStorno.Ausfuehren(Properties.Settings.Default.strgSpEinzelLeistungsFallStorno);
spaEinzelFallStorno = null;
Und wenn ich dann in die Funktion Ausfuehren springen ist "intAnzahlBetroffenerEintraege " immer 0 😦
Sieht jemand den Wald?
*Machts gut und danke für den vielen Fisch*
Du mussts nicht "Precision" sondern "Size" setzen. (Bitte dazu mal die MSDN bemühen.)
Außerdem solltest du unbedingt von OLEDB auf SqlClient wechseln. Weil schneller und in jeder Hinsicht besser.
Was zeigt denn der Profiler dazu an?
Grüße
Flo
Blog: Things about Software Architecture, .NET development and SQL Server
Twitter
Google+
Je mehr ich weiß, desto mehr weiß ich was ich noch nicht weiß.
Habe OleDB genommen, weil ich nicht weiß, was für DBs da irgendwann hintergrund sitzen. Spielt das denn im Bezug auf die SP eine Rolle?
Hmm, Profiler sagt mir spontan nichts.
*Machts gut und danke für den vielen Fisch*
So, aheb mal von OleDB auf SqlClient umgestellt . . .. selbes Phänomen 😦
*Machts gut und danke für den vielen Fisch*
Habe OleDB genommen, weil ich nicht weiß, was für DBs da irgendwann hintergrund sitzen. Spielt das denn im Bezug auf die SP eine Rolle?
So ziemlich jedes RDBMS bietet einen eigenständigen DB-Provider an der in ca. 100% aller Fälle besser ist als OLEDB 😉.
Du kannst ja mit den System.Data.Common Komponenten über eine Provider-Factory arbeiten. Dann bleibst du unabhängig - wobei du mit SPs (und auch ohne) - eh einiges anpassen werden musst.
So, aheb mal von OleDB auf SqlClient umgestellt . . .. selbes Phänomen 😦
Mal debugged? Breakpoint in "Ausführen" und schauen ob du da landest? Connection-String geprüft (richtige Datenbank?)?
Grüße
Flo
Blog: Things about Software Architecture, .NET development and SQL Server
Twitter
Google+
Je mehr ich weiß, desto mehr weiß ich was ich noch nicht weiß.
So, habe mal von OleDB auf SqlClient umgestellt . . .. selbes Phänomen 😦
Mal debugged? Breakpoint in "Ausführen" und schauen ob du da landest? Connection-String geprüft (richtige Datenbank?)?
Das ist immer das Erste was ich mache 😦 Ich benutze die selbe Klasse, um SP mit nur einem Int-Wert auszuführen & bei denen funktioniert es ohne Probleme. Daher gehe ich davon aus,dass es irgendwas mit den anderen Parametern zu tun hat 😦 Aber ich bin schon Step für Step durch & gepfüft, ob auch immer der richtige Wert & Co übergeben wird. Das stimmt alles . . . .
*Machts gut und danke für den vielen Fisch*