【问题标题】:Passing XML data to a stored procedure and getting return value from it c#?将 XML 数据传递给存储过程并从中获取返回值 c#?
【发布时间】:2017-03-13 08:35:32
【问题描述】:

我正在尝试将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 存储过程:

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))

【问题讨论】:

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


    【解决方案1】:

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

    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 就像我在上面所做的那样来模拟参数。你得到不止一排吗?

    【讨论】:

      猜你喜欢
      • 2015-09-02
      • 2018-09-13
      • 2023-03-14
      • 1970-01-01
      • 2015-08-09
      • 1970-01-01
      • 2010-10-16
      • 2018-01-13
      • 1970-01-01
      相关资源
      最近更新 更多