C# 不存在数据时读取的尝试无效
这是我的代码:C# 不存在数据时读取的尝试无效,c#,C#,这是我的代码: db.Open(); string updateString = "SELECT TOP 1 RTRIM(kol) kol, RTRIM(adres) adres, RTRIM(numwave) numwave FROM sorters WHERE kodprod=@kodprod AND sorter_kod=@sorter AND moved_ok IS NULL ORDER BY CAST(kol as int)"; try { SqlCommand c
db.Open();
string updateString = "SELECT TOP 1 RTRIM(kol) kol, RTRIM(adres) adres, RTRIM(numwave) numwave FROM sorters WHERE kodprod=@kodprod AND sorter_kod=@sorter AND moved_ok IS NULL ORDER BY CAST(kol as int)";
try
{
SqlCommand command = new SqlCommand(updateString, db);
//command.Parameters.AddWithValue("@numdoc", NumDoc);
command.Parameters.AddWithValue("@kodprod", KodProd.Id);
command.Parameters.AddWithValue("@sorter", SorterKod);
SqlDataReader reader = command.ExecuteReader();
reader.Read();//here error
Kol = reader["kol"].ToString();
Adres = reader["adres"].ToString();
NumWave = reader["numwave"].ToString();
NumDoc = reader["numdoc"].ToString();
reader.Close();
}
catch (Exception ex)
{ }
为什么在运行代码时会出现此错误
不存在数据时读取的尝试无效
您应该执行
while循环
,检查读卡器是否包含数据。如果确认查询只返回一行,也可以使用IF
。如果超过一行,则应在时使用。在您的情况下,IF
也要做这项工作,因为您只参加了TOP1
string updateString = "SELECT TOP 1 RTRIM(kol) kol, RTRIM(adres) adres,
RTRIM(numwave) numwave FROM sorters WHERE
kodprod=@kodprod AND sorter_kod=@sorter
AND moved_ok IS NULL ORDER BY CAST(kol as int)";
try
{
SqlCommand command = new SqlCommand(updateString, db);
//command.Parameters.AddWithValue("@numdoc", NumDoc);
command.Parameters.AddWithValue("@kodprod", KodProd.Id);
command.Parameters.AddWithValue("@sorter", SorterKod);
SqlDataReader reader = command.ExecuteReader();
while(reader.Read())
{
Kol = reader["kol"].ToString();
Adres = reader["adres"].ToString();
NumWave = reader["numwave"].ToString();
NumDoc = reader["numdoc"].ToString();
}
reader.Close();
}
您应该执行while循环
,检查读卡器是否包含数据。如果确认查询只返回一行,也可以使用IF
。如果超过一行,则应在
时使用。在您的情况下,IF
也要做这项工作,因为您只参加了TOP1
string updateString = "SELECT TOP 1 RTRIM(kol) kol, RTRIM(adres) adres,
RTRIM(numwave) numwave FROM sorters WHERE
kodprod=@kodprod AND sorter_kod=@sorter
AND moved_ok IS NULL ORDER BY CAST(kol as int)";
try
{
SqlCommand command = new SqlCommand(updateString, db);
//command.Parameters.AddWithValue("@numdoc", NumDoc);
command.Parameters.AddWithValue("@kodprod", KodProd.Id);
command.Parameters.AddWithValue("@sorter", SorterKod);
SqlDataReader reader = command.ExecuteReader();
while(reader.Read())
{
Kol = reader["kol"].ToString();
Adres = reader["adres"].ToString();
NumWave = reader["numwave"].ToString();
NumDoc = reader["numdoc"].ToString();
}
reader.Close();
}
您可以检查DataReader是否准备好获取行
if(reader.HasRows)
{
//do the coding here
}
您可以检查DataReader是否准备好获取行
if(reader.HasRows)
{
//do the coding here
}
我相信错误实际上会发生在下一行,即当您通过index[]
操作符访问读卡器时。您需要做的是在访问它之前检查reader.Read()
的结果:
if (reader.Read())
{
Kol = reader["kol"].ToString();
Adres = reader["adres"].ToString();
NumWave = reader["numwave"].ToString();
NumDoc = reader["numdoc"].ToString();
}
由于您最多只返回一行(TOP 1
),因此将有零行或一行。我相信错误实际上会发生在下一行,即当您通过index[]
操作符访问读卡器时。您需要做的是在访问它之前检查reader.Read()
的结果:
if (reader.Read())
{
Kol = reader["kol"].ToString();
Adres = reader["adres"].ToString();
NumWave = reader["numwave"].ToString();
NumDoc = reader["numdoc"].ToString();
}
由于您最多只返回一行(TOP 1
),因此将有零行或一行。使用reader.HasRows
string updateString = "SELECT TOP 1 RTRIM(kol) kol, RTRIM(adres) adres, RTRIM(numwave) numwave FROM sorters WHERE kodprod=@kodprod AND sorter_kod=@sorter AND moved_ok IS NULL ORDER BY CAST(kol as int)";
try
{
SqlCommand command = new SqlCommand(updateString, db);
//command.Parameters.AddWithValue("@numdoc", NumDoc);
command.Parameters.AddWithValue("@kodprod", KodProd.Id);
command.Parameters.AddWithValue("@sorter", SorterKod); SqlDataReader
reader = command.ExecuteReader();
if(reader.HasRows)
while(reader.Read())//here error
{
Kol = reader["kol"].ToString();
Adres = reader["adres"].ToString();
NumWave = reader["numwave"].ToString();
NumDoc = reader["numdoc"].ToString();
}
reader.Close();
}
catch{}
编辑:很抱歉格式不好,从Android应用程序发布的代码乱七八糟
编辑:参见Microsoft示例使用reader.HasRows
string updateString = "SELECT TOP 1 RTRIM(kol) kol, RTRIM(adres) adres, RTRIM(numwave) numwave FROM sorters WHERE kodprod=@kodprod AND sorter_kod=@sorter AND moved_ok IS NULL ORDER BY CAST(kol as int)";
try
{
SqlCommand command = new SqlCommand(updateString, db);
//command.Parameters.AddWithValue("@numdoc", NumDoc);
command.Parameters.AddWithValue("@kodprod", KodProd.Id);
command.Parameters.AddWithValue("@sorter", SorterKod); SqlDataReader
reader = command.ExecuteReader();
if(reader.HasRows)
while(reader.Read())//here error
{
Kol = reader["kol"].ToString();
Adres = reader["adres"].ToString();
NumWave = reader["numwave"].ToString();
NumDoc = reader["numdoc"].ToString();
}
reader.Close();
}
catch{}
编辑:很抱歉格式不好,从Android应用程序发布的代码乱七八糟
编辑:请参见Microsoft示例编译时或运行时是否出现错误?与错误无关,但看起来您拼错了单词地址。如果在数据库中拼写正确,则可能会出现错误。如果不是,将来可能会引起混淆。@Roman下一个问题是什么?编译时或运行时是否出现错误?与错误无关,但看起来您拼错了单词地址。如果在数据库中拼写正确,则可能会出现错误。如果不是,将来可能会引起混乱。@Roman你下一个问题是什么好的,这个问题解决了)Tnx。但现在我遇到了下一个问题。我的查询无法正常工作。此处我的表列:此处SQL中的查询:在c#中,其返回0行在SQL链接中,您给出的查询没有任何Order By,但在您在问题中给出的代码中,使用了Order By。告诉我一件事,为什么您使用Order By作为前1行过滤器。它的意思是lessOkay,这个问题解决了)Tnx。但现在我遇到了下一个问题。我的查询无法正常工作。此处我的表列:此处SQL中的查询:在c#中,其返回0行在SQL链接中,您给出的查询没有任何Order By,但在您在问题中给出的代码中,使用了Order By。告诉我一件事,为什么您使用Order By作为前1行过滤器。这意味着我的下一个问题:@Roman你能告诉我你在哪里为kodProd.Id和SorterKodI赋值吗?对不起。你是说这个?下面是我的下一个问题:@Roman,你能不能给我看一下你在哪里为kodProd.Id和SorterKodI赋值的代码?对不起。你是说这个?