none
我的DataSet..Relations.Count怎么总中0? RRS feed

  • 问题

  •    我写了个练习在输出  Response.Write(ds.Relations.Count); 总为 0!!代码如下:而且,在用DataTable.Rows.Find(key); 想找到相应主键所地行时,总是提示该表没有主键!

    -------------数据库:-----------------------

    CREATE DATABASE  test

    GO

    USE test

    GO

    CREATE TABLE movieKind

    (

        movieKindId INT IDENTITY(1,1)PRIMARY KEY,

        movieKindTitle VARCHAR(50)

    )

    GO

    INSERT INTO movieKind VALUES ('讯雷下载')

    INSERT INTO movieKind VALUES ('BT种子')

    GO

    CREATE TABLE movie

    (

        id INT IDENTITY(1,1) PRIMARY KEY,

        kindId INT FOREIGN KEY REFERENCES movieKind(movieKindId),

        title VARCHAR(50)

    )

    GO

    INSERT INTO movie VALUES (1,'讯雷下载的片子')

    INSERT INTO movie VALUES (2,'BT下载的片子')

    GO

                        -------------ASP.NET前台代码---------------

           <asp:GridView ID="GridView1" runat="server" AutoGenerateDeleteButton="True"

                DataKeyNames="movieKindId" onrowdeleting="GridView1_RowDeleting">

            </asp:GridView>

            <asp:GridView ID="GridView2" runat="server">

            </asp:GridView>

            -------------ASP.NET后台代码---------------

       private void mybind()

        {

            string connectionString1 = "server=(local);uid=sa;pwd=lkf6505563;database=test";

            string strSq = "SELECT * FROM [movieKind]";

            SqlConnection con = new SqlConnection(connectionString1);

            con.Open();

     

            SqlDataAdapter sda = new SqlDataAdapter(strSq, con);

            DataSet ds = new DataSet();

            sda.Fill(ds, "t1");

     

            UniqueConstraint uc = new UniqueConstraint("ucName", ds.Tables["t1"].Columns["movieKindId"], true);

     

            sda.SelectCommand = new SqlCommand("SELECT * FROM [movie]", con);

            sda.Fill(ds, "t2");

     

            ForeignKeyConstraint fk = new ForeignKeyConstraint("fkName",//约束名

                                                       ds.Tables["t1"].Columns["movieKindId"],//主表的列

                                                       ds.Tables["t2"].Columns["kindId"]);//从表被约束的列

            ds.Tables["t2"].Constraints.Add(fk);

     

            Session["ds"] = ds;

     

            Response.Write(ds.Relations.Count);

     

            this.GridView1.DataSource = ds.Tables["t1"];

            this.GridView1.DataBind();

     

     

            this.GridView2.DataSource = ds.Tables["t2"];

            this.GridView2.DataBind();

     

           

        }

            protected void GridView1_RowDeleting(object sender, GridViewDeleteEventArgs e)

        {

            DataSet ds = (DataSet)Session["ds"];

            string key = this.GridView1.DataKeys[e.RowIndex].Value.ToString();

     

            DataRow dr = ds.Tables["t1"].Rows.Find(Convert.ToInt32(key));

            ds.Tables["t1"].Rows.Remove(dr);

     

     

            this.GridView1.DataSource = ds.Tables["t1"];

            this.GridView1.DataBind();

     

            this.GridView2.DataSource = ds.Tables["t2"];

            this.GridView2.DataBind();

        }


    www.haodd123.com 我是半路出家,而且是自学 学的是C#语言,希望回帖的高手们留意一下,谢谢大家的帮助
    2009年4月13日 8:32

答案

  • DataColumn parentColumn =
    ds.Tables["t1"].Columns["movieKindId"];

        DataColumn childColumn =
    ds.Tables["t2"].Columns["kindId"]);

        // Create DataRelation.
        DataRelation rel;
        rel= new DataRelation("relName",
            parentColumn, childColumn);

        // Add the relation to the DataSet.
    ds.Relations.Add(rel);

    http://feiyun0112.cnblogs.com/
    • 已标记为答案 lkf18 2009年4月13日 10:09
    2009年4月13日 9:10
    版主

全部回复

  • DataSet ds = new DataSet();
    和fill
    是不会从数据源生成dataset中关系映射的

    你需要使用强类型化数据集。  比较简单的办法是
    添加项--〉Dataset(取名DataSet1 )

    然后把服务器资源管理器中  你需要的表拖拽到编辑视图就好了

    这样  DataSet1 ds = new DataSet1();
    就存在关系映射了

    工作突然有点忙 嘿嘿
    2009年4月13日 9:04
  • DataColumn parentColumn =
    ds.Tables["t1"].Columns["movieKindId"];

        DataColumn childColumn =
    ds.Tables["t2"].Columns["kindId"]);

        // Create DataRelation.
        DataRelation rel;
        rel= new DataRelation("relName",
            parentColumn, childColumn);

        // Add the relation to the DataSet.
    ds.Relations.Add(rel);

    http://feiyun0112.cnblogs.com/
    • 已标记为答案 lkf18 2009年4月13日 10:09
    2009年4月13日 9:10
    版主
  •     
        恩,谢谢老师 Response.Write(ds.Relations.Count); 总算不为0了!
       那在执行下边的事件时,怎么还是提示 表没有主键呢?

               我想做的是联合删除,既 GridView1执行删除时, GridView2也会删除

       我是看着网上的教程做的:http://tech.163.com/07/0329/15/3AOT7NNU0009215D.html

       他这个在网上好像打不开, 可以直接下载:http://cimg3.163.com/tech/school/thcjp/vs2005/vs2005087.rar


        protected void GridView1_RowDeleting(object sender, GridViewDeleteEventArgs e)

        {

            DataSet ds = (DataSet)Session["ds"];

            string key = this.GridView1.DataKeys[e.RowIndex].Value.ToString();

     

            DataRow dr = ds.Tables["t1"].Rows.Find(Convert.ToInt32(key));

            ds.Tables["t1"].Rows.Remove(dr);

     

     

            this.GridView1.DataSource = ds.Tables["t1"];

            this.GridView1.DataBind();

     

            this.GridView2.DataSource = ds.Tables["t2"];

            this.GridView2.DataBind()
        }


    www.haodd123.com 我是半路出家,而且是自学 学的是C#语言,希望回帖的高手们留意一下,谢谢大家的帮助
    2009年4月13日 9:58
  • 好了找到原因了 少写了个                ds.Tables["t1"].Constraints.Add(uc);

    再次感谢
    www.haodd123.com 我是半路出家,而且是自学 学的是C#语言,希望回帖的高手们留意一下,谢谢大家的帮助
    2009年4月13日 10:09