我试图将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))
这部分 - 隔离 - 返回两个手机号码:
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
-clause中使用此子选择来获取有关tb_registration
此手机号码所在位置的所有记录。
这应该工作...
如果您没有得到我认为的预期结果,则您在字符串级别上的比较无法正常工作。可能是,手机号码以某种方式存储在您的表中(空格、分隔符、varchar(20) 可能很小)。
尝试将您的 SP 语句放在一个简单的查询窗口中,并使用declare
我在上面所做的类似操作来模拟参数。你得到不止一排吗?
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句