Mam następujący problem (środowisko: Visual Studio 2005, MS SQL Server 2005). Mam stronkę w ASP.NET. Na niej mam element, który chciałbym wypełnić daną otrzymaną z procedury składowanej. Procedura przyjmuje tylko jeden argument (BoundID) i na podstawie tego argumentu wyodrębnia dane z kilku tabel i tworzy pewien kod 13znakowy (BoundNo). Wygląda ona tak:
ALTER PROCEDURE dbo.tbh_GetBoundIdentifier
-- generates an identifier for a bound with with a given uniqueidentifier
(
@BoundID uniqueidentifier,
@BoundNo nchar(13) OUTPUT
)
AS
SET NOCOUNT OFF
DECLARE @BoundCode nchar(4)
--tu sporo kodu, który wywołuje dane z różnych tabel
--kończy się tak
SELECT @VoivodeshipID = VoivodeshipID FROM tb_Poviats WHERE PoviatID = @PoviatID
SELECT @VoivodeshipCode = REPLICATE ('0',2-LEN(CONVERT(VARCHAR(4),VoivodeshipCode)))+CONVERT(VARCHAR(2),VoivodeshipCode) FROM tb_Voivodeships WHERE VoivodeshipID = @VoivodeshipID
SELECT @BoundNo = @VoivodeshipCode + @PoviatCode + @CommuneCode + '_' + @CommuneTypeCode + '.' + @BoundCode;
END
Po przetestowaniu z poziomu VS otrzymuję taki wynik:
Jak widać moja procedura nie zwraca wyliczonej wartości (@BoundNo = 160205_5.0020) jako wiersza (0 row(s) returned). Co mam zrobić, żeby otrzymać wynik w postaci wiersza?
Aby wynik zwrócić w postaci wiersza należy wywołać procedurę metodą ExecuteReader() obiektu typu SqlCommand. Chociaż w Twoim przypadku (pobieranie tylko jednej wartości) lepiej chyba byłoby użyć ExecuteScalar()
Przykładowy kod (nie napisałeś w jakim języku, więc daję C#):
//utworzenie obiektu zapytania dla określonej procedury
SqlCommand cmd = new SqlCommand("NazwaProcedury");
//ustawienie właściwości zapytania
cmd.Connection = new SqlConnection("prawidłowy connection string");
cmd.CommandType = CommandType.StoredProcedure;
//otwarcie połączenia
cmd.Connection.Open();
//jeśli chcesz wiersz - to i tak musisz mieć tabelę, w której ten wiersz będzie się znajdował
SqlDataReader rdr = cmd.ExecuteReader(CommandBehavior.CloseConnection); //odczytanie z zamknięciem
DataTable dt = new DataTable(); //utworzenie tabeli
dt.Load(rdr); //wypełnienie jej
//a jeśli wolisz jako string
string str = (string)cmd.ExecuteScalar();
cmd.Connection.Close();
Zacząłem tak próbować, jednak napotkałem inny problem. Ten BoundID to GUID (uniqeidentifier), który zczytywany jest dla wybranej pozycji z dropdownlista (dokładnie to DropDownList4). Nie wiem jak prawidłowo go zczytać. Zrobiłem tak:
Niestety na ostatniej linni powyżej otrzymuję błąd “Failed to convert parameter value from a String to a Guid”. Jak mam zczytać tą wartość (ewentualnie jak ją skonwertowa), żeby przekazać ją do wywołania jako GUID?