从C#ASP.NET将数据插入SQL数据库
我试图在SQL数据库中插入值,查询在SQL端工作,但当从C#ASP.NET实现时,它不会在SQL数据库中插入任何内容。代码如下:从C#ASP.NET将数据插入SQL数据库,c#,asp.net,sql-server,C#,Asp.net,Sql Server,我试图在SQL数据库中插入值,查询在SQL端工作,但当从C#ASP.NET实现时,它不会在SQL数据库中插入任何内容。代码如下: public partial class About : Page { SqlConnection con = new SqlConnection(ConfigurationManager.ConnectionStrings["ConnectionString"].ConnectionString); protected void Page_Load
public partial class About : Page
{
SqlConnection con = new SqlConnection(ConfigurationManager.ConnectionStrings["ConnectionString"].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 sanctuary(SName) values('test')", con);
cmd = new SqlCommand("insert into species(Name) values('test1')", con);
cmd = new SqlCommand("insert into breed(SpeciesID, BreedName, FoodCost, HousingCost) SELECT SpeciesID, ('breed'), ('12'), ('21') FROM species", con);
cmd.ExecuteNonQuery();
con.Close();
}
}
}
非常感谢您的帮助 如果要同时执行三个命令,可以将三个命令的sql合并为一个字符串,并用分号分隔(请参阅) 代码中的第一个问题是,您需要执行每个命令,而不仅仅是最后一个命令。最后,如果您没有看到最后一个命令的insert,可能是因为您的表种类为空,因此最后一个命令没有要插入的内容
最后请注意,Zohar Peled强调的关于不保留全局连接对象的要点非常重要,请遵循建议。如果要同时执行三个命令,请将三个命令的sql合并为一个字符串,并用分号分隔(请参阅) 代码中的第一个问题是,您需要执行每个命令,而不仅仅是最后一个命令。最后,如果您没有看到最后一个命令的insert,可能是因为您的表种类为空,因此最后一个命令没有要插入的内容
最后请注意,Zohar Peled强调的关于不保留全局连接对象的要点非常重要,请遵循建议。您只执行最后一个命令,因此
中没有任何内容。由于品种
中没有任何内容,因此选择
不会返回任何结果,因此不会在品种
中插入任何内容
另外,在页面级别保留SqlConnection
对象不是一个好主意。SQL连接应该在执行查询之前打开,并在查询之后立即释放
更好的代码如下所示:
using(var con = new SqlConnection(ConfigurationManager.ConnectionStrings["ConnectionString"].ConnectionString))
{
using(var com = new SqlCommand("insert into sanctuary(SName) values('test');insert into species(Name) values('test1');insert into breed(SpeciesID, BreedName, FoodCost, HousingCost) SELECT SpeciesID, ('breed'), ('12'), ('21') FROM species", con)
{
con.Open();
com.ExecuteNonQuery();
}
}
当然,您可以分别执行每个SQL语句(尽管在本例中,这不是最佳的操作过程,因为它意味着对数据库的三次往返而不是一次):
您只执行最后一个命令,因此中没有任何内容。由于品种
中没有任何内容,因此选择
不会返回任何结果,因此不会在品种
中插入任何内容
另外,在页面级别保留SqlConnection
对象不是一个好主意。SQL连接应该在执行查询之前打开,并在查询之后立即释放
更好的代码如下所示:
using(var con = new SqlConnection(ConfigurationManager.ConnectionStrings["ConnectionString"].ConnectionString))
{
using(var com = new SqlCommand("insert into sanctuary(SName) values('test');insert into species(Name) values('test1');insert into breed(SpeciesID, BreedName, FoodCost, HousingCost) SELECT SpeciesID, ('breed'), ('12'), ('21') FROM species", con)
{
con.Open();
com.ExecuteNonQuery();
}
}
当然,您可以分别执行每个SQL语句(尽管在本例中,这不是最佳的操作过程,因为它意味着对数据库的三次往返而不是一次):
我希望至少能运行最后一个命令。你有没有收到任何错误消息?你为什么把它标记为MySQL?您使用的是SqlConnection和SqlCommand类,它们用于MS SQL,与MySQL无关。您只执行最后一个命令,因此中没有任何内容。由于物种
中没有任何内容,因此select不会返回任何结果,因此不会将任何内容插入到品种
@Steve中,实际上第一个命令正在运行,其余命令都没有。但是非常感谢你在下面的回答,帮助很大!!!我已经花了四天时间研究这个问题。我希望至少能运行最后一个命令。你有没有收到任何错误消息?你为什么把它标记为MySQL?您使用的是SqlConnection和SqlCommand类,它们用于MS SQL,与MySQL无关。您只执行最后一个命令,因此中没有任何内容。由于物种
中没有任何内容,因此select不会返回任何结果,因此不会将任何内容插入到品种
@Steve中,实际上第一个命令正在运行,其余命令都没有。但是非常感谢你在下面的回答,帮助很大!!!我花了四天的时间研究这个问题。单独的命令是最好的,如果出现错误,它可以被追踪。将语句组合到1个SQL命令中是一种不好的做法。@Rob这通常是正确的,但我不确定它在这里是否正确。是的,这是一种不好的做法,就像说GOTO是坏的,但如果它只是偶尔出现一次,那么就可以了-错:不,坏:是的。增长/添加多命令语句的诱惑存在,在未来的项目中这样做的诱惑存在,使之成为习惯的诱惑存在,然后下一个调试代码的人会怎样。至于“往返时间”——与实际数据库执行时间相比可以忽略不计。@Rob您确实意识到很多数据库活动涉及的不仅仅是一条语句,对吗?您是否也反对使用存储过程?如果不是,你反对使用多语句存储过程吗?@Rob,我可以说。我甚至同意你的第一句话。这就是为什么我在回答中显示了这两个选项。然而,我相信知道这些选项是很好的,并且将简单的、几乎“完全证明”的语句连接到一个命令对象中不会让我觉得在调试中有什么可怕的。我同意最好从最佳实践开始,但知道还有其他替代方案(有时可能有用)也很好。单独的命令是最好的,如果发生错误,可以跟踪。将语句组合到1个SQL命令中是一种不好的做法。@Rob这通常是正确的,但我不确定它在这里是否正确。是的,这是一种不好的做法,就像说GOTO是坏的,但如果它只是偶尔出现一次,那么就可以了-错:不,坏:是的。增长/添加多命令语句的诱惑存在,在未来的项目中这样做的诱惑存在,使之成为习惯的诱惑存在,然后下一个调试代码的人会怎样。至于“往返时间”——与实际数据库执行时间相比可以忽略不计。@Rob您确实意识到很多数据库活动涉及的不仅仅是一条语句,对吗?你也反对使用sto吗
using(var con = new SqlConnection(ConfigurationManager.ConnectionStrings["ConnectionString"].ConnectionString))
{
using(var com = new SqlCommand("insert into sanctuary(SName) values('test');", con)
{
con.Open();
com.ExecuteNonQuery();
com.CommandText = "insert into species(Name) values('test1');";
com.ExecuteNonQuery();
com.CommandText = "insert into breed(SpeciesID, BreedName, FoodCost, HousingCost) SELECT SpeciesID, ('breed'), ('12'), ('21') FROM species;";
com.ExecuteNonQuery();
}
}