首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> 更多程式語言 >> 程式設計綜合問答

ADO.NET DataSet 索引越界:Tables[1] 應為 Tables[0]

     編輯:程式設計綜合問答

問題代碼

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 開始,優先用表名訪問避免硬編碼索引錯誤。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved