我正在尝试使用数据集和存储过程从sql表中获取数据,数据集在执行过程后应该只包含一个值(我获取了id号,而id号是我的主键客户表因此应该只有一个)。 IsCostumerIDTaken存储过程只返回它作为参数使用的id。如果找到它,则返回它。如果不这样做,我不知道它会做什么,也许会返回0。
public static bool IsCostumerIDTaken(string id)
{
SqlConnection conObj = GetConnection();
SqlCommand cmdObj = new SqlCommand("IsCostumerIDTaken", conObj);
cmdObj.CommandType = CommandType.StoredProcedure;
cmdObj.Parameters.Add("@ID", SqlDbType.NVarChar).Value = id;
SqlDataAdapter da = new SqlDataAdapter(cmdObj);
DataSet ds = new DataSet();
da.Fill(ds);
if (ds.Tables[0].Rows[0][0].ToString() != id)
return false;
return true;
}
在我的一个页面中执行此命令后
Label1.Text = DAL.IsCostumerIDTaken(TextBox1.Text).ToString();
我收到此错误:
描述:执行当前Web请求期间发生了未处理的异常。请查看堆栈跟踪以获取有关错误及其源自代码的位置的更多信息。
异常详细信息:System.IndexOutOfRangeException:位置0没有行。
Source Error: Line 73: DataSet ds = new DataSet(); Line 74: da.Fill(ds); Line 75: if (ds.Tables[0].Rows[0][0].ToString() != id) Line 76: return false; Line 77: return true;
这里有什么问题,确切地说?我没有正确地从数据集中提取数据吗?
答案 0 :(得分:0)
如果没有数据,则不会有行。您需要测试ds.Tables[0].Rows.Count
替换此部分
if (ds.Tables[0].Rows[0][0].ToString() != id)
return false;
return true;
用这个:
return ds.Tables[0].Rows.Count > 0 && ds.Tables[0].Rows[0][0].ToString().Equals(id);
答案 1 :(得分:0)
正确。您没有正确地提取数据。我不可能告诉你,但在这里的某个地方......
ds.Tables[0].Rows[0][0]
...你得到一个空对象。我希望查询返回空,以便最后[0]
尝试索引null
。
如果您有足够的数据库权限,则可以在数据库上运行SQL Server Profiler,并使用正在执行的确切参数查看确切的查询。从那里,您应该能够确定问题是存储过程还是C#代码。