SQL Insert 语句,没有错误或异常,但没有插入数据

Posted

技术标签:

【中文标题】SQL Insert 语句,没有错误或异常,但没有插入数据【英文标题】:SQL Insert Statement, No error or exception, but data not inserted 【发布时间】: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命令执行,并且执行期间可能发生的异常也会丢失。 【参考方案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);
    

【讨论】:

以上是关于SQL Insert 语句,没有错误或异常,但没有插入数据的主要内容,如果未能解决你的问题,请参考以下文章

关于SQL语句中的insert用法

INSERT INTO 语句中的语法错误,没有给出其他详细信息

sql insert into语句错误

SQL 错误:“嵌套的 INSERT、UPDATE、DELETE 或 MERGE 语句必须具有 OUTPUT 子句。” - 在 Azure Databricks 中执行时

为啥设置 SQL 变量会产生错误?

为啥在匿名 PL/SQL 块中没有立即引发异常?