顶部468*60ad 顶部468*60ad 顶部468*60ad 顶部468*60ad

.Net开发采用DB2 XML的应用程序示例

2008-03-01 08:31:03  来源:希赛网 天狼

  插入和验证 XML 数据

 

  至此,已经建立了 DB2 连接并注册了 XML 模式,现在可以编写 SQL INSERT 或 UPDATE 语句,以便将新的 XML 数据插入到包含 XML 列的表中,并在插入 XML 数据之前,让 DB2 验证 XML 数据。DB2 可以存储最大为 2GB 的格式良好的任何 XML 文档。清单 6 展示了将一行插入到 CARPOOL 表中的一种方法。在这个例子中,插入到 CARPOOLINFO 列的 XML 文档是从字符串读取的。

网页教学网

  清单 6. 插入和更新 XML 数据的方法 Webjx.Com

      // Update the database based on the user's action in the dataGrid.
      // Performs INSERT, UPDATE and DELETE.
      private void update()
        {
            mydataSourceDT = carpoolInfo.DataSource as DataTable;
            dtChanges = mydataSourceDT.GetChanges();
            if (dtChanges == null)
                return;

            // Need to generate insert/update/delete commands to //validate against


            // carpoolinfo.xsd
            DB2Command insert = new DB2Command
               ("INSERT INTO CARPOOL" +
                "(FIRSTNAME,LASTNAME,TITLE,PHONE,CARPOOLINFO)" +
                " VALUES(?,?,?,?," +
                "XMLVALIDATE(xmlparse (DOCUMENT CAST" +
                " ( ? as CLOB) PRESERVE WHITESPACE )" +
                "ACCORDING TO XMLSCHEMA ID " + schema + ".CARPOOLINFO ))");

网页教学网



            DB2Command update = new DB2Command
              ("UPDATE  CARPOOL SET FIRSTNAME=?,LASTNAME=?,TITLE=?,PHONE=?," +
              "CARPOOLINFO=XMLVALIDATE(xmlparse (DOCUMENT CAST " +
              "( ? as CLOB) PRESERVE WHITESPACE ) " +
              "ACCORDING TO XMLSCHEMA ID " + schema + ".CARPOOLINFO ) WHERE ID=?");

            DB2Command delete = new DB2Command
               ("DELETE FROM CARPOOL WHERE ID=?");

网页教学网



            //Add the Parameters and bind them to the DataTable's //corresponding columns.
            DB2Parameter fn1 = new DB2Parameter("fn1", DB2Type.VarChar);
            DB2Parameter fn2 = new DB2Parameter("fn2", DB2Type.VarChar);           
            fn1.SourceColumn = "FIRSTNAME";
            fn2.SourceColumn = "FIRSTNAME";           
            insert.Parameters.Add(fn1);
            update.Parameters.Add(fn2);

            DB2Parameter ln1 = new DB2Parameter("ln1", DB2Type.VarChar);

网页教学网


            DB2Parameter ln2 = new DB2Parameter("ln2", DB2Type.VarChar);           
            ln1.SourceColumn = "LASTNAME";
            ln2.SourceColumn = "LASTNAME";
            insert.Parameters.Add(ln1);
            update.Parameters.Add(ln2);

            DB2Parameter tl1 = new DB2Parameter("tl1", DB2Type.VarChar);
            DB2Parameter tl2 = new DB2Parameter("tl2", DB2Type.VarChar);           
            tl1.SourceColumn = "TITLE"; 网页教学网
            tl2.SourceColumn = "TITLE";           
            insert.Parameters.Add(tl1);
            update.Parameters.Add(tl2);

            DB2Parameter ph1 = new DB2Parameter("ph1", DB2Type.VarChar);
            DB2Parameter ph2 = new DB2Parameter("ph2", DB2Type.VarChar);          
            ph1.SourceColumn = "PHONE";
            ph2.SourceColumn = "PHONE";           
            insert.Parameters.Add(ph1);
            update.Parameters.Add(ph2);

            DB2Parameter info1 = new DB2Parameter("info1", DB2Type.Clob);
            DB2Parameter info2 = new DB2Parameter("info2", DB2Type.Clob);
            info1.SourceColumn = "CARPOOLINFO";
            info2.SourceColumn = "CARPOOLINFO";           
            insert.Parameters.Add(info1);
            update.Parameters.Add(info2);

            DB2Parameter i1 = new DB2Parameter("i1", DB2Type.Integer);
            i1.SourceColumn = "ID";        
            update.Parameters.Add(i1);
            DB2Parameter i2 = new DB2Parameter("i2", DB2Type.Integer);
            i2.SourceColumn = "ID"; 
            delete.Parameters.Add(i2);             

            da.InsertCommand = insert;
            da.UpdateCommand = update;
            da.DeleteCommand = delete;
        
            // Perform the update.
            da.Update(dtChanges);
            mydataSourceDT.AcceptChanges();

            // Refill the dataset, refresh the dataGridView.
            ds.Clear();
            da.Fill(ds, xsdname);
        }
 

  现在来看看这段代码。在建立数据库连接之后,该方法创建三个 DB2Command;一个用于插入,一个用于更新,还有一个用于删除。插入和更新命令包含 4 个用于常规列值的参数占位符,而第 5 个参数占位符则用于 XML 列,该方法还使用 DB2 XMLVALIDATE 函数,并将 Carpoolinfo XML 模式传递给它以便进行验证。

  查询 XML 数据

  至此,已经将数据存储在 CARPOOLINFO 表中,现在可以查询这个表。DB2 允许编写不同类型的查询来提取关系数据和 XML 数据。例如可以编写一个简单的查询来检索整个 XML 文档,或者编写一个基于 XML 和关系查询谓词检索 XML 文档某些部分的查询。本文演示一个这样的查询: 网页教学网

  •   基于 XML 谓词过滤数据
  •   检索符合条件的 XML 文档的某些部分,以及存储在传统 SQL 列中的数据

  本文使用 DB2 的 XMLExists() 函数。本文中的示例应用程序使用 XMLExists() 来演示一个常见的编程任务:检索 XML 文档的某些部分。清单 7 中显示的例子返回居住在旧金山或圣何塞的合伙用车者的合伙用车信息。这个例子同时投影和限制传统的 SQL 数据和 XML 数据。

  清单 7. 查询 XML 数据

      // Populate the dataGrid.
      // If "All" is selected, all data from the table will be displayed.
      // if a city's name is selected, only rows whose CARPOOLINFO contain
      // <City>cityName</City> will be displayed.       

      public void populate(String cityName)
        {
            if ( cityName.Equals("All"))
            {
                carpoolInfo.DataSource = ds.Tables[xsdname];
            }
            else
            {
                xq = "select * from CARPOOL where " +
                 "xmlexists('declare namespace
                 def=\"http://tempuri.org/XMLSchema.xsd\";" +
                
                 "$c/def:CARPOOLINFO/def:Address[def:City=" + "\"" + cityName +
                 "\"]' passing CARPOOL.CARPOOLINFO as \"c\")" +
                 "order by ID";
                DB2DataAdapter da1 = new DB2DataAdapter(xq, m_conn);
                DataSet ds1 = new DataSet();
                da1.Fill(ds1, xsdname);
                carpoolInfo.DataSource = ds1.Tables[xsdname];               
            }
        }
 

  WHERE 子句使用 DB2 的 XMLExists() 函数限制查询所返回的数据。它规定,返回的 XML 文档只包括在 CARPOOLINFO 的 city 为某个值(San Francisco 或 San Jose)的行中的那些 XML 文档。在这个示例查询中,XMLExists() 指示 DB2 判断一个给定的 XML 文档是否包含一个包括指定城市的 CARPOOL 地址。PASSING 子句指定 XML 文档所在的位置(在 carpoolinfo 列中)。 Webjx.Com

  结束语 Webjx.Com

  IBM DB2 使程序员可以用熟悉的 SQL 语句更新和删除 XML 数据。为了更新和删除存储在 DB2 中的 XML 数据,可以使用 SQL UPDATE 和 DELETE 语句。这些语句可以包括 SQL/XML 函数,这种函数可根据 XML 列中存储的 XML 元素的值来限制目标行和列。例如,可以删除包含居住在特定城市的合伙用车者的相关信息的行,或者只更新合伙用车的开始时间在某个给定时间段内的合伙用车者的 XML(和非 XML 数据)。由于在 UPDATE 和 DELETE 语句中使用 SQL/XML 函数的语法与在 SELECT 语句中使用这些函数的语法相同,因此不再给出完整的代码示例。

共2页: 上一页 [1] 2 下一页

文章评论

共有 0 位网友发表了评论 查看完整内容