为什么我在')'错误附近得到错误的语法?

时间:2014-01-22 14:34:23

标签: c# asp.net sql sql-server syntax

我正在尝试使用Visual Basic 2012上的C#创建注册页面。当我调试时,我得到0错误,但是当我尝试注册帐户时,我收到以下错误。

  

“语法附近不正确”)'“

如果我尝试使用现有用户名创建帐户,则表示该用户名已存在。所以我能够连接到SQL服务器,但我不确定我哪里出错了。

此注册页面应在我的数据库DNMembership>中创建帐户。表>帐户

这是我正在使用的代码。

{
    SqlConnection con = new SqlConnection(ConfigurationManager.ConnectionStrings["RegDNMembershipConnectionString"].ConnectionString);
    con.Open();
    string insCmd = "Insert into Accounts (AccountName, Passphrase, EmailAddress, FullName, Country)";
    SqlCommand insertUser = new SqlCommand(insCmd, con);
    insertUser.Parameters.AddWithValue("@AccountName", TextBoxUN.Text);
    insertUser.Parameters.AddWithValue("@Passphrase", TextBoxPass.Text);
    insertUser.Parameters.AddWithValue("@EmailAddress", TextBoxEA.Text);
    insertUser.Parameters.AddWithValue("@FullName", TextBoxFN.Text);
    insertUser.Parameters.AddWithValue("@Country", DropDownListCountry.SelectedItem.ToString());

    try
    {
        insertUser.ExecuteNonQuery();
        con.Close();
        Response.Redirect("Login.aspx");
    }
    catch(Exception er)
    {
        Response.Write("<b>Something Really Bad Happened... Please Try Again.< /br></b>");
        Response.Write(er.Message);
}

我做错了什么?

5 个答案:

答案 0 :(得分:8)

您似乎忘了在INSERT命令中添加VALUES部分。

  

VALUES

  介绍要插入的数据值列表。 必须   如果指定,则为column_list中每列的一个数据值   表格。值列表必须括在括号中。

更改您的SQL查询,如;

string insCmd = @"Insert into Accounts (AccountName, Passphrase, EmailAddress, FullName, Country)
                 VALUES(@AccountName, @Passphrase, @EmailAddress, @FullName, @Country)";

并使用using statement处理您的SqlConnectionSqlCommand之类的内容;

using(SqlConnection con = new SqlConnection(ConfigurationManager.ConnectionStrings["RegDNMembershipConnectionString"].ConnectionString))
{    
   using(SqlCommand insertUser = new...)
   {
     //Your code..
   }
}

答案 1 :(得分:3)

您没有在SQL或VALUES部分中指定任何参数 - 您说“我想插入这些字段......”但不是 你想要插入。它应该是这样的:

string insCmd =
   "Insert into Accounts (AccountName, Passphrase, EmailAddress, FullName, Country) "
 + "Values (@AccountName, @Passphrase, @EmailAddress, @FullName, @Country");

答案 2 :(得分:1)

您需要更改SQL语句:

string insCmd = "Insert into Accounts (AccountName, Passphrase, EmailAddress, FullName, Country) VALUES (@AccountName,@Passphrase,@EmailAddress,@FullName,@Country)";

答案 3 :(得分:1)

您缺少Insert声明的一部分

INSERT INTO table (col1, col2) VALUES (@col1, @col2)

或者,如果要将所有值按顺序插入列中

INSERT INTO table VALUES (@col1, @col2)

答案 4 :(得分:0)

SQL Server中有INSERT命令的几种替代方法。

  • 指定COLUMNS,然后指定VALUES

    • SQL语法 - INSERT INTO TABLE(AccountName, Passphrase, EmailAddress, FullName, Country) VALUES ('AccountName', 'Passphrase', 'EmailAddress', 'FullName', 'Country')
    • C# string insCmd = "INSERT INTO TABLE(AccountName, Passphrase, EmailAddress, FullName, Country) VALUES (@AccountName, @Passphrase, @EmailAddress, @FullName, @Country)"
  • 如果您确定列的顺序可以跳过指定列,那么如果您将VALUES的顺序搞砸,则会将值插入错误的列

    • SQL Sytanx - INSERT INTO TABLE VALUES ('AccountName', 'Passphrase', 'EmailAddress', 'FullName', 'Country')
    • C# string insCmd = "INSERT INTO TABLE VALUES (@AccountName, @Passphrase, @EmailAddress, @FullName, @Country)"

阅读的资源很好

INSERT INTO TABLE的替代方法,您可以调用插入表中的C#存储过程。使用存储过程可以帮助您减少即席查询,帮助防止SQL注入,减少网络流量,添加额外的验证服务器端。您的代码如下所示。

SqlCommand cmd  = new SqlCommand("usp_InsertIntoAccount", con);
con.Open();

cmd.CommandType = CommandType.StoredProcedure;  

cmd.Parameters.Add(new SqlParameter("@AccountName", TextBoxUN.Text));
cmd.Parameters.Add(new SqlParameter("@Passphrase", TextBoxPass.Text));
cmd.Parameters.Add(new SqlParameter("@EmailAddress", TextBoxEA.Text));
cmd.Parameters.Add(new SqlParameter("@FullName", TextBoxFN.Text));
cmd.Parameters.Add(new SqlParameter("@Country", DropDownListCountry.SelectedItem.ToString()));

try
{
    cmd.ExecuteNonQuery();
    con.Close();
    Response.Redirect("Login.aspx");
}
catch(Exception er)
{
    Response.Write("<b>Something Really Bad Happened... Please Try Again.< /br></b>");
    Response.Write(er.Message);
}

以下问题How to execute a stored procedure within C# program

列出了其他资源