为什么DataReader会出现“Enumeration Yielded No Results”错误?

6

我正在使用一个非常简单的存储过程,它有两个参数。然后填充一个 DataReader,但当我运行代码时,DataReader 抛出一个错误,说“枚举没有产生结果”,尽管已经通过了 reader.Read() 行。

我的函数将电子邮件作为参数传递。然后建立连接:

SqlConnection con = new SqlConnection(System.Configuration.ConfigurationManager.ConnectionStrings["IdesignTriviaConnection"].ConnectionString);
            SqlCommand cmd = new SqlCommand("usp_GetCurrentLink", con);
            SqlDataReader reader;

            cmd.CommandType = CommandType.StoredProcedure;
            cmd.Parameters.Add("@date", SqlDbType.DateTime, 100).Value = DateTime.Today;
            cmd.Parameters.Add("@email", SqlDbType.VarChar, 100).Value = email;

在此之后,它打开连接并建立读取器:

try
            {
                if (cmd.Connection.State == ConnectionState.Closed)
                {
                    cmd.Connection.Open();
                }
                reader = cmd.ExecuteReader();

                while (reader.Read())
                {
                    long LinkID = reader.GetInt32(0);
                    String URL = reader.GetString(1);
                    long Completed = reader.GetInt32(2);

if (LinkID == 0)
                    {
                        link = "0";
                    }
                    else
                    {
                        if (Completed == 1)
                        {
                            link = "1";
                        }
                        else
                        {
                            link = URL;
                        }
                    }
                }

如上所述,存储过程在查询分析器中运行完美,我甚至使用了调试器来查看它实际返回的预期值:

那么我错在哪里?为什么如果数据读取器无法枚举任何数据,它还能通过reader.Read()代码行?为什么如果我选择,我能在调试器中看到这些数据呢?


你在调试器上有没有对reader进行监视,或者有什么东西可以在你的代码之外枚举读取器? - D Stanley
1
错误是来自你的代码还是调试器? - D Stanley
存储过程返回多少个结果集?存储过程使用了 SET NOCOUNT ON 吗? - StuartLC
  1. long != Int32。longInt64 / BIGINT。所以要么将 long 改为 int,要么将 GetInt32 改为 GetInt64,取决于哪个更合适。
  2. 你有 Add("@date", SqlDbType.DateTime, 100),但 DateTime 没有长度组件,所以从那里删除 , 100。如果这不起作用,你需要将代码发布到 usp_GetCurrentLink
- Solomon Rutzky
可能是重复问题:SqlDataReader“枚举未产生结果”(https://dev59.com/8WrWa4cB1Zd3GeqP7y3y)。此致敬礼。 - Alexander Bell
显示剩余5条评论
2个回答

3
所以,答案是从日期参数中去除长度。这就是我复制和粘贴并没有注意到的问题。即使它返回数据,显然数据读取器认为没有数据。感谢那些建议这个修复方法的人。

0

我因为拼写columnName错误而收到了那个错误。 我已更改为

string stn_nm = _rdr["STN_NAME"].ToString();

string stn_nm = _rdr["STATION_NAME"].ToString(); //correct 

那么,就不会再出现那个错误了!

所以,首先要检查的最简单的事情是,所有列名的拼写。祝好运!


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接