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

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

  •  4
  • RameshVel  · 技术社区  · 14 年前

    我遇到了一个奇怪的问题,无法检索sql存储过程out参数值。我突然想到这个问题将近两个小时了。

        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;
    
            }
    

    最后我发现这是由于SQL连接。

    如果我 在读取输出参数之前关闭连接

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

    呃,我就是搞不懂为什么会这样。。有人有主意吗?

    2 回复  |  直到 14 年前
        1
  •  7
  •   Marc Gravell    14 年前

    参数值在 结束 TDS流(因为您可以在选择数据后在查询结束时更改它)。你一定要吃 全部的 Close() ,以获取更新的参数值,例如:

    do { while(reader.Read() {} }
    while (reader.NextResult());
    

    查询中后期出现的SQL错误也是如此。您也可以尝试添加 using

    using(var reader = cmd.ExecuteReader()) {
        LoadHits(reader);  
    }
    
        2
  •  5
  •   Lucero    14 年前

    为了补充Marc的答案,你只需关闭阅读器(而不是连接)就可以得到结果。

    这是有据可查的(“关闭数据读取器”): http://msdn.microsoft.com/en-us/library/haa3afyz(v=VS.100).aspx