有一个C/S的程序,要访问很多次数据库,我在数据库里写好存储过程了,想在C#里建一个函数,传入存储过程名,参数名,参数值,然后函数就执行数据库连接,执行存储过程,最后返回一个dataset,但是查询的参数不一定,有的没有参数,有的可能有5,6个参数,这个函数怎么写呢,难道要我写5,6个函数

解决方案 »

  1.   

    如果是C#程序里面可以利用函数重载,如果是在SqL存储过程里面 可以加 IF 条件判断
      

  2.   


    string sql="select * from yourtable where 1=1";
    if(str1!="") sql+=" and fieldname1='"+str1+"'";
    if(......)
    ......
      

  3.   

    把参数全传过去,select语句用上like  %参数1% and like  %参数2%  这样空的参数也行了
      

  4.   

    下面是我提到的使用数组的方式的源代码,  Private Function CreateCommand(ByVal procname As String, ByVal prams() As SqlParameter) As SqlCommand
            If cnn.State = ConnectionState.Closed Then
                cnn.Open()
            End If
            Dim cmd As New SqlCommand(procname, cnn)
            cmd.CommandType = CommandType.StoredProcedure        If Not (prams Is DBNull.Value) Then
                Dim parameter As SqlParameter
                cmd.Parameters.Clear()
                For Each parameter In prams                cmd.Parameters.Add(parameter)
                Next
            End If
            cmd.Parameters.Add(New SqlParameter("ReturnValue", SqlDbType.Int, 4, ParameterDirection.ReturnValue, False, 0, 0, String.Empty, DataRowVersion.Default, System.DBNull.Value))
            Return cmd
        End Function
      

  5.   

    函数中参数肯定是要一起写完的。
    public void yourMath(string 1,string 2,,,,,)
    {}
    个人认为可以在存储过程里做文章,你可以把存储过程中的参数,在里面肯定是条件了,
    例如: select ....where 1=1 and name = @name and age=@age定几个变量 daclare strName = 'and name = @name' 如果 @name 为空,那么strName =''    
    那么上面SQL语句就可以这么写select ....where 1=1 +'strName'+ '+strAge+'  运行时 是空就当‘’了。个人的一点看法,具体实施还看你程序的复杂程度。 
      

  6.   

    以下代码参考了Microsoft Enterprise Library Data Access Application Block
    并做了简化(连接SQL Server 2000 or 2005)
        public DataSet GetProcDataSet(string procName, string connStr)
        {
            return GetProcDataSet(procName, null, connStr);
        }    public DataSet GetProcDataSet(string procName, SqlParameter[] parms, string connStr)
        {
            try
            {
                DataSet ds = new DataSet();
                using( SqlConnection connection = new SqlConnection(connStr) )
                {
                    SqlCommand command = new SqlCommand(procName, connection);
                    if ( parms != null )
                    {
                        command.Parameters.AddRange(parms);
                    }
                    commmand.CommandType = CommandType.StoredProcedure
                    connection.Open();
                    SqlDataAdapter adapter = new SqlDataAdapter(command);
                    adapter.Fill(ds);
                    connection.Close();
                }
                return ds;
            }
            catch(Exception ex)
            {
                throw ex;
            }
        }
    使用示例:    public void test()
        {
            string connStr = "Server=.;Database=xxx;Integrated Security=true;";
            string procName = "MyProcedure";   // 存储过程名称
            SqlParameter[] parms = new SqlParameter[]
            {
                new SqlParameter("@param1", 10),    // 参数名称请修改为存储过程的参数名称
                new SqlParameter("@param2", 20),    // 同上
                new SqlParameter("@param3", 30)     // 同上
            }        DataSet ds = GetProcDataSet(procName, parms, connStr);        return;
        }
      

  7.   

    你可以写一个最全的参数的方法
    在cmd.sqlparameters多了是没事的,但是少了却不行.
    参数不是重要的,不管理是存储过程还是SQL语句,最后还是拼接字符串来执行一个MDL语句.
      

  8.   

    我想到的方法有两种,第一种就是想11楼那样,把参数作为数组传进去
    第二种就是,Dictionary作为参数,传进去的是参数对应的值和类型,在方法体里面去创建SqlParameter