每次我尝试运行我的代码时,我都会得到这样的异常:
System.Data.SqlClient.SqlException类型的未处理异常发生在System.Data.dll中 附加信息:“)”附近的语法不正确。
尝试了多种解决办法,但我从未越过ExectueNonQuery线。有人能告诉我它怎么了吗?
private void button1_Click(object sender, EventArgs e)
{
SqlConnection con = new SqlConnection(@"Data Source=CHARLIE-PC\MSSQLSERVER1;Initial Catalog=Tema;Integrated Security=True;");
con.Open();
SqlCommand cmd = new SqlCommand("INSERT INTO Fisier (idFisier, Nume, idFolder) VALUES ('"+idFis.Text+ "','"+ numeFis.Text + "','" +idFoldFis.Text +"',)", con);
cmd.ExecuteNonQuery();
con.Close();
}发布于 2017-01-16 21:09:48
虽然其他问题说明了根本问题,您的后缀逗号,但您确实必须更好地处理您的查询。不要像那样将查询粘合在一起,而是使用参数。If you do not you are opening yourself to huge security problems。此外,您还必须将连接放入using语句中,这样当发生错误时,连接仍将被关闭。
private void button1_Click(object sender, EventArgs e)
{
using(SqlConnection con = new SqlConnection(@"Data Source=CHARLIE-PC\MSSQLSERVER1;Initial Catalog=Tema;Integrated Security=True;"))
{
con.Open();
SqlCommand cmd = new SqlCommand("INSERT INTO Fisier (idFisier, Nume, idFolder) VALUES (@idFis,@numeFis,@idFoldFis)",con);
cmd.Parameters.Add("@idFis", SqlDbType.NVarChar, -1).Value = idFis.Text;
cmd.Parameters.Add("@numeFis", SqlDbType.NVarChar, -1).Value = numeFis.Text;
cmd.Parameters.Add("@idFoldFis", SqlDbType.NVarChar, -1).Value = idFoldFis.Text;
cmd.ExecuteNonQuery();
}
}发布于 2017-01-16 21:20:35
逗号是您的问题,但至少在继续之前,我建议您做一些其他的修改:
1.为连接字符串使用"app.config“
在保证连接字符串安全方面有很多文档,但至少不要直接嵌入到每个连接代码中。
向客户端项目添加"app.config“(或利用web项目的web.config )。至少,如下所示:
<configuration>
<appSettings>
<add key="db" value="Data Source=CHARLIE-PC\MSSQLSERVER1;Initial Catalog=Tema;Integrated Security=True;" />
</appSettings>
</configuration>然后将对"System.Configuration“的引用添加到您的项目中,您可以在代码中这样引用它:
var con = new SqlConnection(ConfigurationManager.AppSettings["db"]);2.确保正确地处理连接和命令,
在using中包装连接和命令。下面是一个示例:
using (var con = new SqlConnection(ConfigurationManager.AppSettings["db"]))
{
con.Open();
var sql = "/* My command here */";
using (var cmd = new SqlCommand(sql, con))
{
// SQL execution here
}
} // Closing is now handled for you (even if errors occur)3.参数化任何SQL查询以防止注入攻击
Concatenating字符串对于SQL命令非常危险(只需要google "SQL注入“)。这就是保护你自己的方法。
using (var con = new SqlConnection(ConfigurationManager.AppSettings["db"]))
{
con.Open();
var sql = "INSERT INTO Fisier (idFisier, Nume, idFolder) VALUES (@idFisier, @nume, @idFolder)";
using (var cmd = new SqlCommand(sql, con))
{
cmd.Parameters.Add("@idFisier", SqlDbType.VarChar).Value = idFis.Text;
cmd.Parameters.Add("@nume", SqlDbType.VarChar).Value = numeFis.Text;
cmd.Parameters.Add("@idFolder", SqlDbType.VarChar).Value = idFoldFis.Text;
cmd.ExecuteNonQuery();
}
} // Closing is now handled for you (even if errors occur)4.将数据库命令抽象为单独的业务层
这通常是最佳实践,通过编写单独的类(甚至类库)作为只包含数据命令的业务层,可以避免许多麻烦。然后,您的UI将只处理调用业务层方法。
如果您的数据库曾经发生更改,或者您需要在UI的其他部分执行类似的功能,那么在整个UI中更新相同的查询将不是很有趣,而不是仅仅更新业务层中的一个点。
发布于 2017-01-16 21:12:45
使SQL具有可读性和参数化,您将发现这个例程很容易实现:
// Extract a method (or even a class): do not mix UI and business logic/storage
// Just RDBMS logic: no UI controls or something at all
private static void CoreInsertFisier(string idFisier, nume, idFolder) {
// Do not hardcode the connection string, but read it (from settings)
// wrap IDisposable into using
using (SqlConnection con = new SqlConnection(ConnectionStringHere)) {
con.Open();
// Make sql readable (use verbatim strings @"...")
// Make sql parameterized
string sql =
@"INSERT INTO Fisier (
idFisier,
Nume,
idFolder)
VALUES (
@prm_idFisier,
@prm_Nume,
@prm_idFolder)";
// wrap IDisposable into using
using (SqlCommand cmd = new SqlCommand(sql, con)) {
// Parameters.Add(...) is a better choice, but you have to know fields' types
cmd.Parameters.AddWithValue("@prm_idFisier", idFisier);
cmd.Parameters.AddWithValue("@prm_Nume", nume);
cmd.Parameters.AddWithValue("@prm_idFolder", idFolder);
cmd.ExecuteNonQuery();
}
}
}
...
private void button1_Click(object sender, EventArgs e) {
// UI: just one call - please insert these three textbox into db
CoreInsertFisier(idFis.Text, numeFis.Text, idFoldFis.Text);
}https://stackoverflow.com/questions/41684823
复制相似问题