SqlDataReader随机丢弃列!

时间:2011-01-16 10:13:38

标签: .net asp.net sqldatareader

我有一个非常奇怪的问题,我正在使用System.Data.SqlClient。  通过存储过程从SQL Server获取数据。 当我在开发和Stagging机器上测试应用程序时,它运行正常,但是当我在生产服务器上部署应用程序时,我随机获得SqlDataReader {{1使用不同的列名!。

每1000个请求中的2个请求中出现错误(近似值)。

SQL Server是Clustered

源代码:

IndexOutOfRangeException

存储过程:

public static List<CountryInfo> GetAllCountries(){
            List<CountryInfo> Items = new List<CountryInfo>();
            try{
                using (rdr = SqlHelper.ExecuteReader(Globals.ConnectionString, "unv_spGetAllCountries"))
                {
                    while (rdr.Read())
                    {
                        CountryInfo item = new CountryInfo();
                        item.CountryId = Convert.ToInt32(rdr["CountryId"]);
                        item.CountryName = rdr["CountryName"].ToString();
                        item.FirstLevel = rdr["FirstLevel"].ToString();
                        item.SecondLevel = rdr["SecondLevel"].ToString();

                        Items.Add(item);

                    }
                }
            }
            catch (Exception ex)
            {
                throw ex;
            }

            Items.TrimExcess();
            return Items;
        }

已经过测试

  • 检查存储过程列名称。
  • 检查读卡器列名称。
  • 检查连接字符串。

任何人都面临这样的问题并解决它?

2 个答案:

答案 0 :(得分:3)

我打赌这不是数据读者问题。我的猜测是一个或多个用户帐户正在使用sproc(等)的更具体(和更旧)的副本 - 例如Fred.MyProc而不是dbo.MyProc,或者sproc中有条件分支逻辑返回在某些情况下不同的列 - 可能是您忘记更新的代码分支。

另一个潜在的问题可能是DB causin中使用的不同对象的区分大小写不同;即Myproc vs MyProc - 如果DB区分大小写,则可能不同。

要确定,请附上SQL跟踪以记录完全发送失败案例的内容(以及由谁);然后在SSMS之类的东西中重复一遍,将dev与prod进行比较。

答案 1 :(得分:1)

我发现SqlDataReader varibale rdr在控制器基类中被声明为static,这使得它成为所有控制器之间的共享变量。请求线程使用相同的DataReader并更改其中的列。