SqlConnection cn = new SqlConnection(connStr);
SqlCommand cmd = cn.CreateCommand();
cmd.CommandText = "select * from Accountnumber where name='admin'";
DataSet ds = new DataSet();
SqlDataAdapter da = new SqlDataAdapter(cmd);
da.Fill(ds, "student"); // 填充到名為 "student" 的 DataTable
MessageBox.Show(ds.Tables[1].Columns.ToString()); // 拋出 IndexOutOfRangeException
DataSet.Tables 集合是**零基索引**。
da.Fill(ds, "student") 創建**第一張**表(索引 0),名稱為 "student"。
代碼嘗試訪問 Tables[1](第二張表),但集合中只有一張表 → 拋出異常。
// 方式一:用索引 0
MessageBox.Show(ds.Tables[0].Columns.ToString());
// 方式二:用表名(推薦,可讀性強)
MessageBox.Show(ds.Tables["student"].Columns.ToString());
da.Fill(dt) 直接填充 DataTable 時不涉及 DataSet 集合索引。DataSet 多次 Fill 不同 SQL 會產生多張表(Tables[0], Tables[1]...),此時用表名區分更安全。ds.Tables.Count 可先檢查表數量防越界。if (ds.Tables.Count > 0 && ds.Tables.Contains("student")) {
DataTable dt = ds.Tables["student"];
// 安全操作 dt
}
記住:DataSet 表集合索引從 0 開始,優先用表名訪問避免硬編碼索引錯誤。