Just nu i M3-nätverket
Jump to content

Problem med relation mellan DataTable i ett Datase


Lonley Wolf

Recommended Posts

Jag försöker skapa två tabeller i ett Dataset och sedan skapa en relation mellan dem men får det inte att fungera. Felet kommer i programdelen MakeRelation i den bifogade kodexeplet Se bifogat exempel. Jag har provat diverse varianter för att komma runt problemet men inte lyckats.

 

Felmeddelande:

Objektreferensen har inte angetts till en instans av ett objekt.

 

<%@ Page Language="VB" MasterPageFile="~/MasterPage.master" Title="Untitled Page" %>
<%@import Namespace="System.Data" %>
<%@import Namespace="System.Data.Oledb" %>

<script runat="server">
   Private ds As New DataSet

   Sub Page_Load(ByVal sender As Object, ByVal e As EventArgs)
       If Not Page.IsPostBack Then
           MakeDataTables()
       End If

   End Sub

   Private Sub MakeDataTables()
       MakeParentTable()
       MakeChildTable()
       MakeRelation()

       gvUser.DataSource = ds
       gvUser.DataBind()
   End Sub

   Private Sub MakeParentTable()
       ' Skapar huvudtabell        
       Dim table As DataTable = New DataTable("UsersInfo")

       ' Deklarerar variabler för column och rad
       Dim column As DataColumn
       Dim row As DataRow

       ' Skapar kolumner och sätter dess egenskaper
       ' Parent ID
       column = New DataColumn()
       column.DataType = System.Type.GetType("System.String")
       column.ColumnName = "ParentID"
       column.AutoIncrement = False
       column.Caption = "ParentID"
       column.ReadOnly = False
       column.Unique = True
       table.Columns.Add(column)

       ' Username
       column = New DataColumn()
       column.DataType = System.Type.GetType("System.String")
       column.ColumnName = "UserName"
       column.AutoIncrement = False
       column.Caption = "UserName"
       column.ReadOnly = False
       column.Unique = False

       table.Columns.Add(column)

       ' Skapar primärnyckel
       Dim pkColumn(0) As DataColumn
       pkColumn(0) = table.Columns("ParentID")
       table.PrimaryKey = pkColumn

       ' Skapar tabellen i ds
       ds = New DataSet
       ds.Tables.Add(table)

       ' Skapar anv. i tabellen
       Dim allUsers As MembershipUserCollection = Membership.GetAllUsers

       ' Fyller listan med användarinformation
       For Each user As MembershipUser In allUsers
           row = table.NewRow

           row("ParentID") = user.ProviderUserKey
           row("UserName") = user.UserName.ToString

           table.Rows.Add(row)
       Next
   End Sub

   Private Sub MakeChildTable()
       ' Skapar tabell        
       Dim table1 As DataTable = New DataTable("ExtraUserInfo")

       ' Deklarerar variabler för column och rad
       Dim column As DataColumn
       Dim row As DataRow

       ' Skapar kolumner och sätter dess egenskaper

       ' ID = Räknare
       column = New DataColumn()
       column.DataType = System.Type.GetType("System.Int32")
       column.ColumnName = "ChildId"
       column.AutoIncrement = True
       column.Caption = "ChildId"
       column.ReadOnly = True
       column.Unique = True

       table1.Columns.Add(column)

       ' Parent
       column = New DataColumn()
       column.DataType = System.Type.GetType("System.Int32")
       column.ColumnName = "ChildTableId"
       column.AutoIncrement = False
       column.Caption = "ChildTableId"
       column.ReadOnly = False
       column.Unique = False
       table1.Columns.Add(column)

       ' Huvudtabellens ID
       column = New DataColumn()
       column.DataType = System.Type.GetType("System.String")
       column.ColumnName = "ParrentTableID"
       column.AutoIncrement = False
       column.Caption = "ParrentTableID"
       column.ReadOnly = False
       column.Unique = False

       table1.Columns.Add(column)

       ' Förnamn
       column = New DataColumn()
       column.DataType = System.Type.GetType("System.String")
       column.ColumnName = "FirstName"
       column.AutoIncrement = False
       column.Caption = "FirstName"
       column.ReadOnly = False
       column.Unique = False

       table1.Columns.Add(column)

       ' Skapar primärnyckel
       Dim pkColumn(0) As DataColumn
       pkColumn(0) = table1.Columns("ChildId")
       table1.PrimaryKey = pkColumn

       ' Skapar tabellen i ds
       ds = New DataSet
       ds.Tables.Add(table1)

       ' Skapar koppling mot databas
       Dim strSQL As String
       strSQL = "Select * from tblLocalyUsers where ((strUserID)is not null)"

       Dim DBConn As New OleDbConnection(ConfigurationManager.ConnectionStrings("importDB").ToString)
       Dim DBComm As New OleDbCommand(strSQL, DBConn)
       DBConn.Open()

       DBComm.CommandType = CommandType.Text
       Dim dr As OleDbDataReader = DBComm.ExecuteReader

       ' Stegar igenom listan
       While dr.Read
           row = table1.NewRow
           row("ChildTableId") = dr("pkLocalyUsersID")
           row("ParrentTableID") = dr("strUserID")
           row("FirstName") = dr("strFirstName")
           table1.Rows.Add(row)
       End While
   End Sub

   Private Sub MakeRelation()
       ' Datarelationer 
       ' Nedanstående rader orsakar problemet
       Dim parentColumn As DataColumn = ds.Tables("UsersInfo").Columns("ParentID")
       Dim childColumn As DataColumn = ds.Tables("ExtraUserInfo").Columns("ParrentTableID")

       Dim relation As DataRelation = New DataRelation("parent2Child", parentColumn, childColumn)
       ds.Tables("ExtendedUserInfo").ParentRelations.Add(relation)
   End Sub
</script>

<asp:Content ID="Content1" ContentPlaceHolderID="head" Runat="Server">
</asp:Content>
<asp:Content ID="Content2" ContentPlaceHolderID="ContentPlaceHolder1" Runat="Server">
   <asp:GridView ID="gvUser" runat="server" AutoGenerateColumns="true">
   </asp:GridView>
</asp:Content>

 

[inlägget ändrat 2008-09-09 11:29:20 av Lonley Wolf]

Link to comment
Share on other sites

Det fel du gjort är att du i MakeChildTable skapar ett nytt DataSet i ds. Du ska ju använda samma DataSet som du skapade i MakeParentTable. Ta alltså bort raden ds=new DataSet i MakeChildTable

 

Link to comment
Share on other sites

Archived

This topic is now archived and is closed to further replies.



×
×
  • Create New...