嗨,我是新来的,我只是想问这个代码的问题。
我在我的新按钮上创造了一个生成Enumber =员工编号的条件。
我有数据库,但还没有数据记录。如果我按下我的新按钮,我的sql语句将选择他在我的数据上的最后记录,但我还没有数据,所以我试图创造一个条件。
如果Enumber在数据库中为空,它应该返回并在我的textbox上给出新的Enumber = txtEnumber.Text =“100000”。
我希望你能理解我的问题。
con.Open();
cmd = new SqlCommand("SELECT TOP 1 Enumber FROM Employee ORDER BY Enumber DESC ", con);
dr = cmd.ExecuteReader();
dr.Read();
if (dr["Enumber"] == null) // Error: "Invalid attempt to read when no data is present."
{
txtEnumber.Text = "100000";
return;
}
else
{
String a = dr["Enumber"].ToString();
txtEnumber.Text = ("");
for (int i = 0; i < 1; i++)
{
string val = a.Substring(1, a.Length - 1);
int newnumber = Convert.ToInt32(val) + 1;
a = newnumber.ToString("100000");
}
txtEnumber.Text = a;
}
con.Close();
答案 0 :(得分:3)
由于您的案例中没有任何行,因此您无法迭代您的阅读器。而不是那样,如果第一行的第一列中没有数据,则可以使用ExecuteScalar
作为null
返回object
,因为您的查询返回为SELECT TOP 1..
。< / p>
var result = cmd.ExecuteScalar();
if(result == null)
{
txtEnumber.Text = "100000";
}
答案 1 :(得分:2)
您应该先检查是否有行。 dr.Read()返回DataReader是否有行,使用它。 您的DataReader不返回任何结果......
SqlDataReader dr = cmd.ExecuteReader();
if (dr.Read()) {
// read data for first record here
}
如果您有多个结果,请使用'while'循环。
while (dr.Read()) {
// read data for each record here
}
答案 2 :(得分:0)
您应该使用dr.HasRows来检查是否有数据。
答案 3 :(得分:0)
SqlDataReader dr = cmd.ExecuteReader();
if (dr.Read()) {
dataTable.Load(dr);
}
如果您有多个结果,请使用&#39; foreach&#39;循环。
foreach (DataRow Drow in datatable.Rows)
{
// read data for each record here
}
尝试这是有效的..