我似乎无法找到为什么此函数不会将记录插入数据库。 :( 我没有收到任何错误消息或数据库中的任何内容。
编辑:这就是我的查询现在的样子......仍然没有......
connection.Open();
XmlNodeList nodeItem = rssDoc.SelectNodes("/edno23/posts/post");
foreach (XmlNode xn in nodeItem)
{
cmd.Parameters.Clear();
msgText = xn["message"].InnerText;
C = xn["user_from"].InnerText;
avatar = xn["user_from_avatar"].InnerText;
string endhash = GetMd5Sum(msgText.ToString());
cmd.Parameters.Add("@endhash",endhash);
cmd.CommandText = "Select * FROM posts Where hash=@endhash";
SqlCeDataReader reader = cmd.ExecuteReader();
while (reader.Read())
{
string msgs = reader["hash"].ToString();
if (msgs != endhash || msgs == null)
{
sql = "INSERT INTO posts([user],msg,avatar,[date],hash) VALUES(@username,@messige,@userpic,@thedate,@hash)";
cmd.CommandText = sql;
cmd.Parameters.Add("@username", C);
cmd.Parameters.Add("@messige", msgText.ToString());
cmd.Parameters.Add("@userpic", avatar.ToString());
cmd.Parameters.Add("@thedate", dt);
cmd.Parameters.Add("@hash", endhash);
cmd.ExecuteNonQuery();// executes query
adapter.Update(data);// saves the changes
}
}
reader.Close();
}
connection.Close();
答案 0 :(得分:2)
nodeItem实际上是否包含任何项目?如果没有,则不执行foreach循环的内容。
用于适配器和数据的是什么?查询和更新似乎是通过其他命令和读者完成的。
'hash'实际包含什么?如果是哈希,为什么要在while循环中散列哈希的内容?如果没有,为什么要将它与查询SELECT * FROM posts WHERE hash = @endhash
中的哈希进行比较?
在while循环结束之前不会关闭连接会使用于控制循环的阅读器无效吗?
答案 1 :(得分:1)
这里发生了很多事情......
您正在使用命令'cmd'使用datareader循环记录,然后在while语句中使用相同的'cmd'命令来执行insert语句。您之前声明了另一个命令'cmdAdd'但似乎没有在任何地方使用它;你打算用什么来插入语句?
您还可以在遍历datareader的while循环内关闭数据连接。您只会读取一条记录,然后以这种方式关闭与数据库的连接;如果不符合插入条件,则不会向数据库写入任何内容。
编辑:
你真的应该在xmlnodes上的foreach之外打开和关闭数据库的连接。如果你有10个节点要循环,那么db连接将被打开和关闭10次(好吧,连接池可能会阻止它,但仍然......)
您还将整个“帖子”表加载到数据集中,看似没有理由。您没有更改数据集中的任何值,而是重复调用它的更新(在“save teh shanges”中)。如果'posts'表甚至是远程大的话,这将无缘无故地占用大量内存(在手持设备上,不能少)。
答案 2 :(得分:1)
为什么要在while循环中关闭数据库连接 ? 当您尝试使用未打开的数据库连接对象调用 cmd.ExecuteNonQuery()时,您发布的代码会抛出异常。
SqlCeCommand.ExecuteNonQuery()方法返回受影响的行数 你为什么不检查它是否在调试器中返回1,如下所示?
int rowsAffectedCount = cmd.ExecuteNonQuery();
希望它有所帮助: - )
答案 3 :(得分:1)
是否从“Select * FROM posts Where hash = @ endhash”返回任何内容?
如果没有,那么while循环内部什么都不重要......
答案 4 :(得分:1)
你有一些问题没有实现“使用”块。我在下面的内部代码中添加了一些内容。连接和选择命令的块对我来说是更加一厢情愿的想法。我希望你对数据适配器做同样的事情。
using (var connection = new SqlCeConnection(connectionString))
{
connection.Open();
var nodeItem = rssDoc.SelectNodes("/edno23/posts/post");
foreach (XmlNode xn in nodeItem)
{
using (
var selectCommand =
new SqlCeCommand(
"Select * FROM posts Where hash=@endhash",
connection))
{
var msgText = xn["message"].InnerText;
var c = xn["user_from"].InnerText;
var avatar = xn["user_from_avatar"].InnerText;
var endhash = GetMd5Sum(msgText);
selectCommand.Parameters.Add("@endhash", endhash);
selectCommand.CommandText =
"Select * FROM posts Where hash=@endhash";
using (var reader = selectCommand.ExecuteReader())
{
while (reader.Read())
{
var msgs = reader["hash"].ToString();
if (msgs == endhash && msgs != null)
{
continue;
}
const string COMMAND_TEXT =
"INSERT INTO posts([user],msg,avatar,[date],hash) VALUES(@username,@messige,@userpic,@thedate,@hash)";
using (
var insertCommand =
new SqlCeCommand(
COMMAND_TEXT, connection))
{
insertCommand.Parameters.Add("@username", c);
insertCommand.Parameters.Add(
"@messige", msgText);
insertCommand.Parameters.Add(
"@userpic", avatar);
insertCommand.Parameters.Add("@thedate", dt);
insertCommand.Parameters.Add(
"@hash", endhash);
insertCommand.ExecuteNonQuery();
// executes query
}
adapter.Update(data); // saves teh changes
}
reader.Close();
}
}
}
connection.Close();
}
当然,对于额外的嵌套,部件应该作为单独的方法分解。
答案 5 :(得分:0)
如何调试程序:http://www.drpaulcarter.com/cs/debug.php
说真的,你能发布一些关于它工作地点的更多信息吗?如果您使用SQL Server Express而不是SQL CE,它是否有效?如果是这样,您可以打破SQL事件探查器并查看正在执行的SQL命令吗?
答案 6 :(得分:0)
我怀疑你的问题是你正在尝试重用相同的SqlCeCommand实例。
尝试在while循环中创建一个新的SqlCeCommand。此外,您可以使用using
语句来关闭数据对象。
为什么要调用adapter.Update(data)
,因为您根本没有更改DataSet?我怀疑你想打电话给adapter.Fill(data)
。 Update
方法将DataSet中的任何更改保存到数据库中。