【问题标题】:Inserting values into a SQL Server database using ado.net via C#通过 C# 使用 ado.net 将值插入 SQL Server 数据库
【发布时间】:2012-11-14 10:24:06
【问题描述】:

我创建了一个简单的程序来将值插入到表 [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();
}

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

【问题讨论】:

  • 你确定需要这样命名参数吗?

标签: c# sql sql-server ado.net executenonquery


【解决方案1】:

以下代码适用于“通过 C# 使用 ado.net 将值插入 SQL Server 数据库

// Your Connection string
string connectionString = "Data Source=DELL-PC;initial catalog=AdventureWorks2008R2 ; User ID=sa;Password=sqlpass;Integrated Security=SSPI;";

// Collecting Values
string firstName="Name",
    lastName="LastName",
    userName="UserName",
    password="123",
    gender="Male",
    contact="Contact";
int age=26; 

// Query to be executed
string query = "Insert Into dbo.regist (FirstName, Lastname, Username, Password, Age, Gender,Contact) " + 
                   "VALUES (@FN, @LN, @UN, @Pass, @Age, @Gender, @Contact) ";

    // instance connection and command
    using(SqlConnection cn = new SqlConnection(connectionString))
    using(SqlCommand cmd = new SqlCommand(query, cn))
    {
        // add parameters and their values
        cmd.Parameters.Add("@FN", System.Data.SqlDbType.NVarChar, 100).Value = firstName;
        cmd.Parameters.Add("@LN", System.Data.SqlDbType.NVarChar, 100).Value = lastName;
        cmd.Parameters.Add("@UN", System.Data.SqlDbType.NVarChar, 100).Value = userName;
        cmd.Parameters.Add("@Pass", System.Data.SqlDbType.NVarChar, 100).Value = password;
        cmd.Parameters.Add("@Age", System.Data.SqlDbType.Int).Value = age;
        cmd.Parameters.Add("@Gender", System.Data.SqlDbType.NVarChar, 100).Value = gender;
        cmd.Parameters.Add("@Contact", System.Data.SqlDbType.NVarChar, 100).Value = contact;

        // open connection, execute command and close connection
        cn.Open();
        cmd.ExecuteNonQuery();
        cn.Close();
    }    

【讨论】:

    【解决方案2】:
    private void button1_Click(object sender, EventArgs e)
    {
        SqlConnection con = new SqlConnection();
        con.ConnectionString = "data source=CHANCHAL\SQLEXPRESS;initial catalog=AssetManager;user id=GIPL-PC\GIPL;password=";
        con.Open();
        SqlDataAdapter ad = new SqlDataAdapter("select * from detail1", con);
        SqlCommandBuilder cmdbl = new SqlCommandBuilder(ad);
        DataSet ds = new DataSet("detail1");
        ad.Fill(ds, "detail1");
        DataRow row = ds.Tables["detail1"].NewRow();
        row["Name"] = textBox1.Text;
        row["address"] =textBox2.Text;
        ds.Tables["detail1"].Rows.Add(row);
        ad.Update(ds, "detail1");
        con.Close();
        MessageBox.Show("insert secussfully"); 
    }
    

    【讨论】:

      【解决方案3】:

      正如我在 cmets 中所说 - 您应该始终在查询中使用参数 - 永远不要自己将您的 ​​SQL 语句连接在一起。

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

      所以我会将你的代码重写为类似

      在您网页的代码隐藏文件中 (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
      }
      

      在其他一些代码中(例如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();
          }
      }
      

      这样的代码:

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

      【讨论】:

      • 很好的答案,+1。我一直在尝试查找有关如何执行此操作的一些官方文档,但是我在 MSDN 上找到的示例不是很详细(例如此答案)。对于上面提供的答案,您有什么好的来源/参考吗?还是直接从您的脑海中汲取灵感? ;)
      【解决方案4】:

      您应该删除最后一个逗号,正如 nrodic 所说,您的命令不正确。

      你应该像这样改变它:

      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);
      

      【讨论】:

      • 虽然它可以工作,但这并不能防止 SQL 注入
      【解决方案5】:

      去掉逗号

      ... Gender,Contact, " + ") VALUES ...
                        ^-----------------here
      

      【讨论】:

      • 当然是这个问题,但是使用了参数,没有定义。此外,@textBox1.Text 不是有效的 SQL 参数。
      猜你喜欢
      • 1970-01-01
      • 2017-11-24
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-09-06
      相关资源
      最近更新 更多