Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/333.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 开始事务时出错_C#_.net_Sql Server - Fatal编程技术网

C# 开始事务时出错

C# 开始事务时出错,c#,.net,sql-server,C#,.net,Sql Server,我尝试在SQL Server上执行begin事务,但它返回一个错误,我无法找出真正的问题是什么。这是我试过的一些代码 这就是错误: 代码: 您可以使用SqlTransaction using (SqlConnection conn = new SqlConnection("Connection String")) { conn.Open(); SqlTransaction trans; trans = conn.BeginTransaction(); strin

我尝试在SQL Server上执行begin事务,但它返回一个错误,我无法找出真正的问题是什么。这是我试过的一些代码

这就是错误:

代码:


您可以使用SqlTransaction

using (SqlConnection conn = new SqlConnection("Connection String"))
{
    conn.Open();
    SqlTransaction trans;
    trans = conn.BeginTransaction();
    string selectQuery = "your sql query";
    SqlCommand command = new SqlCommand(selectQuery, connection);
    int iResult = command.ExecuteNonQuery();
    if (iResult > 0)
    {
        trans.Commit();
    }else{
        trans.Rollback();
    }
    conn.Close();
}

通过使用@和“不准确”中的值块中的语法,为select查询使用格式化字符串

        string selectQuery = @"
BEGIN TRANSACTION
        UPDATE tester SET test_ad = @dateTimePicker1, test_ud = @dt, test_pd = @dt WHERE test_name = @textBox1;
        INSERT INTO records(testr_status, testr_name, testr_ad, testr_ud, testr_pd, apte_name) VALUES(@testr_status, @comboBox1, @dateTimePicker1, @dt, @dt); 
       COMMIT";

尝试清理一下您的查询,或者将其粘贴到SSM上,并声明您的参数,您将发现问题所在

在您的情况下,
INSERT
语句有一些错误

  • 这不是有效的语法
    值(test_name=@combobox1)
    而是只传递参数
    值(@combobox1)
  • INSERT
    语句中的列多于
    values
    子句中指定的值,您没有为apte\u name提供值。在c代码中,您也需要添加该参数
  • VALUES
    子句缺少右括号
  • 您应该得到这样的结果(未经测试)


    实际的问题是,这是一个大的、无效的SQL语句。使用分号分隔语句,如下所示:

    "BEGIN TRANSACTION;
    INSERT ...;
    UPDATE ...;
    ETC ...;
    COMMIT;"
    

    也就是说,不要在查询字符串中嵌入事务语句。按照Oliver在另一个答案中的建议执行。

    如果抛出异常,您可能还希望回滚。回滚是自动的。异常时,using块将退出,关闭连接,隐式回滚任何打开的事务。
    testr\u name=@comboBox1
    更新中有意义。它在插入时没有意义。删除
    testr\u name=
    等。有关事务要求,请参阅。这不是对您的问题的回答,但我认为您应该阅读此说明
    INSERT
    语句无效。谢谢。它正在工作!但当我在ssms中检查它时,它插入了两条记录(重复记录)。我可以知道为什么吗?
    string selectQuery = 
    @"BEGIN TRANSACTION 
                UPDATE tester SET 
                    test_ad = @dateTimePicker1, 
                    test_ud = @dt, 
                    test_pd = @dt 
                WHERE test_name = @textBox1; 
    
                INSERT INTO records
                (
                    testr_status, 
                    testr_name,
                    testr_ad,
                    testr_ud,  
                    testr_pd, 
                    apte_name
                )
                VALUES
                (
                    @testr_status, 
                    @comboBox1,
                    @dateTimePicker1,
                    @dt, 
                    @dt,
                    @apte_name
                );
    
     COMMIT";
    
    "BEGIN TRANSACTION;
    INSERT ...;
    UPDATE ...;
    ETC ...;
    COMMIT;"