从数据集中获取数据

时间:2012-11-28 16:52:58

标签: c# sql web

我正在尝试使用数据集和存储过程从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;   

这里有什么问题,确切地说?我没有正确地从数据集中提取数据吗?

2 个答案:

答案 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#代码。