2014-09-21 43 views
0

任何想法爲什麼我得到「System.Data.dll中發生類型'System.Data.SqlClient.SqlException'的未處理異常」,當我嘗試將sccraping的結果插入SQL SERVER時?將損壞的結果插入到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

仔細查看異常情況,您應該有一個InnerException,它可以更好地告訴您的調用出了什麼問題。 – Steve 2014-09-21 14:36:50

回答

0

我認爲SQL異常,除了明顯的語法錯誤缺少右括號,(筆誤?)來自於事實,你聲明參數命名@AlbergoName但在SQL文本中使用@name佔位符代替

更改爲:

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

順便說一句,你不需要創建循環內的SqlCommand的,只是創建IT運utside並更新其參數值

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作爲參數類型,並將大小設置爲與列名相同的大小....

+0

我編輯了上面的代碼(對不起,我嘗試了各種解決方法,併發布了一個混亂的代碼)與您建議的更正。 我仍然收到截斷數據的錯誤。 感謝您的快速回復! – Jack 2014-09-21 14:44:10

+0

那麼,現在的問題是傳遞到您的名稱字段的數據的長度。您聲明參數爲30個字符,但數據表中字段的長度是多少?使用NVARCHAR參數並確保它不大於列 – Steve 2014-09-21 14:45:32

+0

不要忘記,如果該字段在SQL Server中定義爲「nvarchar」,那麼字段大小的長度SQL Server報告是實際大小的兩倍;所以,如果SQL Server表示長度爲30,那麼只能在該字段中插入15個字符。 – 2014-09-21 14:50:24

3

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

應該

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

而且你並不需要顯式地關閉連接時,您使用using打開連接。

當使用塊超出範圍時,連接將自動關閉。 (一個很好的理由來使用using超過Try, catch, finnaly

opencon.Close(); // not needed 
+0

'querySaveStaff.Parameters.Add(「@ AlbergoName」,SqlDbType.NChar,30).'和'String nome = nodo.SelectSingleNode(「./h3 [1]/a [1]」)。InnerText;' – bummi 2014-09-21 14:34:47

+0

哇,超快回復!修正了它,但仍然出現錯誤,它表示字符串或二進制數據可能被截斷。問題可能出現在代碼的Foreach部分中... 感謝Close()提示,我不知道它可以省略! – Jack 2014-09-21 14:36:52