这个查询我做错了什么?

时间:2009-07-15 17:20:49

标签: c# .net sql sql-server database

我似乎无法找到为什么此函数不会将记录插入数据库。 :( 我没有收到任何错误消息或数据库中的任何内容。

编辑:这就是我的查询现在的样子......仍然没有......

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();

7 个答案:

答案 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中的任何更改保存到数据库中。