我正在使用一个非常简单的存储过程,它有两个参数。然后填充一个 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 StanleySET NOCOUNT ON
吗? - StuartLClong
是Int64
/BIGINT
。所以要么将long
改为int
,要么将GetInt32
改为GetInt64
,取决于哪个更合适。Add("@date", SqlDbType.DateTime, 100)
,但 DateTime 没有长度组件,所以从那里删除, 100
。如果这不起作用,你需要将代码发布到usp_GetCurrentLink
。