首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >ExecuteNonQuery()不工作

ExecuteNonQuery()不工作
EN

Stack Overflow用户
提问于 2017-01-16 20:52:46
回答 5查看 1.1K关注 0票数 0

每次我尝试运行我的代码时,我都会得到这样的异常:

System.Data.SqlClient.SqlException类型的未处理异常发生在System.Data.dll中 附加信息:“)”附近的语法不正确。

尝试了多种解决办法,但我从未越过ExectueNonQuery线。有人能告诉我它怎么了吗?

代码语言:javascript
复制
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();
}
EN

回答 5

Stack Overflow用户

发布于 2017-01-16 21:09:48

虽然其他问题说明了根本问题,您的后缀逗号,但您确实必须更好地处理您的查询。不要像那样将查询粘合在一起,而是使用参数。If you do not you are opening yourself to huge security problems。此外,您还必须将连接放入using语句中,这样当发生错误时,连接仍将被关闭。

代码语言:javascript
复制
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();
    }
}
票数 4
EN

Stack Overflow用户

发布于 2017-01-16 21:20:35

逗号是您的问题,但至少在继续之前,我建议您做一些其他的修改:

  1. 不要将连接字符串嵌入到每个db连接请求中。使用app.config/web.config或其他任何内容:)
  2. 确保正确地处理连接of命令
  3. 参数化任何SQL查询以防止注入攻击。
  4. 将数据库命令抽象到单独的业务层

1.为连接字符串使用"app.config“

在保证连接字符串安全方面有很多文档,但至少不要直接嵌入到每个连接代码中。

向客户端项目添加"app.config“(或利用web项目的web.config )。至少,如下所示:

代码语言:javascript
复制
<configuration>
  <appSettings>
      <add key="db" value="Data Source=CHARLIE-PC\MSSQLSERVER1;Initial Catalog=Tema;Integrated Security=True;" />
  </appSettings>
</configuration>

然后将对"System.Configuration“的引用添加到您的项目中,您可以在代码中这样引用它:

代码语言:javascript
复制
var con = new SqlConnection(ConfigurationManager.AppSettings["db"]);

2.确保正确地处理连接和命令,

using中包装连接和命令。下面是一个示例:

代码语言:javascript
复制
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注入“)。这就是保护你自己的方法。

代码语言:javascript
复制
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中更新相同的查询将不是很有趣,而不是仅仅更新业务层中的一个点。

票数 4
EN

Stack Overflow用户

发布于 2017-01-16 21:12:45

使SQL具有可读性和参数化,您将发现这个例程很容易实现:

代码语言:javascript
复制
// 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);
}
票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/41684823

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档