asp.net SQL Server插入语句tidyup +错误

时间:2011-12-15 10:15:08

标签: c# asp.net

我有一个将数据插入数据库的表单。

某些字段并不总是需要的。 当我在代码中留下这些空白时,我收到错误说法。

  

列名或提供的值数与表不匹配   定义

这就是我设置数据库的方法。 SQL Server 2008

[youthclubid]
[youthclubname]
[description]
[address1]
[address2]
[county]
[postcode]
[email]
[phone]

这是我连接到数据库并进行插入的代码。

connection.Open();
cmd = new SqlCommand("insert into youthclublist values ('" + youthclubname.Text + "', '" + description.Text + "','" + address1.Text + "','" + address2.Text + "', '" + county.Text + "', '" + postcode.Text + "', '" + email.Text + "', '" + phone.Text + "')", connection);
cmd.ExecuteNonQuery();

6 个答案:

答案 0 :(得分:5)

您有两个主要问题:

1)将SQL语句连接在一起容易发生SQL注入攻击 - 不要这样做,而是使用参数化查询

2)您没有定义要在表格中插入的哪些列 - 默认情况下,这些列都是列,如果您没有为所有列提供值,你会得到你所看到的错误。

我的建议:始终使用参数化查询并在INSERT语句中明确定义列。这样,您可以定义哪些参数具有值,哪些不具有值,并且您可以免受注入攻击 - 并且您的性能也会更好!

string insertStmt = 
       "INSERT INTO dbo.YouthClubList(Youthclubname, [Description], " +
         "address1, address2, county, postcode, email, phone) " +
       "VALUES(@Youthclubname, @Description, " +
         "@address1, @address2, @county, @postcode, @email, @phone)";

using(SqlConnection connection = new SqlConnection(.....))
using(SqlCommand cmdInsert = new SqlCommand(insertStmt, connection))
{
   // set up parameters
   cmdInsert.Parameters.Add("@YouthClubName", SqlDbType.VarChar, 100);
   cmdInsert.Parameters.Add("@Description", SqlDbType.VarChar, 100);
   .... and so on

   // set values - set those parameters that you want to insert, leave others empty
   cmdInsert.Parameters["@YouthClubName"].Value = .......;

   connection.Open();
   cmdInsert.ExecuteNonQuery();
   connection.Close();
}

答案 1 :(得分:1)

这种方法无法使用SqlParameter来执行此类语句。

所以你的代码就像

  SqlConnection thisConnection = new SqlConnection(ConfigurationManager.ConnectionStrings["Northwind_ConnectionString"].ConnectionString);

        //Create Command object
        SqlCommand nonqueryCommand = thisConnection.CreateCommand();

        try
        {

            // Create INSERT statement with named parameters
            nonqueryCommand.CommandText = "INSERT  INTO Employees (FirstName, LastName) VALUES (@FirstName, @LastName)";

            // Add Parameters to Command Parameters collection
            nonqueryCommand.Parameters.Add("@FirstName", SqlDbType.VarChar, 10);
            nonqueryCommand.Parameters.Add("@LastName", SqlDbType.VarChar, 20);


            nonqueryCommand.Parameters["@FirstName"].Value = txtFirstName.Text;
            nonqueryCommand.Parameters["@LastName"].Value = txtLastName.Text;

            // Open Connection
            thisConnection.Open();

            nonqueryCommand.ExecuteNonQuery();
        }

        catch (SqlException ex)
        {
            // Display error
            lblErrMsg.Text = ex.ToString();
            lblErrMsg.Visible = true;
        }

        finally
        {
            // Close Connection
            thisConnection.Close();

        }

答案 2 :(得分:1)

第一个主要问题是您在查询中连接输入。这使您的应用程序极易受SQL Injection攻击。不要这样做。使用parametrized query

insert语句的常规语法如下:

Insert into <TableName> (Col1, Col2...Coln) values (val1, val2...valn)

如果只需要插入一组选定的列,则需要在列列表中提供要插入数据的列的列表。

如果您没有指定列列表,则表示您正在向每个列表中插入数据。

因此,您可以检查输入,如果不存在,则可以省略相应的列。

另一种更好的方法是使用存储过程。这将缓解这个问题。

答案 3 :(得分:0)

您需要告诉SQL服务器您要插入哪个字段,如

        insert into youthclublist(youthclubid, youthclubname, ....) values ('" + youthclubname.Text + "', '" + description.Text + "'.....

你没事。

答案 4 :(得分:0)

虽然是编程新手,但我知道插入数据库的最简单方法是创建一个“保存”存储过程,然后通过连接字符串调用它。相信我,这是最好的方式。

答案 5 :(得分:0)

另一种方法是使用LINQ to SQL。我发现这更容易了。请按照以下步骤操作。

  1. 将新的LINQ to SQL Classes添加到项目中。确保文件扩展名为“.dbml”。将它命名为“YouthClub.dbml”
  2. 使用服务器资源管理器
  3. 将数据库连接到Visual Studio
  4. 将您的表拖到OR Designer。(我不允许发布图片)。

  5. 您现在可以使用此代码保存到数据库

        //Create a new DataContext
        YouthClubDataContext db = new YouthClubDataContext(); 
    
        //Create a new Object to be submitted
        YouthClubTable newYouthClubRecord = new YouthClubTable();
    
        newYouthClubRecord.youthlubname = txtyouthclubname.Text;
        newYouthClubRecord.description = txtdescription.Text;
        newYouthClubRecord.address1 = txtaddress1.Text;
        newYouthClubRecord.address2 = txtaddress2.Text;
        newYouthClubRecord.county = txtcounty.Text;
        newYouthClubRecord.email = txtemail.Text;
        newYouthClubRecord.phone = txtphone.Text;
        newYouthClubRecord.postcode = txtpostcode.Text;
    
        //Submit to the Database
        db.YouthClubTables.InsertOnSubmit(newYouthClubRecord);
        db.SubmitChanges();
    
  6. 希望这次我给出了真正的答案