我有一个存储过程如下!我在C#里应该如何写调用这个存储过程得到返回值!CREATE PROCEDURE [dbo].[tableinfo](
@o_tname nvarchar(50)
)
AS
BEGIN
SET NOCOUNT ON;DECLARE @o_flg INT;
SET @o_flg=0IF(EXISTS(SELECT * FROM [table1] WHERE [tname] = @o_tname) OR EXISTS(select * from [table2] where [tname]=@o_tname))
    SET @o_flg= 1 
ELSE
    SET @o_flg=0 
ENDreturn @o_flg
GO
还有我这里返回的是一个值!如果返回的是一个结果集,例如一个表的内容又应该如何写程序读取!请各位师哥代码明示!谢谢!

解决方案 »

  1.   

    存储过程
    以下是SQL中两个存储过程: CREATE PROCEDURE dbo.oa_selectalluser 
    AS
          select * from UserInfo
    GO
    CREATE PROCEDURE dbo.oa_SelectByID
          @id int
    AS
          select * from UserInfo where ID=@id
    GO
    一个是带参数的存储过程,一个是不带参数的存储过程.下面介绍怎么在VS2005中使用这两个存储过程.
    (一).不带参数的存储过程:
    protected void Page_Load(object sender, EventArgs e)
          {
              if(!Page.IsPostBack)
              {
                  //不带参数的存储过程的使用方法
                  SqlConnection conn = new SqlConnection(ConfigurationManager.ConnectionStrings["oaConnectionString"].ToString());
                  SqlDataAdapter da = new SqlDataAdapter();
                  DataSet ds=new DataSet();
                  da.SelectCommand = new SqlCommand();
                  da.SelectCommand.Connection = conn;
                  da.SelectCommand.CommandText = "oa_SelectAllUser";
                  da.SelectCommand.CommandType = CommandType.StoredProcedure;
                  da.Fill(ds);
                  GridView1.DataSource = ds;
                  GridView1.DataBind();
              }
    在页面中添加了一个GridView控件用来绑定执行存储过程得到的结果.
    (二).带参数的存储过程:
    protected void btn_search_Click(object sender, EventArgs e)
          {
              //带参数的存储过程的使用方法
              SqlConnection conn = new SqlConnection(ConfigurationManager.ConnectionStrings["oaConnectionString"].ToString());
              SqlDataAdapter da = new SqlDataAdapter();
              DataSet ds = new DataSet();
              da.SelectCommand = new SqlCommand();
              da.SelectCommand.Connection = conn;
              da.SelectCommand.CommandText = "oa_SelectByID";
              da.SelectCommand.CommandType = CommandType.StoredProcedure;
              SqlParameter param = new SqlParameter("@id", SqlDbType.Int);
              param.Direction = ParameterDirection.Input;
              param.Value = Convert.ToInt32(txt_value.Text);
              da.SelectCommand.Parameters.Add(param);
              da.Fill(ds);
              GridView1.DataSource = ds;
              GridView1.DataBind();
          }
    同样,在页面中添加了一个GridView控件用来绑定执行存储过程的结果,另外,在页面中还添加了一个textbox控件和一个BUTTON按钮,上面的执行存储过程是放在按钮的onclick事件中的.textbox控件用来接收存储过程的参数. 
      

  2.   

     public static DataSet RunProcedure(string storedProcName, IDataParameter[] parameters, string tableName)
            {
                using (SqlConnection connection = new SqlConnection(connectionString))
                {
                    DataSet dataSet = new DataSet();
                    connection.Open();
                    SqlDataAdapter sqlDA = new SqlDataAdapter();
                    sqlDA.SelectCommand = BuildQueryCommand(connection, storedProcName, parameters);
                    sqlDA.Fill(dataSet,tableName);
                    connection.Close();
                    return dataSet;
                }
            }
      

  3.   

    存储过程有两种传值法,即Return和output。return一般用来返回影响的行数、错误编码等,output可返回自定义的值或查询语句得到的值。个人认为采用output返回值方便些。
    1.采用return返回值
    如果程序只是简单的查询一个Table中是否存在记录如果有记,采用return返回值。
    C#调用存储过程采用ExecuteNonQuery()方法执行命令,则返回的只有0和-1这两个值。0代表执行成功,-1代表失败。采用ExecuteScalar()方法执行命令,则返回的只有0这个值,---ExecuteScalar()最好在自定义返回值时用。
    2.采用output返回值
    C#调用存储过程采用ExecuteNonQuery()方法执行命令,存储过程中一定要定义output类型的值。在代码中要写的代码有
    cmd.Parameters.Add("@out", SqlDbType.Int);
    cmd.Parameters["@out"].Direction = ParameterDirection.Output;
    此后执行ExecuteNonQuery()方法
    最后可用cmd.Parameters["@out"].Value获得值,此处获得的是个对象,需进行显示的转换。
      

  4.   

    我这样写的可是执行错误!告诉我ds无法找到表0try
                {
                    SqlConnection conn = new SqlConnection("server=192.168.0.58;user id=sa;password=sa;database=Business");
                    conn.Open();
                    SqlDataAdapter da = new SqlDataAdapter();
                    DataSet ds = new DataSet();
                    da.SelectCommand = new SqlCommand();
                    da.SelectCommand.Connection = conn;
                    da.SelectCommand.CommandText = "tableinfo";
                    da.SelectCommand.CommandType = CommandType.StoredProcedure;
                    SqlParameter param = new SqlParameter("@o_tname", SqlDbType.NVarChar, 50);
                    param.Direction = ParameterDirection.Input;
                    param.Value = "aa";
                    da.SelectCommand.Parameters.Add(param);
                    da.Fill(ds);                this.dataGridView1.DataSource = ds;
                    
                }
                catch(Exception ex)
                {
                    MessageBox.Show(ex.Message);
                }
    没有用啊!我打断点查了ds里没有数据也没有表。
    我用SQL命令执行了一下,是可以查出值的。declare @o_tname nvarchar(50)
    declare @rs int
    exec @rs=tableinfo @o_tname='aa'
    print @rs
      

  5.   

    this.dataGridView1.DataSource = ds;
      

  6.   

    现在不是this.dataGridView1.DataSource = ds;这个问题!是ds就没有值!好像就没有执行一样!
    我要是换成MessageBox.Show(ds.Tables[0].Rows[0][0].ToString());就会直接报错!告诉找不到表0!按照代码去执行没有结果的问题!
    SqlConnection conn = new SqlConnection("server=192.168.0.58;user id=sa;password=sa;database=Business");
                    conn.Open();
                    SqlDataAdapter da = new SqlDataAdapter();
                    DataSet ds = new DataSet();
                    da.SelectCommand = new SqlCommand();
                    da.SelectCommand.Connection = conn;
                    da.SelectCommand.CommandText = "tableinfo";
                    da.SelectCommand.CommandType = CommandType.StoredProcedure;
                    SqlParameter param = new SqlParameter("@o_tname", SqlDbType.NVarChar, 50);
                    param.Direction = ParameterDirection.Input;
                    param.Value = "aa";
                    da.SelectCommand.Parameters.Add(param);
                    da.Fill(ds);
      

  7.   


    //连接数据库
    SqlConnection myConn = new SqlConnection("server=192.168.0.58;user id=sa;password=sa;database=Business");
    myConn.Open();//创建SqlCommand对象
    SqlCommand cmd = new SqlCommand("tableinfo",myConn);
    cmd.CommandType = CommandType.StoredProcedure;        //添加参数
    SqlParameter TableName = cmd.Parameters.Add("@o_tname", SqlDbType.NVarChar, 50);
    SqlParameter returnvalue = cmd.Parameters.Add("@returnvalue", SqlDbType.Int);//指定参数是只可输入(Input)、输出(Output)还是返回值(ReturnValue)
    TableName.Direction = ParameterDirection.Input;
    returnvalue.Direction = ParameterDirection.ReturnValue;//关键是这个,看到了没//为传递给存储过程的参数赋值
    TableName.Value = "aa";//执行SQL存储过程
    cmd.ExecuteNonQuery();//得到并判断返回值
    if ((int)returnvalue.Value == 1)
    {
    Response.Write("存在!");
    }
    else
    {
    Response.Write("不存在!");
    }我承认我是看到小妹才进来的。
      

  8.   

    最简单写法
     using (SqlConnection Connection = new SqlConnection(""))
                    {
                        SqlDataAdapter DataAdapter = new SqlDataAdapter("存储过程名", Connection);
                        DataAdapter.SelectCommand.CommandType = CommandType.StoredProcedure;
                        DataAdapter.SelectCommand.Parameters.AddWithValue("P1", 1);
                        DataTable DT = new DataTable();
                        DataAdapter.Fill(DT);
                        String ResultParam1 = DT.Rows[0][0].ToString();
                    }