Laden...

Stored Procedure Update mit mehereren Werten wird scheinbar nicht ausgeführt

Erstellt von DjBepy vor 14 Jahren Letzter Beitrag vor 14 Jahren 874 Views
D
DjBepy Themenstarter:in
209 Beiträge seit 2006
vor 14 Jahren
Stored Procedure Update mit mehereren Werten wird scheinbar nicht ausgeführt

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*

1.564 Beiträge seit 2007
vor 14 Jahren

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ß.

D
DjBepy Themenstarter:in
209 Beiträge seit 2006
vor 14 Jahren

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*

1.564 Beiträge seit 2007
vor 14 Jahren

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ß.

D
DjBepy Themenstarter:in
209 Beiträge seit 2006
vor 14 Jahren

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*

D
DjBepy Themenstarter:in
209 Beiträge seit 2006
vor 14 Jahren

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*

1.564 Beiträge seit 2007
vor 14 Jahren

*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ß.

D
DjBepy Themenstarter:in
209 Beiträge seit 2006
vor 14 Jahren

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*

D
DjBepy Themenstarter:in
209 Beiträge seit 2006
vor 14 Jahren

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*

D
DjBepy Themenstarter:in
209 Beiträge seit 2006
vor 14 Jahren

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*

D
DjBepy Themenstarter:in
209 Beiträge seit 2006
vor 14 Jahren

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*

1.564 Beiträge seit 2007
vor 14 Jahren

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ß.

D
DjBepy Themenstarter:in
209 Beiträge seit 2006
vor 14 Jahren

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*

D
DjBepy Themenstarter:in
209 Beiträge seit 2006
vor 14 Jahren

So, aheb mal von OleDB auf SqlClient umgestellt . . .. selbes Phänomen 😦

*Machts gut und danke für den vielen Fisch*

1.564 Beiträge seit 2007
vor 14 Jahren

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ß.

D
DjBepy Themenstarter:in
209 Beiträge seit 2006
vor 14 Jahren

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*