完成后,代码会根据需要执行。
<?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
中附加信息:没有数据时读取的尝试无效。
为什么我不能简单地将值赋给变量?是因为读者没有读到任何内容吗?
答案 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();
}