【问题标题】:How to write query to generate XML file from SQL Server table如何编写查询以从 SQL Server 表生成 XML 文件
【发布时间】:2014-10-09 05:38:49
【问题描述】:

您好,请告诉我如何使用查询从 SQL Server 中的表生成 XML 文件。 我的查询是,

 select JobTitle as title,PostedDate as date from Jobs 

C#代码,

 protected void btnXML_Click(object sender, EventArgs e)
        {
            try
            {
                DataSet dsJobsDetails = new DataSet();
                dsJobsDetails = GetJobDetails();
                string fileLoc = @"C:\JobDocuments\jobsxml.xml";
                FileStream fs = null;
                fs = File.Create(fileLoc);
                fs.Close();
                if (File.Exists(fileLoc))
                {
                    dsJobsDetails.WriteXml(fileLoc);
                }
            }
            catch { }
        }


private DataSet GetJobDetails()
        {
            DataSet ds = null;
            SQLProvider provider = new SQLProvider();
            SqlParameter[] paramCandidate = new SqlParameter[2];

            try
            {
                paramCandidate[0] = provider.MakeParameter("JobID", SqlDbType.VarChar, "0");
                paramCandidate[1] = provider.MakeParameter("AccountID", SqlDbType.Int, "0");
                ds = provider.RunProcedure("Usp_GetJobsDetailsForXML", paramCandidate);
            }
            catch (Exception ex)
            {
                SetLastError(ex);
                paramCandidate = null;
                provider = null;
                ds = null;
            }
            finally
            {
                paramCandidate = null;
                provider = null;
            }
            return ds;
        }

我的存储过程是,

CREATE PROCEDURE [dbo].[Usp_GetJobsDetailsForXML]          
(                                   
    @JobID varchar(8000),  
    @AccountID int              
)                                  
AS                              

BEGIN                                                                   

    SET NOCOUNT ON;                                        
     select JobTitle as title,PostedDate as date,JobDescription as [description] from Jobs 
     where JobID in (@JobID)   
     --FOR XML PATH('Jobs')                                                   
END

输出如下,

 <NewDataSet>
    <Table>
      <title>DBA</title> 
      <date>2014-09-30</date> 
      </Table>
     <Table>
      <title>Manager</title> 
      <date>2014-09-30</date>
     </Table>
    </NewDataSet>

在这里,我想将根节点添加为作业,将子根节点添加为作业。我试过了 select JobTitle as title,PostedDate as date from Jobs FOR XML PATH('jobs') 它不工作。 我想要输出如下,

<jobs>
<job>
<title>
<![CDATA[ DBA ]]>
</title>
<date>
<![CDATA[ 2014-09-30 ]]>
</date>
</job>
<job>
<title>
<![CDATA[ Manager ]]>
</title>
<date>
<![CDATA[ 2014-09-30 ]]>
</date>
</job>
<jobs>

谢谢你..

【问题讨论】:

    标签: c# sql xml sql-server-2008


    【解决方案1】:

    试试这个

        SELECT '<![CDATA[' + JobTitle + ']]>' as title,
           '<![CDATA[' + PostedDate + ']]>'  as date,
           '<![CDATA[' + JobDescription + ']]>' as [description] 
    FROM Jobs 
         WHERE JobID in (@JobID)   
         FOR XML PATH('Job'), ROOT('JOBS')
    

    【讨论】:

    • 谢谢@Abhishek,我尝试了你的代码..它给出的输出是这样的.. - - ....>
    • 嗨 1612,生成整个代码非常困难,在这种情况下我的方法是:从存储过程中,我将返回“xml”,在 c# 代码中,我将选择字符串而不是数据集.并且在写入 xml 文件之前将简单地应用 linq 来获取 元素。 LinQ like 'var result = xmldoc.Element("Jobs"))'......... 将完成消除元素的工作,例如 '‌​18A1-11d1-B105-00805F49916B> '.
    • 谢谢@Abhishek,如果我从查询中删除' FOR XML PATH('Job'), ROOT('JOBS') '。但我得到 节点。
    【解决方案2】:
            DataSet dst = new DataSet("Jobs");
            DataTable table = new DataTable("Job");
    
            DataColumn c1 = new DataColumn("Title");
            DataColumn c2 = new DataColumn("Date");
            table.Columns.Add(c1);
            table.Columns.Add(c2);
    
            DataRow row1 = table.NewRow();
            row1["Title"] = "T1";
            row1["Date"] = "D1";
    
            DataRow row2 = table.NewRow();
            row2["Title"] = "T2";
            row2["Date"] = "D2";
    
            table.Rows.Add(row1);
            table.Rows.Add(row2);
    
            dst.Tables.Add(table);
    
            string p = dst.GetXml();
    

    这是您需要做的示例。在您的情况下,当您在方法GetJobDetails 中从数据库中获取数据时,您应该返回DataSetDataSetName = "Jobs"DataTable 的 defaultTableName 应该是 Job!

    因为我给你写了这个例子,所以你没有展示从数据库中获取数据的方法!

    编辑:

    首先在btnXML_Click这样写:

    DataSet dsJobsDetails = GetJobDetails();
    

    而不是

    DataSet dsJobsDetails = new DataSet();
    dsJobsDetails = GetJobDetails();
    

    private DataSet GetJobDetails() 中这样写:

    DataSet ds = new DataSet("Jobs");

    代替:

    DataSet ds = null;
    

    SQLProvider 类中,您应该添加属性 TableName 和 DataSqlAdapter.Fill 时这样的查询:

     using (SqlDataAdapter adapter = new SqlDataAdapter(cmd))
     {
         adapter.Fill(resultDst, TableName);
     }
    

    您需要将属性TableName的值设置为Job

    【讨论】:

    • @1612 希望你是用SqlDataAdapter.Fill方法返回dataSet?
    • @1612 我不能说得更具体,希望对你有帮助。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-10-26
    • 2013-09-10
    • 2016-10-12
    • 1970-01-01
    • 2013-02-01
    • 1970-01-01
    相关资源
    最近更新 更多