Otrzymuję błąd podczas uzyskiwania dostępu do procedury składowanej w programie SQL Server
Server Error in '/' Application.
Procedure or function 'ColumnSeek' expects parameter '@template', which was not supplied.
Dzieje się tak, gdy wywołuję procedurę składowaną z parametrem za pośrednictwem połączenia danych .net z sql (System.data.SqlClient)
, mimo że dostarczam parametr. Oto mój kod.
SqlConnection sqlConn = new SqlConnection(connPath);
sqlConn.Open();
//METADATA RETRIEVAL
string sqlCommString = "QCApp.dbo.ColumnSeek";
SqlCommand metaDataComm = new SqlCommand(sqlCommString, sqlConn);
metaDataComm.CommandType = CommandType.StoredProcedure;
SqlParameter sp = metaDataComm.Parameters.Add("@template",SqlDbType.VarChar,50);
sp.Value = Template;
SqlDataReader metadr = metaDataComm.ExecuteReader();
A moja procedura składowana to:
USE [QCApp]
GO
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
ALTER PROCEDURE [dbo].[ColumnSeek]
@template varchar(50)
AS
EXEC('SELECT Column_Name, Data_Type
FROM [QCApp].[INFORMATION_SCHEMA].[COLUMNS]
WHERE TABLE_NAME = ' + @template);
Próbuję dowiedzieć się, co robię źle.
Edycja: Jak się okazuje, szablon był pusty, ponieważ otrzymywałem jego wartość z parametru przekazanego przez adres URL i schrzaniłem przekazywanie parametrów adresu URL (używałem @
dla i zamiast &
)
.net
sql-server
stored-procedures
Tony Peterson
źródło
źródło
QUOTENAME(@template)
Odpowiedzi:
Chciałbym sprawdzić kod mojej aplikacji i zobaczyć, jaką wartość ustawiasz dla @template. Podejrzewam, że jest zerowa i na tym polega problem.
źródło
Oprócz innych odpowiedzi tutaj, jeśli zapomniałeś podać:
Wtedy również otrzymasz ten błąd.
źródło
Ten problem jest rzeczywiście zwykle spowodowany ustawieniem wartości parametru na null, jak wspomniano powyżej w HLGEM . Pomyślałem, że opowiem o niektórych rozwiązaniach tego problemu, które uznałem za przydatne dla osób, które nie mają doświadczenia z tym problemem.
Rozwiązaniem, które wolę, jest domyślne ustawienie parametrów procedury składowanej na NULL (lub dowolną wartość, którą chcesz), o czym wspomniał sangram powyżej, ale może zostać pominięte, ponieważ odpowiedź jest bardzo szczegółowa. Coś w rodzaju:
Oznacza to, że jeśli w pewnych warunkach parametr zostanie ustawiony w kodzie na wartość null, platforma .NET nie ustawi parametru, a procedura składowana użyje zdefiniowanej przez siebie wartości domyślnej. Innym rozwiązaniem, jeśli naprawdę chcesz rozwiązać problem w kodzie, byłoby użycie metody rozszerzenia, która rozwiązuje problem za Ciebie, na przykład:
Matt Hamilton ma tutaj dobry post , w którym wymieniono kilka innych świetnych metod rozszerzania w tym obszarze.
źródło
Miałem problem, w którym otrzymywałem błąd, gdy podałem 0 do parametru liczby całkowitej. I stwierdził, że:
działa, ale to nie:
źródło
Add
składni lubcmd.Parameters.Add(new SqlParameter("@Status", value: 0));
W moim przypadku musiałem przekazać
DBNULL.Value
(używając warunku if else) z kodu dla parametru procedur składowanych, które nie są zdefiniowane,null
ale wartość jestnull
.źródło
Podobny problem napotykam podczas wywoływania procedury składowanej
Które dynamicznie konstruując zapytanie wyszukiwania, wołałem powyżej jeden przez:
Następnie po wielu drapaniu głowy zmodyfikowałem procedurę składowaną na:
TUTAJ Inicjalizuję parametry wejściowe przechowywanej procedury do wartości zerowej w następujący sposób
to załatwiło sprawę dla Mnie.
Mam nadzieję, że będzie to pomocne dla kogoś, kto wpadnie w podobną pułapkę.
źródło
Jeśli szablon nie jest ustawiony (tj. == null), ten błąd również zostanie zgłoszony.
Więcej komentarzy:
Jeśli znasz wartość parametru do czasu dodania parametrów, możesz również użyć AddWithValue
EXEC nie jest wymagane. Możesz odwołać się do parametru @template bezpośrednio w SELECT.
źródło
Po pierwsze - dlaczego to EXEC? Nie powinno tak być
Obecny SP nie ma sensu? W szczególności wyszukałoby to kolumnę pasującą do @template, a nie wartość varchar @template. tj. jeśli @template to
'Column_Name'
, przeszukałobyWHERE TABLE_NAME = Column_Name
, co jest bardzo rzadkie (aby mieć taką samą nazwę tabeli i kolumny).Ponadto, jeśli nie trzeba używać dynamicznego SQL, należy użyć
EXEC sp_ExecuteSQL
(przy zachowaniu wartości jako parametry), aby zapobiec przed atakami wstrzyknięcia (zamiast konkatenacji wejścia). Ale w tym przypadku nie jest to konieczne.Jeśli chodzi o rzeczywisty problem - na pierwszy rzut oka wygląda dobrze; czy na pewno nie masz innej kopii SP? To częsty błąd ...
źródło
Natknąłem się na ten błąd dzisiaj, gdy wartości null zostały przesłane do parametrów mojej procedury składowanej. Udało mi się łatwo naprawić, zmieniając procedurę składowaną, dodając domyślną wartość = null.
źródło
Miałem ten sam problem, aby go rozwiązać, po prostu dodaj dokładnie taką samą nazwę parametru do kolekcji parametrów, jak w procedurach składowanych.
Przykład
Powiedzmy, że tworzysz procedurę składowaną:
Więc pamiętaj, aby nazwać swój parametr dokładnie tak, jak w procedurze składowanej
Jeśli pójdziesz
wtedy pojawia się błąd.
źródło
Konieczne jest poinformowanie, że wywoływany jest zapisany proces:
źródło