我目前在学校开始使用asp.net C#,现在他们希望我将数据插入SQL Server。现在我到目前为止已经使用了这段代码,但是当我尝试在数据库中添加一些内容时,我收到错误:
用户代码
未处理SqlExceptionSystem.Data.dll中出现'System.Data.SqlClient.SqlException'类型的异常,但未在用户代码中处理
附加信息:列名或提供的值数与表定义不匹配。
有人可以解释一下我在这里做错了吗?
提前致谢。
佛瑞德。
public partial class AddMovie : System.Web.UI.Page
{
SqlConnection con = new SqlConnection(ConfigurationManager.ConnectionStrings["VideoStoreConnectionString"].ConnectionString);
protected void Page_Load(object sender, EventArgs e)
{
con.Open();
}
protected void Button1_Click(object sender, EventArgs e)
{
SqlCommand cmd = new SqlCommand("INSERT INTO dbo.Movie values('" + txtmovie.Text + "')", con);
cmd.ExecuteNonQuery();
con.Close();
Label1.Visible = true;
Label1.Text = "Your Movie is Stored Successfully!";
txtmovie.Text = "";
}
}
答案 0 :(得分:4)
如果您有一个insert命令,并且不想指定要插入值的列,那么您需要按照列中出现的列的正确顺序为表中的所有列提供VALUES。
在这种情况下,我认为您的表格电影的列数多于应该包含电影名称的列数(IE标题?)。因此,您需要为所有列编写值或指定哪个列应该接收txtmovie文本框的值
SqlCommand cmd = new SqlCommand(@"INSERT INTO dbo.Movie (Title)
values(.....) ....
说这不是向数据库提供命令文本的正确方法 您应该始终使用参数化查询
protected void Button1_Click(object sender, EventArgs e)
{
string cmdText = @"INSERT INTO dbo.Movie (Title) values(@name)";
using(SqlConnection con = new SqlConnection(.......constring here...))
using(SqlCommand cmd = new SqlCommand(cmdText, con))
{
con.Open();
cmd.Parameters.Add("@name", SqlDbType.NVarChar).Value = txtmovie.Text;
cmd.ExecuteNonQuery();
....
}
}
最后,一般来说,使用SqlConnection
(或其他所有类型的Disposable对象)的最佳方法是在using语句中本地创建它,而不将其保存在全局变量中并打开/关闭它不同的地方
Using Statement对此方法非常有用,因为它可以保证连接在异常情况下也可以关闭和处理。如果您可以尝试始终将全局对象的数量保持在最小值。