【发布时间】:2012-11-20 13:38:50
【问题描述】:
我正在创建一个项目,我需要在单个 SQL 连接中运行 2-3 个 SQL 命令。 这是我写的代码:
SqlConnection con = new SqlConnection(@"Data Source=(LocalDB)\v11.0;AttachDbFilename=|DataDirectory|\project.mdf;Integrated Security=True");
con.Open();
SqlCommand cmd = new SqlCommand("select * from " + mytags.Text + " ", con);
SqlDataReader rd = cmd.ExecuteReader();
if (rd.Read())
{
con.Close();
con.Open();
SqlCommand cmd1 = new SqlCommand("insert into " + mytags.Text + " values ('fname.lname@gmail.com','" + TextBox3.Text + "','" + TextBox4.Text + "','" + TextBox5.Text + "','"+mytags.Text+"')", con);
cmd1.ExecuteNonQuery();
label.Visible = true;
label.Text = "Date read and inserted";
}
else
{
con.Close();
con.Open();
SqlCommand cmd2 = new SqlCommand("create table " + mytags.Text + " ( session VARCHAR(MAX) , Price int , Description VARCHAR(MAX), Date VARCHAR(20),tag VARCHAR(10))", con);
cmd2.ExecuteNonQuery();
con.Close();
con.Open();
SqlCommand cmd3 = new SqlCommand("insert into " + mytags.Text + " values ('" + Session + "','" + TextBox3.Text + "','" + TextBox4.Text + "','" + TextBox5.Text + "','" + mytags.Text + "')", con);
cmd3.ExecuteNonQuery();
label.Visible = true;
label.Text = "tabel created";
con.Close();
}
我已尝试消除错误,但我发现连接不会进入其他状态。请检查代码并建议是否有任何错误或任何其他解决方案。
【问题讨论】:
-
如果您已经有一个同名的表但其中没有数据会怎样?您是否还考虑过如果有人在您插入的文本框中输入 SQL 会发生什么?
-
Greg 提出了一个重要问题,这是一个答案:How and why to use parameterized queries
-
它不会到达 else 分支,因为如果表不存在,查询将出错并出现异常,而不是不返回任何行。您还应该在同一连接上执行另一个命令之前处置阅读器(尽管您的关闭和重新打开可能会间接清理它?虽然这是一种不好的形式)。有很多更好的方法可以检测表是否存在,但要以这种方式进行,您也许可以使用 try/catch。使用 ExecuteScalar() 而不是 ExecuteReader() 也可能更容易,因为无论如何您都不使用任何实际结果。
标签: c# sql-server ado.net sqlconnection sqlcommand