我正在尝试通过CLR存储过程使用rest / json get api。我的问题是我只得到一个(最后一个)记录。
这是我的代码:
public partial class StoredProcedures
{
[Microsoft.SqlServer.Server.SqlProcedure]
public static void FrtApiJsonGet ()
{
HttpWebRequest request = (HttpWebRequest)WebRequest.Create("some site");
var byteArray = Encoding.ASCII.GetBytes("login:password");
request.Method = "GET";
request.Headers.Add(HttpRequestHeader.Authorization, "Basic " +
Convert.ToBase64String(byteArray));
using(HttpWebResponse response = (HttpWebResponse)request.GetResponse())
{
using (Stream receiveStream = response.GetResponseStream())
{
using (StreamReader readStream = new StreamReader(receiveStream,
Encoding.UTF8))
{
string strContent = readStream.ReadToEnd();
string value1 = string.Empty;
string value2 = string.Empty;
string value3 = string.Empty;
string value4 = string.Empty;
SqlPipe pipe = SqlContext.Pipe;
SqlMetaData[] cols = new SqlMetaData[4];
cols[0] = new SqlMetaData("value1", SqlDbType.NVarChar, 50);
cols[1] = new SqlMetaData("value2", SqlDbType.NVarChar, 50);
cols[2] = new SqlMetaData("value3", SqlDbType.NVarChar, 50);
cols[3] = new SqlMetaData("value4", SqlDbType.NVarChar, 50);
SqlDataRecord record = new SqlDataRecord(cols);
pipe.SendResultsStart(record);
var strArray = strContent.Split(new string[] { "{,}" },
StringSplitOptions.None);
foreach(var str in strArray)
{
var subArray = str.Split(',');
foreach (var substr in subArray)
{
if (substr.Contains("\"value1\""))
value1 = substr.Split('\"')[3];
if (substr.Contains("\"value2\""))
callKey = substr.Split('\"')[3];
if (substr.Contains("\"value3\""))
callPhase = substr.Split('\"')[3];
if (substr.Contains("\"value4\""))
callresult = substr.Split('\"')[3];
}
record.SetSqlString(0, new SqlString(value1));
record.SetSqlString(1, new SqlString(value2));
record.SetSqlString(2, new SqlString(value3));
record.SetSqlString(3, new SqlString(value4));
pipe.SendResultsRow(record);
value1 = string.Empty;
value2 = string.Empty;
value3 = string.Empty;
value4 = string.Empty;
}
pipe.SendResultsEnd();
}
}
}
}
}
我知道api可以正常工作,并且如果我在控制台应用程序中尝试不带sqlpipe的相同代码,它会返回值列表...但是当用作clr存储过程时,我只会得到一个(最后一个)记录。
答案 0 :(得分:1)
就SendResultsStart
,SendResultsRow
和SendResultsEnd
的处理而言,总体结构似乎是正确的。
下一个要检查的地方是循环本身。最初的Split
很可能没有按照您认为的那样发生。您应该在pipe.Send(str);
之前加入var subArray = str.Split(',');
,以便了解如何将响应分成几行。这会将每个块发送到“消息”选项卡,以便您可以对其进行调试(与通过T-SQL进行PRINT
一样)。