**已关闭。**此问题需要debugging details。目前不接受回答。
编辑问题以包括desired behavior, a specific problem or error, and the shortest code necessary to reproduce the problem。这将帮助其他人回答问题。
两年前关闭了。
Improve this question
我有一个来自客户端的OAuth2.0 Json数据。我必须从特定的API中将所有数据拉到我的SQL数据库中。这个API有一些验证,比如它们一次只能显示250个数据,接下来我们使用不同的参数再次运行API。API数据的结构如下所示。
{
"next": URL or null, // URL of the next page (same as the requested URL, but with the page query parameter incremented)
"previous": URL or null, // URL of the previous page
"results": array of result objects // the results follow the same format as `:endpoint/:id`
}
对于下一个或前一个数据,我们必须运行URL到达的前一个或下一个。
我自动将数据从这个API导入到我的SQL数据中。但是在一些循环之后,我得到了这个错误。x1c 0d1x
在此之后,其余的数据,我不能导入到我的SQL数据库。我的工作博士计时API导入他们的数据到我的系统。我不知道该怎么办这种类型的条件。
下面的代码:-
private void recursivemethod(List<string> lstarray, String token, string URL, string flag, StringBuilder sb)
{
RestClient client = new RestClient(URL);
RestRequest request = new RestRequest(Method.GET);
request.Parameters.Clear();
client.Timeout = -1;
request.AddHeader("authorization", "Bearer " + token);
request.AddHeader("Content-Type", "application/x-www-form-urlencoded");
request.AddHeader("cache-control", "no-cache");
IRestResponse response = client.Execute(request);
////Using dynamic keyword with JsonConvert.DeserializeObject, here you need to import Newtonsoft.Json
dynamic myObject = JsonConvert.DeserializeObject(response.Content);
if (flag == "patient")
{
PatientMain items = JsonConvert.DeserializeObject<PatientMain>(response.Content);
int i = 0;
lstarray.Clear();
foreach (var type in items.results)
{
i++;
lstarray.Add("INSERT INTO drchrono_patient(id,chart_id,first_name,middle_name,last_name,date_of_birth,gender,social_security_number,race,ethnicity,preferred_language,patient_status,home_phone,cell_phone,office_phone,email,address,city,state,zip_code,doctor,primary_care_physician,date_of_first_appointment,date_of_last_appointment,default_pharmacy,referring_source,copay,updated_at) VALUES ('" + convertQuotes(type.id) + "','" + convertQuotes(type.chart_id) + "','" + convertQuotes(type.first_name) + "','" + convertQuotes(type.middle_name) + "','" + convertQuotes(type.last_name) + "','" + convertQuotes(type.date_of_birth) + "','" + convertQuotes(type.gender) + "','" + convertQuotes(type.social_security_number) + "','" + convertQuotes(type.race) + "','" + convertQuotes(type.ethnicity) + "','" + convertQuotes(type.preferred_language) + "' ,'" + convertQuotes(type.patient_status) + "','" + convertQuotes(type.home_phone) + "','" + convertQuotes(type.cell_phone) + "','" + convertQuotes(type.office_phone) + "','" + convertQuotes(type.email) + "','" + convertQuotes(type.address) + "','" + convertQuotes(type.city) + "','" + convertQuotes(type.state) + "','" + convertQuotes(type.zip_code) + "','" + convertQuotes(type.doctor) + "','" + convertQuotes(type.primary_care_physician) + "','" + convertQuotes(type.date_of_first_appointment) + "','" + convertQuotes(type.date_of_last_appointment) + "','" + convertQuotes(type.default_pharmacy) + "','" + convertQuotes(type.referring_source) + "','" + convertQuotes(type.copay) + "','" + convertQuotes(type.updated_at) + "') ");
}
string result = dbf.pExecuteQueryList(lstarray);
if (items.next != null)
{
URL = items.next;
recursivemethod(lstarray, token, URL, flag, sb);
}
}
}
2条答案
按热度按时间lmvvr0a81#
考虑使用循环而不是递归。你可以保持你的大部分逻辑不变,只是重新构造你重复它的方式。让我们从改变方法签名来返回一个值开始。类似这样的事情应该会起作用:
在该方法中,不是递归返回自身,而是返回URL值:
型
(在方法的其他地方,可以默认为
return null;
,以便所有代码路径都返回一个值。)从概念上讲,循环可以是这样的:
基本上,递归在这里不是必须的,你重复一个动作的次数是未知的,但是这个未知的动态值仍然可以用作循环条件,不需要递归。
rqqzpn5f2#
您有一个
StackOverflow
exception。请参阅Microsoft文档:当执行堆栈因包含太多嵌套方法调用而溢出时引发的异常。
在本文档的后面
[...]通常在非常深**或无界递归的情况下[..]
实际上,您的停止条件可能工作正常,只是在execution stack(应用程序必须运行的内存量)满之前永远不会达到它。
通常情况下,当应用程序运行时,每个变量、数据结构、不再使用的对象都将从内存中删除,并可用于存储其他内容。
递归的问题是,在递归完成之前,内存无法清空或优化,内存将被填满,并在某个时候耗尽。
我不确定递归是不是一个好的选择,你可以简单地做一个循环,这将是更有效的内存,允许系统清理内存之间的每一个迭代。
如果您需要坚持使用递归,则应考虑重新建模代码,将所有变量作为reference传递,否则执行堆栈将充满大量不需要复制的无用复制数据。