【问题标题】:SQL Insert Data not working properlySQL 插入数据无法正常工作
【发布时间】:2017-10-26 12:45:49
【问题描述】:

我想根据用户输入向我的表中插入一些值。我从一些文本框中得到这些值。当我在我的 SQL 逻辑之前放置一个断点,并用 F10 遍历每一行时,一切正常。我打开SQLConnection,创建一个SQLCommand,执行它,然后再次关闭连接。我刷新表格并在其中包含所有值。但是,当我删除或禁用断点,并且程序自己遍历这些代码行时,它不起作用,这意味着无论我多久刷新一次,都不会向表中添加任何值。

这是我所指的代码:

try
{
     SqlConnection con = new SqlConnection("Server=...;Database=...;Integrated Security=true;");
     con.Open();

     SqlCommand com = new SqlCommand("INSERT INTO TestTable (Type,Serialnumber) VALUES('" + TypeText + "','" + SerText + "')", con);
     //Debug.WriteLine(com.CommandText);

     com.BeginExecuteNonQuery();

     con.Close();
}
catch(Exception ex)
{
     MessageBox.Show(ex.Message);
}

【问题讨论】:

  • 请考虑sql注入问题
  • @BugFinder 这么久就无法判断变量是否已被清理,本来可以。无论如何,使用参数化查询是一个很好的建议;-)

标签: c# sql visual-studio


【解决方案1】:

当它自己运行时,它会调用BeginExecuteNonQuery() 并关闭下一行连接,而无需等待异步调用结束。在使用调试器执行 F10 时,您需要给它时间来有效地结束执行。考虑改用ExecuteNonQuery(),注意缺少Begin。

【讨论】:

    【解决方案2】:

    BeginExecuteNonQuery 方法启动异步执行不返回行的 Transact-SQL 语句或存储过程的过程,以便在执行语句时其他任务可以同时运行。语句完成后,开发人员必须调用 EndExecuteNonQuery 方法来完成操作。 BeginExecuteNonQuery 方法立即返回(CommandTimeout 对 BeginExecuteNonQuery 没有影响),但在代码执行相应的 EndExecuteNonQuery 方法调用之前,它不得执行任何其他针对同一 SqlCommand 对象启动同步或异步执行的调用。在命令执行完成之前调用 EndExecuteNonQuery 会导致 SqlCommand 对象阻塞,直到执行完成。

    【讨论】:

    【解决方案3】:

    在编写任何 DML 代码之前,您需要考虑很多事情,请考虑以下链接,它为您提供了处理资源的方法。

    https://stackoverflow.com/a/12142911/6783279

    【讨论】:

      【解决方案4】:

      最好与ExecuteNonQuery 一起使用而不是BeginExecuteNonQuery

       try
                  {
                      using (SqlConnection conn = new SqlConnection("your Connection string"))
                      {
                          conn.Open();
      
                          using (SqlCommand cmd = conn.CreateCommand())
                          {
                               cmd.CommandText = @"INSERT INTO TestTable 
                                                      (Type,Serialnumber )
                                                      VALUES (@type,@serialnumber)";
      
      
                              cmd.Parameters.AddWithValue("@type", type);
                              cmd.Parameters.AddWithValue("@serialnumber", serialnumber);
      
                              int rows = cmd.ExecuteNonQuery();
      
                              if (rows == 0)
                                  throw new Exception("Nothing Inserted into the DB");
                          }   
                      }
                  }
                  catch (Exception ex)
                  {
                  }
      

      【讨论】:

        猜你喜欢
        • 2019-11-26
        • 2011-06-03
        • 2017-12-10
        • 1970-01-01
        • 1970-01-01
        • 2021-06-12
        • 2013-09-30
        • 1970-01-01
        相关资源
        最近更新 更多