SqlDataReader问题

时间:2017-12-10 08:52:29

标签: c# sql-server

完成后,代码会根据需要执行。

<?php
    $myqry=$db->prepare("SELECT activity_id,date_from,title,venue FROM activity" );
    $myqry->execute();
    while($myqr=$myqry->fetch(PDO::FETCH_ASSOC)){
      $mydate=strtotime($myqr['date_from'])*1000;
      echo '<tr><td data-value="'.$mydate.'"></td>
          <td>'.$myqr['title'].'</td>
          <td>'.$myqr['venue'].'</td>
          <td><a href="proc_view_act.php?actvid='.$myqr['activity_id'].'">View</a></td></tr>';
    }                            

每当没有if和只是变量声明的时候写这样的

SqlDataReader sqlRead = selectCommand.ExecuteReader(CommandBehavior.SingleRow);

if (sqlRead.Read())
{
    string text = sqlRead["USERNAME"].ToString();

    MessageBox.Show(text);
    connection.Close();
}

我收到此错误:

  

未处理的类型&#39; System.InvalidOperationException&#39;发生在System.Data.dll

中      

附加信息:没有数据时读取的尝试无效。

为什么我不能简单地将值赋给变量?是因为读者没有读到任何内容吗?

1 个答案:

答案 0 :(得分:2)

这就是DataReader的编写方式。您必须首先调用Read方法,然后才能从中获取值 请参阅Retrieving Data Using a DataReader Microsoft文档:

  

您使用 DataReader 对象的读取方法从查询结果中获取一行。您可以通过将列的名称或序号引用传递给 DataReader 来访问返回行的每一列。

但是,在您的情况下,我建议您不要首先使用ExecuteReader()。由于您只对一个值感兴趣,所以应该使用ExecuteScalar,并确保您的SQL语句实际选择了您想要的值(例如,如果您选择多个列或多个行, ExecuteScalar将返回第一行中第一列的值,忽略可能从SQL语句返回的所有其他值。

var text = "";
var userName = selectCommand.ExecuteScalar();
if(userName != null && userName != DbNull.Value)
{
    text = userName.ToString();
}