2013-07-23 15 views
6

Utworzono procedurę składowaną, która pobiera pojedynczy argument, nazwę tabeli i zwraca 1, jeśli istnieje w bazie danych, 0 jeśli nie . W SQL Server Management Studio testowanie mojej przechowywanej procedury działa dokładnie tak, jakbym chciał, jednak mam problemy z uzyskaniem tej wartości do wykorzystania w moim programie C#.Procedura składowana SQL Server, która zwraca wartość boolean, jeśli istnieje tabela, C# implementacja

Moje opcje wydają się być ExecuteScalar(), ExecuteNonQuery() lub ExecuteReader(), z których żaden nie wydaje się odpowiedni do zadania, ani nie mogę uzyskać ich nawet pobrać wynik mojej procedury przechowywanej.

Próbowałem ponownie przypisać mój parametr zarówno z cmd.Parameters.AddWithValue i cmd.Parameters.Add bezskutecznie.

+1

Czy procedura składowana powrocie lub wybierając wynik? Łatwiej jest, jeśli "wybierzesz TableExists = 1" zamiast "return 1". Następnie możesz użyć ExecuteScalar(). –

+0

Tak, to powraca. Spróbuję użyć SELECT zamiast tego, jeśli to ułatwi. – danbroooks

+2

Umieść kod. – Khan

Odpowiedz

15

Zakładając, że procedura przechowywana takiego który wybiera albo 0 (tabela nie istnieje) lub 1 (tabela istnieje)

CREATE PROCEDURE dbo.DoesTableExist (@TableName NVARCHAR(100)) 
AS 
BEGIN 
    IF EXISTS (SELECT * FROM sys.tables WHERE Name = @TableName) 
     SELECT 1 
    ELSE 
     SELECT 0 
END 

następnie można napisać ten kod C# aby uzyskać wartość - wykorzystanie .ExecuteScalar() skoro czekasz tylko jeden wiersz, jedną kolumnę:

// set up connection and command 
using (SqlConnection conn = new SqlConnection("your-connection-string-here")) 
using (SqlCommand cmd = new SqlCommand("dbo.DoesTableExist", conn)) 
{ 
    // define command to be stored procedure 
    cmd.CommandType = CommandType.StoredProcedure; 

    // add parameter 
    cmd.Parameters.Add("@TableName", SqlDbType.NVarChar, 100).Value = "your-table-name-here"; 

    // open connection, execute command, close connection 
    conn.Open(); 
    int result = (int)cmd.ExecuteScalar(); 
    conn.Close(); 
} 

teraz result będzie zawierać albo 0 jeśli tabela nie istnieje - lub 1, jeśli ona istnieje.

+1

To jest czystsze. –

+1

w porównaniu do zwracanego parametru, czy jest to dobra praktyka? – Muflix

1

Użyj tego:

var returnParameter = cmd.Parameters.Add("@ReturnVal", SqlDbType.Int); 
returnParameter.Direction = ParameterDirection.ReturnValue; 

procedura składowana powinna zwrócić 0 lub 1.

Powiązane problemy