2010-08-18 2 views
0

Привет Я пытаюсь произвести выход из консоли, но получаю сообщение об ошибке,Получить выход из хранимой процедуры с помощью консоли

процедура или функция «p_Date_sel» ожидает параметр «@DateID», который был не прилагается

Предположим, чтобы получить идентификатор даты и отобразить все данные, пожалуйста, сообщите мне, что я делаю неправильно.

Ниже моя хранимая процедура

ALTER procedure [dbo].[p_Date_sel] 
@DateID int 

AS 
BEGIN 
SELECT DateTypeID , Date , Name, Notes 
FROM dbo.Dates 
WHERE DateID= @DateID 
END 

using System; 
using System.Collections.Generic; 
using System.Data; 
using System.Data.SqlClient; 
using System.Configuration; 
using System.Text; 


namespace ExecuteStoredProcedure 
{ 
    class Program 
    { 
     private int _dateID; 
     private int _dateTypeID; 
     private DateTime _date; 
     private string _name; 
     private string _notes; 

     public Program() 
     { 
      _dateID = 0; 
     } 

     public Program(int dateID) { 
      _dateID = dateID; 
     } 
     public Program(int datetypeID,DateTime date,string name,string notes){ 

      _dateTypeID = datetypeID; 
      _date = date; 
      _name = name; 
      _notes = notes; 
     } 

     public int dateID 
     { 
      get {return _dateID;} 
     } 
     public int dateTypeID 
     { 
      get { return _dateTypeID; } 
      set { _dateTypeID = value; } 
     } 
     public DateTime date 
     { 
      get {return _date ;} 
      set { _date = value;} 
     } 
     public string name 
     { 
      get { return _name;} 
      set { _name = value; } 
     } 
     public string notes 
     { 
      get { return _notes;} 
      set { _notes = value; } 
     } 

     public void LoadData() 
     { 
      SqlConnection conn = new SqlConnection("Data Source=mycbj01psql03\\sandbox01;Initial Catalog=DBRMS;Integrated Security=True"); 
      conn.Open(); 
      SqlCommand command = new SqlCommand("p_Date_sel", conn); 
      command.CommandType = CommandType.StoredProcedure; 
      SqlDataReader reader = command.ExecuteReader(); 

      while (reader.Read()) 
      { 
       _dateTypeID = Convert.ToInt16(reader["DateTypeID"]); 
       _date = Convert.ToDateTime(reader["Date"]); 
       _name = reader["Name"].ToString(); 
       _notes = reader["Notes"].ToString(); 
      } 


      reader.Close(); 
      conn.Close(); 

      } 
    } 
} 

Моя основная программа

namespace ExecuteStoredProcedure 
    { 
    class TestClass 
    { 
     public static void Main(string[] args) 
     { 

      Program p = new Program(5); 
      p.LoadData(); 

      Console.WriteLine("DateID = " + "" + p.dateID); 
      Console.WriteLine("DateTypeID = " + "" + p.dateTypeID); 
      Console.WriteLine("Date = " + "" + p.date); 
      Console.WriteLine("Name = " + "" + p.name); 
      Console.WriteLine("Notes = " + "" + p.notes); 

      Console.ReadLine(); 
     } 
    } 
} 

ответ

1

Ну, вам нужно указать значение для @DateID!

Ваш ХП требует параметр, называемый @DateID или введите INT:

ALTER procedure [dbo].[p_Date_sel] 
@DateID int 

но в вызове, вы никогда не когда-нибудь поставить такое значение!

Что вам нужно сделать, это создать SqlParameter и передать это значение сохраненной процедуре. Кроме того, я настоятельно рекомендую использовать конструкции using() {...} для вашего кода клиента sql. И как последняя рекомендация: почему бы не сделать DateID параметром метода LoadData()? То, как вы едите сейчас, вы должны создать экземпляр вашего класса для каждого значения вы хотите получить - не очень эффективно и полезно ....

public void LoadData(int dateID) 
{ 
    using(SqlConnection conn = new SqlConnection("Data Source=mycbj01psql03\\sandbox01;Initial Catalog=DBRMS;Integrated Security=True")) 
    { 
     using(SqlCommand command = new SqlCommand("p_Date_sel", conn)) 
     { 
      command.CommandType = CommandType.StoredProcedure; 

      // define the parameter and give it a value! 
      command.Parameters.Add("@DateID", SqlDbType.Int); 
      command.Parameters["@DateID"].Value = dateID; 

      conn.Open(); 

      using(SqlDataReader reader = command.ExecuteReader()) 
      { 
       while (reader.Read()) 
       { 
       _dateTypeID = Convert.ToInt16(reader["DateTypeID"]); 
       _date = Convert.ToDateTime(reader["Date"]); 
       _name = reader["Name"].ToString(); 
       _notes = reader["Notes"].ToString(); 
       } 

       reader.Close(); 
      } 

      conn.Close(); 
     } 
    } 

Таким образом, вы должны получить хранимую процедуру для работать должным образом. Назовите это из основного приложения следующим образом:

Program p = new Program(); 
p.LoadData(5);