Procedura składowana


(Igor Muryjas) #1

Witam

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:

Running [dbo].[tbh_GetBoundIdentifier] ( @BoundID = 9051706e-6375-4a73-86fe-03e087df8736, @BoundNo = ).


No rows affected.

(0 row(s) returned)

@BoundNo = 160205_5.0020

@RETURN_VALUE = 0

Finished running [dbo].[tbh_GetBoundIdentifier].

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?


(Somekindsoftware) #2

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();

(Igor Muryjas) #3

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:

SqlCommand myCommand = new SqlCommand();

                myCommand.Connection = myConnection;


                myCommand.CommandText = "dbo.tbh_GetBoundIdentifier";

                myCommand.CommandType = CommandType.StoredProcedure;


                string BoundID = DropDownList4.SelectedItem.Value.ToString();


                SqlParameter myParameter1 = new SqlParameter();

                myParameter1.ParameterName = "@BoundID";

                myParameter1.SqlDbType = SqlDbType.UniqueIdentifier;

                myParameter1.Value = BoundID;


                SqlParameter myParameter2 = new SqlParameter();

                myParameter2.ParameterName = "@BoundIdentifier";

                myParameter2.SqlDbType = SqlDbType.Char;

                myParameter2.Direction = ParameterDirection.Output;


                myCommand.Parameters.Add(myParameter1);

                myCommand.Parameters.Add(myParameter2);


                myConnection.Open();


                SqlDataReader myReader = myCommand.ExecuteReader();

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?

Z góry dzięki za pomoc


(Somekindsoftware) #4

Skoro procedura przyjmuje GUID, to nie możesz podawać jej jako argument stringa, bo nie zrozumie.

Moja propozycja - zamień:

myParameter1.Value = BoundID;

na:

myParameter1.Value = new Guid(BoundID);