我有一个将数据插入数据库的表单。
某些字段并不总是需要的。 当我在代码中留下这些空白时,我收到错误说法。
列名或提供的值数与表不匹配 定义
这就是我设置数据库的方法。 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();
答案 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。我发现这更容易了。请按照以下步骤操作。
将您的表拖到OR Designer。(我不允许发布图片)。
您现在可以使用此代码保存到数据库
//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();
希望这次我给出了真正的答案