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赋值的代码?对不起。你是说这个?