Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/86.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 用户代码是否未处理SqlException?_C#_Sql_Asp.net_Sql Server - Fatal编程技术网

C# 用户代码是否未处理SqlException?

C# 用户代码是否未处理SqlException?,c#,sql,asp.net,sql-server,C#,Sql,Asp.net,Sql Server,我目前开始在学校学习asp.net C#,现在他们希望我将数据插入SQL Server。现在,我已经编写了这段代码,但是当我尝试向数据库中添加一些内容时,我得到了错误: 用户代码未处理SqlException System.Data.dll中发生“System.Data.SqlClient.SqlException”类型的异常,但未在用户代码中处理 其他信息:提供的值的列名或数量与表定义不匹配 有人能解释一下我做错了什么吗 提前谢谢 弗雷德 如果有insert命令,但不想指定要在其中插入值的列,

我目前开始在学校学习asp.net C#,现在他们希望我将数据插入SQL Server。现在,我已经编写了这段代码,但是当我尝试向数据库中添加一些内容时,我得到了错误:

用户代码未处理SqlException

System.Data.dll中发生“System.Data.SqlClient.SqlException”类型的异常,但未在用户代码中处理

其他信息:提供的值的列名或数量与表定义不匹配

有人能解释一下我做错了什么吗

提前谢谢

弗雷德


如果有insert命令,但不想指定要在其中插入值的列,则需要按照列在表中出现的正确顺序为表中的所有列提供值

在本例中,我假设您的表Movie包含的列比应该包含Movie名称(即Title?)的列多。因此,您需要为所有列写入值,或者指定哪个列应该接收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
(或任何其他类型的一次性对象)的最佳方法是在using语句中本地创建它,而不将它保存在全局变量中,并在不同的位置打开/关闭它。

对于这种方法非常有用,因为它可以保证在异常情况下关闭和释放连接。如果您可以尝试始终保持全局对象的最少数量。

如果您有insert命令并且不想指定要插入值的列,则需要按照列在表中出现的正确顺序为表中的所有列提供值

在本例中,我假设您的表Movie包含的列比应该包含Movie名称(即Title?)的列多。因此,您需要为所有列写入值,或者指定哪个列应该接收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
(或任何其他类型的一次性对象)的最佳方法是在using语句中本地创建它,而不将它保存在全局变量中,并在不同的位置打开/关闭它。

对于这种方法非常有用,因为它可以保证在异常情况下关闭和释放连接。如果您能始终保持全局对象的最少数量。

您能告诉我们您的表的定义吗?如果您的列没有默认值(例如自动递增的主键列),则将引发此错误。请满足以下条件,请永远不要从
页面加载打开连接,并请同时用于连接和命令。至于实际问题,请参见语法,除非您的表有一列,否则请提供插入的列名列表。您能告诉我们表的定义吗?如果您的列没有默认值(例如自动递增的主键列),则将引发此错误。请满足以下条件,请永远不要从
页面加载打开连接,并请同时用于连接和命令。至于实际问题,请参阅的语法,除非您的表有一列,否则请提供插入的列名列表。操作显示在页面加载时打开的连接,在单击按钮时关闭的连接。这也需要更改。@SelvaTS和它已被更改-更改为最初应该更改的内容。@GSerg首先,数据访问必须与业务隔离。连接、命令对象用using语句包装。操作显示连接在页面加载时打开,在按钮单击时关闭。这也需要更改。@SelvaTS和它已被更改-更改为最初应该更改的内容。@GSerg首先,数据访问必须与业务隔离。对于连接,命令对象用using语句包装。