2011-11-09 11 views
3

У меня возникли проблемы с возвратом данных из моей базы данных sql-сервера на страницу aspx с использованием хранимой процедуры и надеялся, что кто-то сможет выделить, где я ошибаюсь.Возврат данных с SQL Server с использованием хранимой процедуры

Когда я запускаю данные проекта успешно вводятся в таблицу, но ничего не возвращается на следующей странице (Confirm.aspx)

Confirm.aspx.cs

using Devworks; 

namespace OSQARv0._1 
{ 
    public partial class Confirm_Questionnaire : System.Web.UI.Page 
    { 
     OscarSQL b; 

     protected void Page_Load(object sender, EventArgs e) 
     { 
      b = new OscarSQL(); 
      string qstname = b.GetQuestionName(); 
      ReturnQstID.Text = qstname;   

     }// End Page_Load 

    } // Emd Class Confirm_Questionnaire 

} // End Namespace 

SQL. CS (App Code)

public OscarSQL() 
     { 
      _productConn = new SqlConnection(); 
      _productConnectionString += "data source=mssql.database.co.uk; Initial Catalog=devworks_oscar;User ID=username;Password=password"; 
      _productConn.ConnectionString = _productConnectionString; 
     } 
    public string GetQuestionName() 
      { 
       SqlCommand myCommand = new SqlCommand("GetQuestion", _productConn); 
       myCommand.CommandType = CommandType.StoredProcedure; 
       SqlParameter retval = myCommand.Parameters.Add("@QUESTTEXT", SqlDbType.VarChar); 
       retval.Direction = ParameterDirection.Output; 
       _productConn.Open(); 
       string returnvalue = (string)myCommand.Parameters["@QUESTTEXT"].Value; 
       _productConn.Close(); 
       return returnvalue; 
      } 

Хранится Процедура

USE [devworks_oscar] 
GO 

SET ANSI_NULLS ON 
GO 
SET QUOTED_IDENTIFIER ON 
GO 

ALTER PROCEDURE [hgomez].[GetQuestion] 

AS 
    /*SET NOCOUNT ON;*/ 
    SELECT QuestionText FROM [Questions] WHERE QuestionnaireID = 21 
    RETURN 

Любая помощь будет оценена.

+0

с Dapper: 'строкового значения = connection.Query ("GetQuestion", CommandType: CommandType.StoredProcedure) Одиночный();' - просто говорят –

ответ

7

Вы не задействуются прок. Вы настраиваете его, но не возвращаете.

string returnvalue = (string)myCommand.ExecuteScalar(); 
+1

@MarcGravell выглядит как скаляр для меня? SELECT QuestionText FROM [Questions] WHERE QuestionnaireID = 21 – McKay

+0

мои извинения - я прочитал его в спешке и представил «SELECT @somevar = ...» –

+0

@MarcGravell В будущем я буду использовать переменную типа '@ personID', будет ExecuteScalar() по-прежнему правильной? – HGomez90

4

Ваша хранимая процедура не использует выходной параметр для возврата значения, поэтому вместо того, чтобы использовать ExecuteScalar():

string returnvalue = (string)myCommand.ExecuteScalar(); 
+0

В данном конкретном случае он должен использовать ExecuteScalar – stefan

+0

@stefan , да, понял, что сразу после того, как я разместил :) –

+0

Очевидно, что этот ответ также сработал. Спасибо – HGomez90

1

возвращаемое значение то, что хранимые процедуры возвращается, как правило, это целое значение, иногда используется для управления бизнес-логику или условий ошибки. В вашем случае вам нужны данные, которые возвращаются, а не возвращаемое значение. Таким образом, используйте ExecuteScalar, если запрос возвращает одно значение или ExecuteReader, если запрос возвращает одну или несколько записей данных. ExecuteNonQuery обычно используется для операций вставки/обновления и/или удаления.

1
ExecuteScalar() is a good idea if you know there is only one occurance of that record in the database, ExecuteScalar if I am not mistaken only returns the first record or occurance it finds.. you could use a datareader and do datareader.ExecuteReader() this is forward only but there are ways to make it biDirectional hehe... :) anyway if you want to loop thru the results use ExecuteReader() if you want to execute a StoredProceduere with UDATE,DELETE, or INSERT use reader.ExecuteNonQuery(). 

Hope this helps. 
Смежные вопросы