将XML数据传递给存储过程并从中获取返回值c#?

时间:2017-03-13 08:35:33

标签: c# sql-server xml stored-procedures

我正在尝试将xml数据作为参数传递给存储过程并从存储过程中获取返回值。但由于某种原因,存储过程只返回最后一行的数据,我想知道如何解决这个问题。这是我到目前为止所尝试的。

C#代码:

string[] mobilenum = { "254720516010", "254718488944" };
List<string> regtoken = new List<string>();

protected void Page_Load(object sender, EventArgs e)
{
    DataTable table = new DataTable();
    DataSet ds = new DataSet();

    DataTable ts = new DataTable();
    ts.Columns.Add("MobileNumber", typeof(string));
    foreach (string c in mobilenum)
    {
        ts.Rows.Add(c);
    }

    DataSet dset = new DataSet();
    dset.Tables.Add(ts);
    string res = dset.GetXml();

    String con = @"Data Source=***********;Initial Catalog=Peace;User ID=*****;Password=****";

    using (SqlConnection conn = new SqlConnection(con))
    {

        SqlCommand cmd = new SqlCommand("p_getPushToken1", conn);
        cmd.CommandType = CommandType.StoredProcedure;

        cmd.Parameters.Add(new SqlParameter("@DetailRecord", res));
        using (SqlDataAdapter da = new SqlDataAdapter(cmd))
        {
            da.Fill(ds, "Dataitems");
        }

        if (ds != null)
        {
            if (ds.Tables.Count > 0)
            {
                if (ds.Tables["Dataitems"].Rows.Count > 0)
                {
                    foreach (DataRow dr in ds.Tables["Dataitems"].Rows)
                    {

                        regtoken.Add(dr["Token"].ToString());
                    }
                }
            }
        }
    }
}

res(XML)字符串的值为:

<NewDataSet>
  <Table1>
    <MobileNumber>254720516010</MobileNumber>
  </Table1>
  <Table1>
    <MobileNumber>254718488944</MobileNumber>
  </Table1>
</NewDataSet>

SQL SERVER STORED PROCEDURE:

USE [Peace]
GO
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
ALTER proc [dbo].[p_GetPushToken1]
(
    @DetailRecord   XML
)
as    
    SELECT
        MobileNumber,
        FirstName,
        LastName,
        Token
    FROM tb_Registration WHERE MobileNumber IN(
    SELECT  Customer.x.value('MobileNumber[1]', 'varchar(20)')
    FROM @DetailRecord.nodes('NewDataSet/Table1') AS Customer(x))

1 个答案:

答案 0 :(得分:0)

此部分 - 隔离 - 返回两个手机号码:

DECLARE @DetailRecord XML=
N'<NewDataSet>
  <Table1>
    <MobileNumber>254720516010</MobileNumber>
  </Table1>
  <Table1>
    <MobileNumber>254718488944</MobileNumber>
  </Table1>
</NewDataSet>';

 SELECT  Customer.x.value('MobileNumber[1]', 'varchar(20)')
 FROM @DetailRecord.nodes('NewDataSet/Table1') AS Customer(x)

您正在IN - 子句中使用此子选项来获取找到此移动电话号码的tb_registration 的所有记录。

这应该有用......

如果你没有得到预期的结果我会假设你的字符串级别的比较不能正常工作。可能是,移动号码以某种方式存储在您的表中(空格,分隔符,varchar(20)可能会很小)。

更新

尝试将您的SP语句放在一个简单的查询窗口中,并使用declare,就像我上面做的那样来模拟参数。你回来的行多了吗?