Запустите хранимую процедуру в C #, передайте параметры и запишите полученный результат - PullRequest
2 голосов
/ 14 октября 2011

Это простая задача, которую я хочу выполнить, но ASP.NET делает ее довольно сложной, почти невозможной. Я следил за этим вопросом Запуск хранимой процедуры на кнопке C # , но обнаружен ExecuteNonQuery не возвращает результат запроса.

Я попробовал этот другой подход, но не могу передать параметры таким образом

SqlConnection myConnection = new SqlConnection(myconnectionString);

SqlCommand myCommand = new SqlCommand();
myCommand.CommandType = CommandType.StoredProcedure;
myCommand.CommandText = "usp_GetCustomer";

myCommand.SelectParameter <-- does not exist

Может кто-нибудь написать этот простой код, как я могу его реализовать? В основном я передаю @username и @month (обе строки символов) в хранимую процедуру, и она возвращает число, которое я хочу захватить и присвоить элементу управления меткой.

Спасибо

Вывод моего запроса таков. Он выполняет сложный запрос, создает временную таблицу, а затем запускает

select @@rowcount

и я это улавливаю.

Ответы [ 5 ]

3 голосов
/ 14 октября 2011
  1. Не используйте SqlCommand.<a href="http://msdn.microsoft.com/en-us/library/system.data.sqlclient.sqlcommand.executenonquery.aspx" rel="nofollow">ExecuteNonQuery()</a>, если вы действительно хотите данные из набора результатов.

  2. Убедитесь, что ваша процедура использует set nocount on

  3. Затем используйте SqlCommand.<a href="http://msdn.microsoft.com/en-us/library/system.data.sqlclient.sqlcommand.executescalar.aspx" rel="nofollow">ExecuteScalar()</a>

    return (int)myCommand.ExecuteScalar(); // value of select @@rowcount
    

Редактировать: Что касается ваших параметров:

myCommand.Parameters.AddWithValue("@username","jsmith");
myCommand.Parameters.AddWithValue("@month","January");
1 голос
/ 14 октября 2011

Используйте набор Parameters команды, чтобы задать параметры, и ExecuteScalar, чтобы выполнить запрос и получить значение из однострочного результата с одним столбцом.

Использовать usingблоки, чтобы убедиться, что соединение и команда закрыты и расположены должным образом в любой ситуации.Обратите внимание, что вы должны предоставить соединение с объектом команды:

int result;
using (SqlConnection connection = new SqlConnection(myconnectionString)) {
  using (SqlCommand command = new SqlCommand(connection)) {
    command.CommandType = CommandType.StoredProcedure;
    command.CommandText = "usp_GetCustomer";
    command.Parameters.Add("@username", SqlDbType.VarChar).Value = username;
    command.Parameters.Add("@month", SqlDbType.VarChar).Value = month;
    connection.Open();
    result = (int)myCommand.ExecuteScalar();
  }
}
1 голос
/ 14 октября 2011

Я предпочитаю использовать linq-to-sql для обработки хранимых процедур.Создайте модель linq-to-sql, в которую вы добавите SP, которого хотите вызвать.Это представит SP как функцию в сгенерированном контексте данных, где параметры являются обычными функциями C #.Возвращенные значения будут представлены в виде коллекции объектов C #.

Если у вас есть несколько результатов из SP, все немного сложнее, но все же довольно просто.

0 голосов
/ 14 октября 2011
using(SqlConnection myConnection = new SqlConnection(myconnectionString))
{ 
    SqlCommand myCommand = new SqlCommand(); 
    myCommand.CommandType = CommandType.StoredProcedure; 
    myCommand.CommandText = "usp_GetCustomer";     

    myCommand.Parameters.Add("@USER_NAME", SqlDbType.VarChar).Value = sUserName;    // user name that you pass to stored procedure
    myCommand.Parameters.Add("@Month", SqlDbType.VarChar).Value = iMonth;    // Month that you pass to stored procedure
    // to get return value from stored procedure
    myCommand.Parameters.Add("@ReturnValue", SqlDbType.Int).Direction = ParameterDirection.ReturnValue;     

    myConnection .Open();
    myCommand.ExecuteScalar();     

    // Returnvalue from stored procedure
    return Convert.ToInt32(command.Parameters["@ReturnValue"].Value); 
}
0 голосов
/ 14 октября 2011

Простой код для получения возвращаемого значения из SQL Server

SqlConnection myConnection = new SqlConnection(myconnectionString); 

SqlCommand myCommand = new SqlCommand(); 
myCommand.CommandType = CommandType.StoredProcedure; 
myCommand.CommandText = "usp_GetCustomer";

myCommand.Parameters.Add("@USER_NAME", SqlDbType.VarChar).Value = sUserName;   // user name that you pass to the stored procedure
myCommand.Parameters.Add("@Month", SqlDbType.VarChar).Value = iMonth;    //Month that you pass to the stored procedure

// to get return value from the stored procedure
myCommand.Parameters.Add("@ReturnValue", SqlDbType.Int).Direction = ParameterDirection.ReturnValue;

myConnection .Open();
myCommand.ExecuteScalar();

// Returnvalue from the stored procedure
int iReturnValue = Convert.ToInt32(command.Parameters["@ReturnValue"].Value);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...