将Scraped结果插入SQL Server

时间:2014-09-21 14:23:07

标签: c# html sql-server

我得到的任何想法"未处理的类型' System.Data.SqlClient.SqlException'发生在System.Data.dll"当我尝试将sccraping的结果插入SQL SERVER时?

这是我正在使用的代码:

public void scrape(string URL)
{
    using (SqlConnection opencon = new SqlConnection("CONNECTION STRING"))
    {
        string saveStaff = "INSERT into Principale ((Name) VALUES (@Name)";
        opencon.Open();
        HttpWebRequest request = (HttpWebRequest)WebRequest.Create(URL);
        request.UserAgent = "Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; SV1; .NET CLR 1.1.4322; .NET CLR 2.0.50727)";
        request.AllowAutoRedirect = false;

        WebResponse response = request.GetResponse();
        StreamReader streamreader = new StreamReader(response.GetResponseStream());
        string html = streamreader.ReadToEnd();

        HtmlDocument page = new HtmlDocument();
        page.LoadHtml(html);
        var document = page.DocumentNode.SelectNodes("//div[@class='b_Namesummary']");

        foreach (var nodo in document)
        {

            String nome = nodo.SelectSingleNode("./h3[1]/a[1]").InnerText;
            SqlCommand querySaveStaff = new SqlCommand(saveStaff);
            querySaveStaff.Connection = opencon;
            querySaveStaff.Parameters.Add("@Name", SqlDbType.NChar, 30).Value = nome;
            querySaveStaff.ExecuteNonQuery();
            Console.WriteLine(nome);
        }
    }
}

2 个答案:

答案 0 :(得分:3)

这个

 "INSERT into Principale (Name VALUES (@Name)";

应该是

 "INSERT into Principale (Name) VALUES (@Name)";

使用using打开连接时,也无需显式关闭连接。

当使用块超出范围时,将自动关闭连接。 (使用using而不是Try, catch, finnaly

的一个很好的理由
    opencon.Close();   // not needed 

答案 1 :(得分:0)

我认为sql异常,除了缺少右括号的明显语法错误之外(一个错字?)来自于你声明一个名为@AlbergoName的参数,但在sql文本中你使用了@name占位符

更改为:

string saveStaff = "INSERT into Principale (Name) VALUES (@AlbergoName)";

顺便说一下,你不需要在循环中创建一个SqlCommand,只需在外面创建它并更新它的参数值

SqlCommand querySaveStaff = new SqlCommand(saveStaff);
querySaveStaff.Connection = opencon;
querySaveStaff.Parameters.Add("@AlbergoName", SqlDbType.NVarChar, 30);
foreach (var nodo in document)
{
    string nome = nodo.SelectSingleNode("./h3[1]/a[1]").InnerText;
    Console.WriteLine(nome);

    querySaveStaff.Parameters["@AlbergoName"].Value = nome;
    querySaveStaff.ExecuteNonQuery();
}

另请注意,我已将参数类型更改为NVARCHAR而非NCHAR。 NChar是固定长度类型,因此如果您声明NChar 30,则无论变量nome的长度如何,都会传递30个字符。我建议使用NVARCHAR作为参数类型,并将大小设置为与列名相同的大小....