【问题标题】:SqlDataReader is drops columns randomly!SqlDataReader 是随机删除列!
【发布时间】:2011-01-16 10:13:37
【问题描述】:

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

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

SQL Server 是集群的

源代码:

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

存储过程:

select * from unv_tblCountries order by CountryName;

已经测试过

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

有人遇到过这样的问题并解决了吗?

【问题讨论】:

  • 您必须提供更多详细信息,最好提供相关来源。没有它,就没什么好说的了。
  • 我建议使用一个 catch 块来记录这个异常和所有传入的参数。
  • 我添加了更多信息。
  • select * ... 不会为您提供帮助,如果 unv_tblCountries 发生变化(或在不同情况下有所不同),您将在远处而不是在查询本身中遇到错误——这使得调试更难。因此,生产代码中的select * 通常被认为是不良形式(即席查询不同)。
  • @Richad 我在 select 语句中添加了列,但问题仍然没有解决:(

标签: .net asp.net sqldatareader


【解决方案1】:

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

另一个潜在的问题可能是 DB 中不同的大小写敏感性导致要使用的不同对象;即 Myproc 与 MyProc - 如果数据库区分大小写,则可能会有所不同。

要确定,请附加 SQL 跟踪以记录准确为失败案例发送了什么(以及由谁发送);然后在 SSMS 之类的东西中重现,将 dev 与 prod 进行比较。

【讨论】:

  • 感谢您的回答,我修改了连接字符串以使用相同的用户名和密码连接到实时数据库,并且工作正常问题是在生产服务器上部署应用程序时!
  • @Khaled 那么你的产品服务器配置不一样,或者有一个代码分支只能通过产品中的数据访问;您将不得不尝试对其进行复制和跟踪,看看会发生什么。
  • 感谢贵公司,我对服务器和网络有疑问,顺便说一句,您指的是哪个配置?
【解决方案2】:

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

【讨论】:

    猜你喜欢
    • 2017-01-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-04-14
    • 1970-01-01
    • 1970-01-01
    • 2014-09-19
    • 2013-05-04
    相关资源
    最近更新 更多