关于ADO.net继承性数据绑定的问题

iamcyh 2003-11-30 10:16:44
我看了一篇来自MSDN的文章,上面使用Northwind数据库作为范例讲解继承性数据绑定,数据表关系如下:

TABLE: Customers Orders Orders Details
FIELD: CustomerID------------CustomerID ProduceID
OrderID----------------OrderID

建立表之间关系的代码如下:
private void Page_Load(object sender, EventArgs e)
{
string strConn =
"server=.;trusted_connection=yes;database=northwind";

string strSql = "SELECT CustomerID, CompanyName FROM " +
" Customers; " +
"SELECT OrderID, CustomerID, " +
" EmployeeID FROM Orders;" +
"SELECT OrderID, Products.ProductID," +
"ProductName, Products.UnitPrice FROM" +
" [Order Details], Products WHERE " +
" [Order Details].ProductID = " +
"Products.ProductID";

SqlConnection conn = new SqlConnection(strConn);
SqlDataAdapter da = new SqlDataAdapter(strSql, conn);
da.TableMappings.Add("Customers1", "Orders");
da.TableMappings.Add("Customers2", "OrderDetails");

_ds = new DataSet();

da.Fill(_ds, "Customers");

_ds.Relations.Add("Customer_Order",
_ds.Tables["Customers"].Columns["CustomerID"],
_ds.Tables["Orders"].Columns["CustomerID"]);
_ds.Relations[0].Nested = true;
_ds.Relations.Add("Order_OrderDetail",
_ds.Tables["Orders"].Columns["OrderID"],
_ds.Tables["OrderDetails"].Columns["OrderID"]);
_ds.Relations[1].Nested = true;

_customerRepeater.DataSource = _ds.Tables["Customers"];
_customerRepeater.DataBind();
}

由于我自己需要实现的继承性数据绑定只有两个表关联,数据表关系如下:

TABLE: category FORUM
categoryID------categoryID
name forumID

由于MSDN上面的文章用到了三个表,所以我将其简化如下:
SqlConnection myConnection = new SqlConnection(ConfigurationSettings.AppSettings["ConnectionString"]);
string strSql="SELECT categoryID,name,description FROM category; "+
"SELECT forumID,name,description,redirectURL,manageURL,categoryID FROM forum";
SqlDataAdapter da = new SqlDataAdapter(strSql, myConnection);
//da.TableMappings.Add("category1", "category");
da.TableMappings.Add("forum1", "forum"); -----------------(1)
DataSet ds = new DataSet();
da.Fill(ds,"category");
//da.Fill(ds,"forum"); -----------------(2)
ds.Relations.Add("category_forum",
ds.Tables["category"].Columns["categoryID"],
ds.Tables["forum"].Columns["categoryID"]);
ds.Relations[0].Nested = true;

代码执行后报错:
异常详细信息: System.NullReferenceException: 未将对象引用设置到对象的实例。
行 34: da.Fill(_ds, "category");
行 35: //da.Fill(_ds,"forum");
行 36: _ds.Relations.Add("category_forum",
行 37: _ds.Tables["category"].Columns["categoryID"],
行 38: _ds.Tables["forum"].Columns["categoryID"]);


我的想法:报错的原因我想使forum没有使用da.fill加入到da中,我将注释(2)恢复,这时候执行不再报错,但是产生的结果不正确,结果为一个category不论有几个forum与之
对应都显示只有一个forum与之对应,并且还不能够取出字段的值。但是回过头来看MSDN的范例代码 da.Fill(_ds, "Customers");也只不过将Customers填充到_ds中,但是令我不明白的是它在后面却可以用_ds.Relations将Customers和Orders建立关系。

请问我该如何修改我的代码,使得category和forum之间可以在DataSet中建立关系。谢谢您的帮助!
...全文
17 3 打赏 收藏 转发到动态 举报
写回复
用AI写文章
3 条回复
切换为时间正序
请发表友善的回复…
发表回复
saucer 2003-12-01
  • 打赏
  • 举报
回复
SqlConnection myConnection = new SqlConnection(ConfigurationSettings.AppSettings["ConnectionString"]);
string strSql="SELECT categoryID,name,description FROM category; "+
"SELECT forumID,name,description,redirectURL,manageURL,categoryID FROM forum";

SqlDataAdapter da = new SqlDataAdapter(strSql, myConnection);

da.TableMappings.Add("Table", "category");
da.TableMappings.Add("Table1", "forum");

DataSet ds = new DataSet();
da.Fill(ds);

ds.Relations.Add("category_forum",
ds.Tables["category"].Columns["categoryID"],
ds.Tables["forum"].Columns["categoryID"]);
ds.Relations[0].Nested = true;
gOODiDEA 2003-12-01
  • 打赏
  • 举报
回复
da.TableMappings.Add("category1", "category");
da.TableMappings.Add("forum1", "forum");
DataSet ds = new DataSet();
da.Fill(ds,"category");
da.Fill(ds,"forum");
ds.Relations.Add("category_forum", ds.Tables["category"].Columns["categoryID"],
ds.Tables["forum"].Columns["categoryID"]);
ds.Relations[0].Nested = true;
cnicq 2003-11-30
  • 打赏
  • 举报
回复
TableMapping的作用:
如果DataAdapter添加了TableMapping则可以使用DataAdapter.Fill(DataSet);
否则只能使用DataAdapter.Fill(DataSet, "TableName");
多个结果集
如果 SelectCommand 返回多个表,Fill 将自动使用递增值为 DataSet 中的表生成表名称,这些表名称从指定表名称开始,并以 TableNameN 格式(从“TableName1”开始)继续。可以使用表映射将自动生成的表名称映射到要为 DataSet 中的表指定的名称。例如,对于返回两个表(Customers 和 Orders)的 SelectCommand,可对 Fill 发出以下调用。

custDA.Fill(custDS, "Customers")

在 DataSet 中创建了两个表:Customers 和 Customers1。可以使用表映射来确保第二个表名为 Orders 而不是 Customers1。若要完成此任务,请将 Customers1 的源表映射到 DataSet 表 Orders,如以下示例所示。

custDA.TableMappings.Add("Customers1", "Orders")
custDA.Fill(custDS, "Customers")

62,074

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术交流专区
javascript云原生 企业社区
社区管理员
  • ASP.NET
  • .Net开发者社区
  • R小R
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

.NET 社区是一个围绕开源 .NET 的开放、热情、创新、包容的技术社区。社区致力于为广大 .NET 爱好者提供一个良好的知识共享、协同互助的 .NET 技术交流环境。我们尊重不同意见,支持健康理性的辩论和互动,反对歧视和攻击。

希望和大家一起共同营造一个活跃、友好的社区氛围。

试试用AI创作助手写篇文章吧