【问题标题】:SQL Insert Statement, No error or exception, but data not insertedSQL Insert 语句,没有错误或异常,但没有插入数据
【发布时间】:2021-12-27 08:52:09
【问题描述】:

我正在处理一个小组项目,而其他小组参与者之一编写了一个页面的后端逻辑。我运行了他的代码,令我惊讶的是没有错误,而且数据也没有插入数据库。如果有异常,我尝试使用try-catch 强制排除异常,但没有。有什么想法可能导致这种情况吗?

private async Task Adding_Com(string company_ID, string company_Name, string address, string website, string contact_No, string logo)
{
    string Query = "INSERT INTO Company (Comp_ID, CompanyLogo, Comp_TelNum, Comp_Name, Comp_Address, Comp_Website) " +
                   "VALUES (@ComId, @logo, @con, @ComName, @address, @site)";

    await Task.Run(() =>
        {
            using (var conn = new SqlConnection(connString))
            using (var action = new SqlCommand(Query, conn))
            {
                action.Parameters.Add("@ComId", SqlDbType.VarChar, 25).Value = company_ID;
                action.Parameters.Add("@logo", SqlDbType.VarChar, 225).Value = logo;
                action.Parameters.Add("@con", SqlDbType.VarChar, 45).Value = contact_No;
                action.Parameters.Add("@ComName", SqlDbType.VarChar, 55).Value = company_Name;
                action.Parameters.Add("@address", SqlDbType.VarChar, 55).Value = address;
                action.Parameters.Add("@site", SqlDbType.VarChar, 55).Value = website;

                conn.OpenAsync();

                try
                {
                    action.ExecuteNonQueryAsync();
                    _ = MessageBox.Show("Company Has Been Registered");
                }
                catch (SqlException ex)
                {
                    _ = MessageBox.Show(ex.Message);
                }
            }
    });
}

SQL 表

CREATE TABLE Company
(
    Comp_ID VARCHAR(25) PRIMARY KEY NOT NULL ,
    CompanyLogo VARCHAR(255) NOT NULL,
    Comp_TelNum VARCHAR(45) NOT NULL,
    Comp_Name VARCHAR(55) NOT NULL,
    Comp_Address VARCHAR(55) NOT NULL,
    Comp_Website VARCHAR(55) NOT NULL
);

【问题讨论】:

  • 应该是await action.ExecuteNonQueryAsync(); 并且没有理由使用Task.Run
  • @ASh 但它已经在 await Task.Run(() => 中,这有什么不同
  • Task.Run 不应该在这里
  • 没有看到你评论的最后部分
  • 您正在编写异步代码,但不要像@ASh 指出的那样等待其完成。如果没有await,可能会错过可能延迟的sql命令执行,并且执行期间可能发生的异常也会丢失。

标签: c# sql wpf


【解决方案1】:

您的问题是您应该等待 OpenAsyncExecuteNonQueryAsync,因为如果您不这样做,可能会发生竞争条件,您将看不到任何事情发生。

您的代码应如下所示:

using (var conn = new SqlConnection(connString))
using (var action = new SqlCommand(Query, conn))
{
    action.Parameters.Add("@ComId", SqlDbType.VarChar, 25).Value = company_ID;
    action.Parameters.Add("@logo", SqlDbType.VarChar, 225).Value = logo;
    action.Parameters.Add("@con", SqlDbType.VarChar, 45).Value = contact_No;
    action.Parameters.Add("@ComName", SqlDbType.VarChar, 55).Value = company_Name;
    action.Parameters.Add("@address", SqlDbType.VarChar, 55).Value = address;
    action.Parameters.Add("@site", SqlDbType.VarChar, 55).Value = website;

    // We wait to the connection to be opened to make sure we do not work with a closed connection
    await conn.OpenAsync(); 

    try
    {
        // We wait the command to finish before claiming the data was inserted.
        await action.ExecuteNonQueryAsync(); 
        _ = MessageBox.Show("Company Has Been Registered");
    }
    catch (SqlException ex)
    {
        _ = MessageBox.Show(ex.Message);
    }
}

【讨论】:

    猜你喜欢
    • 2014-11-23
    • 2016-07-12
    • 2011-06-22
    • 1970-01-01
    • 1970-01-01
    • 2019-03-16
    • 2021-12-07
    • 2011-02-10
    • 1970-01-01
    相关资源
    最近更新 更多