如何解决我的程序逻辑出了什么问题
| 请帮助我找出我的逻辑缺陷。我有两个分别名为\“ prev \”和\“ next \”的变量...我基本上在做的是每5秒从我的数据库中读取一次数据,如果next和prev不相等,则使用Websync服务器将其打印出来。我的数据库中有两行。看起来像ID
8
10
这是代码链接http://pastebin.com/Hb3eH2Qv
当我运行程序时,得到的结果为
8 10 8 10
8 10
8 10 8 10
8 10
.....(依此类推)
但是,结果应该是
8 10
我不知道ѭ3的出现。数据被串联两次。
注意:您只能在PublishLoop()
功能中看到代码
private void PublishLoop()
{
String prev=String.Copy(\"\");
String next=String.Copy(\"\");
String ConnectionString = ConfigurationManager.ConnectionStrings[\"MyDbConn\"].ToString();
SqlConnection connection = new SqlConnection(ConnectionString);
SqlCommand command = connection.CreateCommand();
command.CommandText = \"select ID from Tab1\";
command.Notification = null;
while (Running)
{
connection.Open();
using (SqlDataReader reader = command.ExecuteReader(CommandBehavior.CloseConnection))
{
StreamWriter sw1 = new StreamWriter(\"C:\\\\Users\\\\Thothathri\\\\Desktop\\\\next.txt\");
while ((reader.Read()))
{
//Response.Write(reader[0].ToString());
next = String.Concat(next,reader[0].ToString());
sw1.WriteLine(next);
}
sw1.Close();
if (!prev.Equals(next))
{
Publisher publisher = new Publisher(new PublisherArgs
{
DomainKey = \"c80cb405-eb77-4574-9405-5ba51832f5e6\",DomainName=\"localhost\"
});
Publication publication = publisher.Publish(\"/test\",JSON.Serialize(next));
if (publication.Successful == true)
{
StreamWriter sw = new StreamWriter(\"C:\\\\Users\\\\Thothathri\\\\Desktop\\\\error123.txt\");
sw.WriteLine(\"success\");
sw.WriteLine(next);
sw.Close();
}
else
{
StreamWriter sw = new StreamWriter(\"C:\\\\Users\\\\Thothathri\\\\Desktop\\\\error123.txt\");
sw.Write(\"failed\");
sw.Close();
}
prev = String.Copy(next);
next = String.Copy(\"\");
}
}
Thread.Sleep(5000);
}
}
解决方法
Renuiz在评论中回答了它,但这是因为您不打算下一步清除。
因此,您接下来将构建字符串“ 8 10”,并将其存储在上一页中。下次您与下一个连接\“ 8 10 \”时,将\“ 8 10 8 10 \”。哪一个不同,所以您可以打印它。
if (!prev.Equals(next))
{
....
prev = String.Copy(next);
next = String.Copy(\"\");
}
这是循环的结束。您实际上应该在该循环的开始进行下一步清除。
你也可以设置字符串
next = String.Empty;
我将在您的while循环中声明next,因为您不需要在更大范围内使用它,我将其称为current而不是next。
, 您的程序逻辑真正出了什么问题-逻辑并不明显。它太模糊了,您无法理解错误在哪里。因此,我的建议是-如果找不到错误,请尝试简化代码。
当前,您的方法有很多责任-它查询数据库,将数据转储到文件,将数据发布到某个地方并记录结果。而且您坚持了所有这些东西。如果某人需要更改数据库查询或发布逻辑-他将需要检查所有其他内容。
因此,首先需要单独的逻辑:
private void PublishLoop()
{
string previousIDs = String.Empty;
int timeout = Int32.Parse(ConfigurationManager.AppSettings[\"publishTimeout\"]);
while (Running)
{
string currentIDs = ConcatenateList(LoadIDs());
Dump(currentIDs);
if (!previousIDs.Equals(currentIDs))
{
try
{
Publish(currentIDs);
_log.Info(\"Published successfuly\");
}
catch (PublicationException exception)
{
_log.Error(\"Publication failed\");
}
previousIDs = currentIDs;
}
Thread.Sleep(timeout);
}
}
好吧,我对您的域了解不多,因此您可能会考虑使用更好的变量和方法名称。
在这里,您已将数据访问逻辑提取为单独的方法(对于第一步的重构和小型应用程序来说是可以的)。请记住,将连接对象包装到using块中可确保在发生异常时关闭连接:
private IList<int> LoadIDs()
{
List<int> ids = new List<int>();
String connectionString = ConfigurationManager.ConnectionStrings[\"MyDbConn\"].ConnectionString;
using (SqlConnection connection = new SqlConnection(connectionString))
{
SqlCommand command = connection.CreateCommand();
command.CommandText = \"select ID from Tab1\";
command.Notification = null;
connection.Open();
using (SqlDataReader reader = command.ExecuteReader(CommandBehavior.CloseConnection))
{
while ((reader.Read()))
ids.Add((int)reader[\"ID\"]);
}
}
return ids;
}
下一步-将ID连接成一个字符串的简单方法:
private string ConcatenateList(IList<int> values)
{
return String.Join(\" \",values.Select(value => value.ToString()).ToArray());
}
转储(注意,该文件名已移至配置文件):
private void Dump(string ids)
{
using (StreamWriter writer = new StreamWriter(ConfigurationManager.AppSettings[\"dumpFilePath\"]))
writer.WriteLine(ids);
}
和发布逻辑:
private void Publish(string ids)
{
PublisherArgs args = new PublisherArgs
{
DomainKey = \"c80cb405-eb77-4574-9405-5ba51832f5e6\",DomainName = \"localhost\"
};
Publisher publisher = new Publisher(args);
Publication publication = publisher.Publish(\"/test\",JSON.Serialize(ids));
if (!publication.Successful)
throw new PublicationException();
}
我认为失败是一种例外,而且这种失败很少发生(因此,我决定在这种情况下使用例外)。但是,如果这很普通-您可以简单地使用TryPublish之类的布尔方法。
顺便说一句,您可以使用诸如log4net之类的日志记录库来记录成功和失败的发布。或者,您可以将日志记录逻辑提取为单独的方法-这将使主要逻辑更加整洁和易于理解。
PS尽量避免将布尔变量与true / false(publication.Successful == true)进行比较-您有时可以为变量分配值。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。