我相信这个问题是几个月前被问到的,但我相信我的情况有所不同,同样的规则也许不适用。
每次我执行此方法时都会弹出相同的错误。位置0没有行。如果我将[0]改为[1]或[15]; [1]等处没有行。这是否意味着我的数据库连接都没有?我应该写一些if语句来确定行是否在那里?
public bool UpdateOrderToShipped(string order)
{
orderNumber = order;
string batch = ConfigurationManager.AppSettings["SuccessfulOrderBatch"];
string statement = "UPDATE SOP10100 SET BACHNUMB = '"+ batch +"' WHERE SOPNUMBE = @SOPNUMBE";
SqlCommand comm = new SqlCommand(statement, connectionPCI);
comm.Parameters.Add("SOPNUMBE", orderNumber);
try
{
comm.Connection.Open();
comm.ExecuteNonQuery();
comm.Connection.Close();
}
catch(Exception e)
{
comm.Connection.Close();
KaplanFTP.errorMsg = "Database error: " + e.Message;
}
statement = "SELECT SOPTYPE FROM SOP10100 WHERE SOPNUMBE = @SOPNUMBE";
comm.CommandText = statement;
SqlDataAdapter da = new SqlDataAdapter(comm);
DataTable dt = new DataTable();
da.Fill(dt);
soptype = dt.Rows[0]["SOPTYPE"].ToString(); //errror here
return true;
}
答案 0 :(得分:20)
这很简单......这意味着您的查询没有返回任何结果。您始终必须进行防御性编码并在尝试索引之前检查Rows数组中是否包含任何项目。类似的东西:
if (dt.Rows.Count > 0)
soptype = dt.Rows[0]["SOPTYPE"].ToString();
else
somethingWentWrong();
答案 1 :(得分:1)
您可能在表中有数据,但我认为连接在第一次查询后关闭。尝试再次打开连接。你在第一个SQL查询中也有字符串连接,这不是一个好习惯。尝试使用块而不是try .. catch,只是为了更好的代码。正如乔尔建议的那样,使用支票
答案 2 :(得分:1)
for (int i = 0; i <= dt.rows.count; i++)
{
// do something till rows in DT
}
答案 3 :(得分:0)
我遇到了同样的问题,然后我意识到我的第一列不是基于整数的。因此,当我编辑第一个时,我遇到了同样的错误。
所以,我的建议是要么不要编辑第一列,要么将第一列作为ID列,在这种情况下你不必编辑任何内容。