1

我正在尝试使用数据集和存储过程从 sql 表中获取数据,在执行过程后数据集应该只包含一个值(我正在获取 id 号,id 号是我的 Costumers 表中的主键所以每个应该只有一个)。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;   

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

4

2 回答 2

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);
于 2012-11-28T16:56:19.867 回答
0

正确的。您没有正确提取数据。这对我来说是不可能的,但在这里的某个地方......

ds.Tables[0].Rows[0][0]

...你得到一个空对象。我希望查询返回空,所以最后一个[0]是试图索引 a null

如果您有足够的数据库权限,则可以在数据库上运行 SQL Server Profiler 并查看带有正在执行的确切参数的确切查询。从那里,您应该能够确定问题出在您的存储过程还是您的 C# 代码上。

于 2012-11-28T16:59:00.223 回答