2

私は自分のサイト用に小さなウェブクローラーを書いています。それはうまくいくようです。私はすべてのリンクを閲覧し、それが私のホームページに属しているかどうかを確認します. リンクが見つかった場合は、「addSite()」でサイトを追加します。これは最初に URl が同じエントリを取得しようとし、エントリがない場合は URl を追加します。それ以外の場合は、コンテンツ ハッシュが変更された場合に更新します。問題は、存在する場合でも URl を追加することです。

これは私の方法です:

private bool addSite(string url, string title, string content)
{
    string hash = md5Hash(content);
    List<object[]> res = sql.executeReader(string.Format("SELECT `hash` FROM `sites` WHERE `url` = '{0}'", MySqlHelper.EscapeString(url)));
    if (res.Count > 0)
    {
        if (res[0][0].ToString() != hash)
        {
            sql.executeQuery(string.Format("UPDATE `sites` SET title = '{0}', content = '{1}', hash = '{2}' WHERE url = '{3}'", MySqlHelper.EscapeString(title), MySqlHelper.EscapeString(content), hash, MySqlHelper.EscapeString(url)));
            return true;
        }
        return false;
    }
    sql.executeQuery(string.Format("INSERT INTO `sites`(url, title, hash, content) VALUES('{0}', '{1}', '{2}', '{3}')", MySqlHelper.EscapeString(url), MySqlHelper.EscapeString(title), hash, MySqlHelper.EscapeString(content)));
    Console.WriteLine("Added: " + url);
    return true;
}

誰でも失敗を見つけることができれば幸いです。どうもありがとうございました。

4

2 に答える 2

2

繰り返したくないフィールドがある場合。データベースフィールドを一意に設定しないのはなぜですか。プログラムのエラーをキャッチするか、存在する場合は必要に応じて実行します。データベースがそれを許可する場合、文字列は大文字やスペースなどによって異なります。

于 2012-08-27T10:33:28.900 に答える
1

よくわかりませんが、他に追加する必要があるかもしれません:

    private bool addSite(string url, string title, string content)
    {
        string hash = md5Hash(content);
        List<object[]> res = sql.executeReader(string.Format("SELECT `hash` FROM `sites` WHERE `url` = '{0}'", MySqlHelper.EscapeString(url)));
        if (res.Count > 0)
        {
            if (res[0][0].ToString() != hash)
            {
                sql.executeQuery(string.Format("UPDATE `sites` SET title = '{0}', content = '{1}', hash = '{2}' WHERE url = '{3}'", MySqlHelper.EscapeString(title), MySqlHelper.EscapeString(content), hash, MySqlHelper.EscapeString(url)));
                return true;
            }
            return false;
        }
        else
        {
            sql.executeQuery(string.Format("INSERT INTO `sites`(url, title, hash, content) VALUES('{0}', '{1}', '{2}', '{3}')", MySqlHelper.EscapeString(url), MySqlHelper.EscapeString(title), hash, MySqlHelper.EscapeString(content)));
            Console.WriteLine("Added: " + url);    
        }
    return true;
}
于 2012-08-27T10:47:03.437 に答える