2013-05-19 37 views
0

這是我第一次使用sql和asp.net。我正在研究幾個示例,以確保我擁有所有我需要的基礎知識。我正在通過一個教程,一切都應該工作得很好,我得到一個.ExecuteNonQuery()錯誤。 SqlException未被用戶代碼處理//關鍵字'Table'附近的語法錯誤。.ExecuteNonQuery()sql asp.net錯誤

如果您有任何指示,請告訴我。我做了兩次這個教程,我確信我在這裏做錯了什麼。 -Thanks

.CS代碼:

using System; 
using System.Collections.Generic; 
using System.Linq; 
using System.Web; 
using System.Web.UI; 
using System.Web.UI.WebControls; 
using System.Data.SqlClient; 
using System.Configuration; 

namespace WebSite 
{ 
public partial class _default : System.Web.UI.Page 
{ 
    SqlConnection con = new SqlConnection(ConfigurationManager.ConnectionStrings["ConnectionString"].ConnectionString); 

    protected void Page_Load(object sender, EventArgs e) 
    { 
     con.Open(); 
    } 

    protected void Button1_Click(object sender, EventArgs e) 
    { 
     SqlCommand cmd = new SqlCommand("insert into Table values('" + txtfName.Text + "','" + txtlName.Text + "','" + txtpNumber.Text + "')", con); 
     cmd.ExecuteNonQuery(); 
     con.Close(); 
     Label1.Visible = true; 
     Label1.Text = "Your DATA has been submitted"; 
     txtpNumber.Text = ""; 
     txtlName.Text = ""; 
     txtfName.Text = ""; 
    } 
    } 
} 

.aspx文件:

<form id="form1" runat="server"> 
<div class="auto-style1"> 

    <strong>Insert data into Database<br /> 
    <br /> 
    </strong> 

</div> 
    <table align="center" class="auto-style2"> 
     <tr> 
      <td class="auto-style3">First Name:</td> 
      <td class="auto-style4"> 
       <asp:TextBox ID="txtfName" runat="server" Width="250px"></asp:TextBox> 
      </td> 
     </tr> 
     <tr> 
      <td class="auto-style3">Last Name:</td> 
      <td class="auto-style4"> 
       <asp:TextBox ID="txtlName" runat="server" Width="250px"></asp:TextBox> 
      </td> 
     </tr> 
     <tr> 
      <td class="auto-style3">Phone Number:</td> 
      <td class="auto-style4"> 
       <asp:TextBox ID="txtpNumber" runat="server" Width="250px"></asp:TextBox> 
      </td> 
     </tr> 
     <tr> 
      <td class="auto-style3">&nbsp;</td> 
      <td class="auto-style4"> 
       <asp:Button ID="Button1" runat="server" OnClick="Button1_Click" Text="Submit" Width="150px" /> 
      </td> 
     </tr> 
    </table> 
    <br /> 
    <br /> 
    <asp:Label ID="Label1" runat="server" ForeColor="#663300" style="text-align: center" Visible="False"></asp:Label> 
    <br /> 
    <asp:SqlDataSource ID="SqlDataSource1" runat="server" ConnectionString="<%$ ConnectionStrings:ConnectionString %>" SelectCommand="SELECT * FROM [Table]"></asp:SqlDataSource> 
</form> 

SQL數據庫:

CREATE TABLE [dbo].[Table] (
[Id]  INT   IDENTITY (1, 1) NOT NULL, 
[fName] VARCHAR (50) NOT NULL, 
[lName] VARCHAR (50) NOT NULL, 
[pNumber] VARCHAR (50) NOT NULL, 
PRIMARY KEY CLUSTERED ([Id] ASC) 
); 
+1

[SQL注入警報](http://msdn.microsoft.com/en-us/library/ms161953%28v=sql.105%29.aspx) - 您應該**不**將您的SQL語句連接在一起 - 使用**參數化查詢**來代替以避免SQL注入 –

回答

4

通常此錯誤信息是由一個單引號出現在引起您的輸入文本框或使用保留關鍵字。這兩個問題都存在於您的查詢中。表詞是reserved keyword for SQL Server,因此,你應該用方括號將其封裝,而對於一個單引號在輸入文本中可能存在的正確方法是使用Parameterized Query這樣

SqlCommand cmd = new SqlCommand("insert into [Table] values(@fnam, @lnam, @pNum)", con); 
cmd.Parameters.AddWithValue("@fnam", txtfName.Text); 
cmd.Parameters.AddWithValue("@lnam", txtlName.Text); 
cmd.Parameters.AddWithValue("@pNum", txtpNumber.Text); 
cmd.ExecuteNonQuery(); 

用這種方法你轉移工作解析您輸入文本的框架代碼,你避免解析文本和Sql Injection

還有問題,我建議不要使用一個全局變量保持的SqlConnection參考。這是一個昂貴的資源,如果您忘記關閉並處理它,可能會對應用程序的性能和穩定性產生重大影響。
對於這種情況using statement是你真正需要的

using(SqlConnection con = new SqlConnection(ConfigurationManager.ConnectionStrings 
          ["ConnectionString"].ConnectionString)); 
{ 
    con.Open(); 
    SqlCommand cmd = new SqlCommand("insert into [Table] values(@fnam, @lnam, @pNum)", con); 
    cmd.Parameters.AddWithValue("@fnam", txtfName.Text); 
    cmd.Parameters.AddWithValue("@lnam", txtlName.Text); 
    cmd.Parameters.AddWithValue("@pNum", txtpNumber.Text); 
    cmd.ExecuteNonQuery(); 
} 

當然刪除全局變量,在Page_Load

+1

+1,但我也相信你需要將你的sql作爲:'insert into [Table] values ....',因爲表格實際上是名稱被使用: - /和是一個保留關鍵字。 – Aristos

+0

是@Aristos我也添加了這個,尋找正確的鏈接添加到答案 – Steve

+0

這是第一個地方的實際錯誤,但很好給他這個完整的答案。名字表是非常基本的,就像選擇:)當你創建一個表時!有它,並在他們的問題:)... – Aristos

-1

無論您使用的ExecuteNonQuery開放(),你應該抓住的SQLException,或者你需要拋出你的功能。

在上面給出的情況下Button1_Click是使用SqlCommand類的ExecuteNonQuery()函數。

現在發生了什麼,該函數(ExecuteNonQuery)有定義來拋出SqlException。所以你有兩個選擇 - 你也可以拋出的SQLException - 或者你可以把這個線在try catch塊來處理異常。

3

您的查詢試圖插入名爲Table的表中。這真的存在嗎?如果不是,則將實際的表名稱放入查詢中。如果你的表真的被稱爲表,那麼我強烈建議你將它改爲不太混亂的東西。

此外,停止串聯文本現在寫入命令。瞭解如何使用parameters爲了防止SQL injection

編輯

insert語句使用在BOL documents for INSERT指定的格式和examples provided therein。表是一個關鍵字,所以不要用它作爲表名。如果您必須使用關鍵字,則需要使用方括號將其轉義。見BOL: Delimited Identifiers

我還是說,不要用「表」作爲表名。讓你的生活更輕鬆。

哦,編寫安全的代碼(見重新SQL注入上述評論,以及如何Linked In got hit,多少它的成本他們)

+0

+1指出確切的問題。名稱爲「table」的表不存在。 –

+0

數據庫中的表名爲dbo.Table –

+0

實際上我認爲插入語法是錯誤的,但更大的問題是命名錶「Table」並編寫不安全的代碼 –

0

改爲「插入表值」到「插入[表]價值觀「,一切正常。感謝注意自己,遠離簡單的名字。