这是我的代码
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
}
SqlConnection con = new SqlConnection(@"Data Source=.;Initial Catalog=DayanaP;Integrated Security=True");
private void button1_Click(object sender, EventArgs e)
{
con.Open();
SqlCommand test = new SqlCommand("select * from maindata where userid='"+textBox1.Text+ "' and password='" + textBox2.Text + "' ", con);
SqlDataReader dr = test.ExecuteReader();
int count = 0;
while (dr.Read())
{
count++;
}
if (count == 1)
MessageBox.Show(dr.GetString(0));
else
{
MessageBox.Show("123");
}
con.Close();
}
}
}
这是我在代码中使用的数据库维护
当我输入名称和密码时,我希望看到显示用户名字的消息框 机器人我得到这个错误:
An unhandled exception of type 'System.InvalidOperationException'
occurred in System.Data.dll
Additional information: Invalid attempt to read when no data is present.
请帮我解决此问题
答案 0 :(得分:2)
您已经使用了阅读器
while (dr.Read())
{
count++;
}
//dr is now empty
if (count == 1)
MessageBox.Show(dr.GetString(0));
这就是你需要的
while (dr.Read())
{
count++;
if (count == 1)
MessageBox.Show(dr.GetString(0));
}
或更短
if (dr.Read())
{
MessageBox.Show(dr.GetString(0));
}
else
{
MessageBox.Show("123");
}
或
string rdrZero = "123";
if (dr.Read())
{
rdrZero = GetString(0));
}
MessageBox.Show(rdrZero);
答案 1 :(得分:1)
dr.Read()
会读取下一个可用行。如果没有其他行,dr.Read()
会返回false
。
所以在你的代码中:
while (dr.Read())
{
count++;
}
您致电dr.Read()
直到它返回false
,这意味着无需再阅读。
因此,在所有内容都已阅读后,您就会显示dr.GetString(0)
的来电。
一个解决方案可能如下所示:
string s = null;
if (dr.Read()) s = dr.GetString(0);
if (string.IsNullOrEmpty(s) || dr.Read())
MessageBox.Show("123");
else
MessageBox.Show(s);
这与(我猜)您的代码要做的相同:如果结果集中只有一行,则显示返回的字符串。
但您的代码中存在更多问题:
SELECT *
。你怎么知道第0列是你想要的字符串?SELECT firstname...
并使用ExecuteScalar()
代替ExecuteReader()
。但是,您可能希望以后在项目中添加更多列。答案 2 :(得分:1)
您应首先检查datareader是否包含此示例的行。您还需要确保从while块中的datareader中检索值。
var value = string.empty;
if(dr.HasRows)
{
while (dr.Read())
{
count++;
value = dr.GetString(0);
}
}