使用c#从存储过程中读取参数时出现问题

Ram*_*Vel 4 c# sql-server ado.net out-parameters

我只是遇到一个奇怪的问题,我无法检索sql存储过程输出参数值.我解决了这个问题将近2个小时.

代码很简单

    using (var con = new SqlConnection(connectionString))
        {
            con.Open();
            SqlCommand cmd = new SqlCommand("sp_mgsearach", con);
            cmd.CommandType = CommandType.StoredProcedure;
            SqlParameter param1 = new SqlParameter("@SearchTerm", SqlDbType.VarChar);
            param1.Value = searchTerm;
            param1.Direction = ParameterDirection.Input;
            cmd.Parameters.Add(param1);
            SqlParameter param2 = new SqlParameter("@start", SqlDbType.Int);
            param2.Value = start;
            param2.Direction = ParameterDirection.Input;
            cmd.Parameters.Add(param2);
            SqlParameter param3 = new SqlParameter("@end", SqlDbType.Int);
            param3.Value = end;
            param3.Direction = ParameterDirection.Input;
            cmd.Parameters.Add(param3);
            SqlParameter param4 = new SqlParameter("@total", SqlDbType.Int);
            param4.Direction = ParameterDirection.InputOutput;
            param4.Value = 0;
            cmd.Parameters.Add(param4);


            var reader = cmd.ExecuteReader();
            LoadHits(reader);           
            if (lstHits.Count > 0)
                total = Convert.ToInt32(cmd.Parameters["@total"].Value);
            else
                total = 0;

        }
Run Code Online (Sandbox Code Playgroud)

@total值始终为null.但是当我执行查询分析器中通过探查器生成的查询时,它返回正常.

最后我发现这是由SQL连接引起的.

如果我在读取out参数之前关闭连接,它工作正常

            LoadHits(reader);           
            con.close()
            if (lstHits.Count > 0)
                total = Convert.ToInt32(cmd.Parameters["@total"].Value);
            else
                total = 0;
Run Code Online (Sandbox Code Playgroud)

WT ..,我只是无法弄清楚为什么它会像这样......任何人都有想法?

Mar*_*ell 7

参数值在TDS流的末尾返回(因为您可以在选择数据后在查询结束时更改它).您必须确保使用所有 TDS数据(或者至少,导致刷新缓冲区,这Close()适合您)以获取更新的参数值,例如:

do { while(reader.Read() {} }
while (reader.NextResult());
Run Code Online (Sandbox Code Playgroud)

查询后期引发的SQL错误也是如此.您也可以尝试添加using; 这也可能就足够了:

using(var reader = cmd.ExecuteReader()) {
    LoadHits(reader);  
}
Run Code Online (Sandbox Code Playgroud)


Luc*_*ero 5

要添加到Marc的答案,您可以关闭阅读器(而不是连接)以获得结果.

这是有据可查的("关闭DataReader"):http://msdn.microsoft.com/en-us/library/haa3afyz(v = VS.100).aspx