【问题标题】:Insert in Database is executed only the first time I start the ASP.NET application?仅在我第一次启动 ASP.NET 应用程序时才执行插入数据库?
【发布时间】:2020-04-21 00:15:55
【问题描述】:

我的问题是,在我的 ASP.NET 应用程序中,仅在应用程序启动时第一次执行从表单中插入数据的数据库。之后,插入也没有完成。

我尝试调试应用程序,并且在调试模式下每次都会插入数据。我还使用了 SQL Server 探查器,除了我第一次在数据库中提交表单时,数据库中没有插入。但是当我在调试模式下运行时,插入完成没有任何问题。

这是来自控制器的方法:

[HttpPost]
public ActionResult Form(Product p)
{
    IO.Insert(p);
    return RedirectToAction("Index");
} 

这是插入的方法:

public static void Insert(Product pr)
{
    using (SqlConnection connection = new SqlConnection(ConfigurationManager.AppSettings["Database"]))
    {
        connection.Open();

        string s = "INSERT INTO Product (Id, Name, Price, Description, Category, Image) VALUES (@GUID, @Name, @Price, @Description, @Category, @Image)";

        using (SqlCommand cmd = new SqlCommand(s, connection))
        {
            cmd.Parameters.Add("@GUID", SqlDbType.UniqueIdentifier).Value = new Guid();
            cmd.Parameters.Add("@Name", SqlDbType.NChar).Value = pr.Name;
            cmd.Parameters.Add("@Price", SqlDbType.Int).Value = pr.Price;
            cmd.Parameters.Add("@Description", SqlDbType.NVarChar).Value = pr.Description;
            cmd.Parameters.Add("@Category", SqlDbType.NVarChar).Value = pr.Description;
            cmd.Parameters.Add("@Image", SqlDbType.VarBinary).Value = IO.ImageInsert(pr.Picture);

            cmd.BeginExecuteNonQuery();
        }
    }
}

另外,我没有使用除主线程之外的任何其他线程。

【问题讨论】:

    标签: c# asp.net sql-server ado.net


    【解决方案1】:

    您在 using 块中拥有该命令,cmd.BeginExecuteNonQuery(); 启动此 SqlCommand 描述的 Transact-SQL 语句或存储过程的异步执行。使用 BeginExecuteNonQuery 方法返回的IAsyncResultIsCompleted 属性或使用返回的IAsyncResultAsyncWaitHandle 属性轮询以确定命令是否已完成,您无需等待它完成。

    您可以如下更改代码以等待命令执行。

    IAsyncResult result = cmd.BeginExecuteNonQuery();
    
    while (!result.IsCompleted)
    {
       // Wait till the command executes
       Console.WriteLine("Waiting for query execution");
    }
    Console.WriteLine("Command complete. Affected {0} rows.", cmd.EndExecuteNonQuery(result));
    

    每个微软

    BeginExecuteNonQuery 方法启动异步进程 执行 Transact-SQL 语句或存储过程 返回行,以便其他任务可以同时运行,而 语句正在执行。声明完成后,开发人员 必须调用 EndExecuteNonQuery 方法才能完成操作。这 BeginExecuteNonQuery 方法立即返回,但直到代码 执行相应的 EndExecuteNonQuery 方法调用,它不能 执行任何其他启动同步或异步的调用 针对同一个 SqlCommand 对象执行。调用 命令执行完成前的 EndExecuteNonQuery 原因 要阻塞的 SqlCommand 对象,直到执行完成。

    【讨论】:

    • 这是正确的答案,但只是补充一下,我认为对于这种情况,使用 cmd.ExecuteNonQuery(); 更容易
    【解决方案2】:

    您可以使用 ExecuteNonQuery 而不是 BeginExecuteNonQuery,因为您正在关闭连接并且查询仍在运行。

    cmd.ExecuteNonQuery() 用于单次插入,也可以使用线程池

    ThreadPool.QueueUserWorkItem(delegate {
    using (SqlConnection sqlConnection = new SqlConnection("blahblah;Asynchronous Processing=true;") {
        using (SqlCommand command = new SqlCommand("someProcedureName", sqlConnection)) {
            sqlConnection.Open();
    
            command.CommandType = CommandType.StoredProcedure;
            command.Parameters.AddWithValue("@param1", param1);
    
            command.ExecuteNonQuery();
        }
    }});
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-06-12
      • 1970-01-01
      • 2020-07-05
      • 2018-03-11
      相关资源
      最近更新 更多