我得到的任何想法"未处理的类型' 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);
}
}
}
答案 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作为参数类型,并将大小设置为与列名相同的大小....