代码之家  ›  专栏  ›  技术社区  ›  majkinetor

在C#中通过查询调用存储过程并获取返回值,无需输出参数

  •  1
  • majkinetor  · 技术社区  · 16 年前

    我是否可以通过EXEC执行存储过程(因此不指定 CommandType.StoredProcedure

    我试图执行查询

    DECLARE @R int 
    EXEC @R = proc p1, p2
    

    然后抓住@R,但没有成功。

    ParameterDirection.ReturnValue 以获得结果。

    泰。

    编辑

    现在,如果我按照通常的方式进行,我需要为每个参数输入config,或者如果调用是以通常的查询格式指定的,那么我需要自己解析它。用户需要了解参数详细信息等。。。

    这就是我选择执行方法的原因。用户可以在配置文件中指定一个键下的存储过程和参数。

       <add key="Procedure" value="dbo.TEST 10,20"/>
    

    程序通常不接受除初始配置之外的任何用户参数,因此sql注入等不存在,即使存在这种问题,注入检查也可以移动到SP级别。

        const string runFormat = "exec ('declare @r varchar (1024);EXEC @r={0}{1};select @r')";
    
        public bool Run(string parameters, out string result) {
            SqlConnection con = new SqlConnection( connectionString );
    
            SqlCommand cmnd = new SqlCommand(String.Empty, con);
            cmnd.CommandText = String.Format(runFormat, storedProcedure, parameters ?? String.Empty);  
    
            try {
                con.Open();
                result = (string)cmnd.ExecuteScalar();
            }
            catch (Exception e) {
                result = e.Message;
                return false;
            }
            return true;
        }    
    
    2 回复  |  直到 9 年前
        1
  •  3
  •   KM.    16 年前

    尝试在C#中运行此查询:

    exec('declare@r int;exec@r=testing 1,2;选择@r')

        2
  •  2
  •   Anton Gogolev    16 年前

    你抓不到 @R BLToolkit 救援(大致):

    [SqlQuery("declare @r int; exec @r = proc @p1, @p2; return @r")]
    public abstract object ExecProc(int @p1, int @p2);