通过C#使用ado.net将值插入SQL Server数据库

the*_*god 18 c# sql sql-server ado.net executenonquery

我创建了一个简单的程序来将值插入表中[regist],但我不断收到错误

')附近的语法不正确

cmd.ExecuteNonQuery();:

 private void button1_Click(object sender, EventArgs e)
 {
      SqlConnection cn = new SqlConnection("Data Source=DELL-PC;initial catalog=AdventureWorks2008R2 ; User ID=sa;Password=sqlpass;Integrated Security=SSPI;");

      SqlCommand cmd = new SqlCommand("INSERT INTO dbo.regist (" + " FirstName, Lastname, Username, Password, Age, Gender,Contact, " + ") VALUES (" + " @textBox1.Text, @textBox2.Text, @textBox3.Text, @textBox4.Text, @comboBox1.Text,@comboBox2.Text,@textBox7.Text" + ")", cn);

      cn.Open();
      cmd.ExecuteNonQuery();
      cn.Close();
}
Run Code Online (Sandbox Code Playgroud)

我是新手,我真的很困惑.

mar*_*c_s 41

正如我在评论中所说 - 你应该总是在查询中使用参数 - 永远不要自己将SQL语句连接在一起.

另外:我建议将click事件处理程序与实际代码分开以插入数据.

所以我会重写你的代码

在您的网页的代码隐藏文件(yourpage.aspx.cs)

private void button1_Click(object sender, EventArgs e)
{
      string connectionString = "Data Source=DELL-PC;initial catalog=AdventureWorks2008R2 ; User ID=sa;Password=sqlpass;Integrated Security=SSPI;";

      InsertData(connectionString,
                 textBox1.Text.Trim(),  -- first name
                 textBox2.Text.Trim(),  -- last name
                 textBox3.Text.Trim(),  -- user name
                 textBox4.Text.Trim(),  -- password
                 Convert.ToInt32(comboBox1.Text),  -- age
                 comboBox2.Text.Trim(), -- gender
                 textBox7.Text.Trim() );  -- contact
}
Run Code Online (Sandbox Code Playgroud)

在其他一些代码中(例如a databaselayer.cs):

private void InsertData(string connectionString, string firstName, string lastname, string username, string password
                        int Age, string gender, string contact)
{
    // define INSERT query with parameters
    string query = "INSERT INTO dbo.regist (FirstName, Lastname, Username, Password, Age, Gender,Contact) " + 
                   "VALUES (@FirstName, @Lastname, @Username, @Password, @Age, @Gender, @Contact) ";

    // create connection and command
    using(SqlConnection cn = new SqlConnection(connectionString))
    using(SqlCommand cmd = new SqlCommand(query, cn))
    {
        // define parameters and their values
        cmd.Parameters.Add("@FirstName", SqlDbType.VarChar, 50).Value = firstName;
        cmd.Parameters.Add("@Lastname", SqlDbType.VarChar, 50).Value = lastName;
        cmd.Parameters.Add("@Username", SqlDbType.VarChar, 50).Value = userName;
        cmd.Parameters.Add("@Password", SqlDbType.VarChar, 50).Value = password;
        cmd.Parameters.Add("@Age", SqlDbType.Int).Value = age;
        cmd.Parameters.Add("@Gender", SqlDbType.VarChar, 50).Value = gender;
        cmd.Parameters.Add("@Contact", SqlDbType.VarChar, 50).Value = contact;

        // open connection, execute INSERT, close connection
        cn.Open();
        cmd.ExecuteNonQuery();
        cn.Close();
    }
}
Run Code Online (Sandbox Code Playgroud)

像这样的代码:

  • 不容易受到SQL注入攻击
  • 在SQL Server上执行得更好(因为查询被解析为执行计划一次,然后缓存并在以后重用)
  • 将事件处理程序(代码隐藏文件)与实际的数据库代码分开(将它们放在它们所属的位置 - 帮助避免使用大量意大利面条代码的"超重"代码隐藏,从处理UI事件到数据库访问执行所有操作 - 不是很好设计!)

  • 很好的答案,+1。我一直试图找到一些关于如何执行此操作的官方文档,但是我在 MSDN 上找到的示例不是很详细(例如这个答案)。您对上面提供的答案有什么好的来源/参考吗?还是直接从你的脑海中提取出来的?;) (2认同)

jue*_*n d 7

删除逗号

... Gender,Contact, " + ") VALUES ...
                  ^-----------------here
Run Code Online (Sandbox Code Playgroud)