为了账号安全,请及时绑定邮箱和手机立即绑定

线程和SQL插入删除奇怪的问题

线程和SQL插入删除奇怪的问题

C#
回首忆惘然 2022-06-19 16:50:02
我有一个 Windows 应用程序,它调用服务然后写入数据库。在写结果之前,我删除了旧数据。Windows 应用程序使用每 5 分钟运行一次的计时器调用该服务。问题是:即使我使用删除,代码也不会删除记录。如果我不使用计时器调用它,它就可以工作。我使用事务,使用 EF 不起作用。它仍然不删除记录。 static void Main(string[] args) {        //////Start Timer        Timer timer = new Timer();        timer.Interval = 5 * 60 * 1000; // converts ms to minutes        timer.Elapsed += new ElapsedEventHandler(InsertRecords);        timer.Enabled = true;        timerFired.WaitOne();         } public void InsertRecords() {      using (SqlConnection connection = new SqlConnection(connectionstr))     {         connection.Open();         // Delete old entries         SqlTransaction trans = connection.BeginTransaction();         string sql = "Delete  from PhilaMethod ";         SqlCommand cmd = new SqlCommand(sql, connection, trans);         trans.Commit();         connection.Close();     }     var conn = connectionstr;     string SQL1 = "";     foreach (PhilaMethod phila in phila2)     {         SQL1 += "INSERT INTO PhilaMethod(Name,PS1,PS2,RSI1,) values ('" + phila.Name + "','"+phila.PS1+"','"+phila.PS2+"','"+phila.RSI1+"','"+phila.RSI2+"'); ";     }     string SQL2 = "Delete  from philamethod";     using (SqlConnection connection = new SqlConnection(conn))     {            connection.Open();            SqlTransaction sqlTran = connection.BeginTransaction();            SqlCommand command = connection.CreateCommand();            command.Transaction = sqlTran;            try            {                command.CommandText = SQL2;                int rowsAffected = command.ExecuteNonQuery();                if(rowsAffected >= 0)                {                    command.CommandText = SQL2;                    int rowsAffected2 = command.ExecuteNonQuery();                    if(rowsAffected2 == 0)                    {                        command.CommandText = SQL1;                        rowsAffected += command.ExecuteNonQuery();                    }                }      
查看完整描述

2 回答

?
慕容708150

TA贡献1831条经验 获得超4个赞

您需要执行命令。


using (SqlConnection connection = new SqlConnection(connectionstr))

    {

        connection.Open();

        // Delete old entries

        SqlTransaction trans = connection.BeginTransaction();

        string sql = "Delete  from PhilaMethod ";


        SqlCommand cmd = new SqlCommand(sql, connection, trans);

        cmd.ExecuteNonQuery(); // <--- added this

        trans.Commit();

        connection.Close();

    }


查看完整回答
反对 回复 2022-06-19
?
元芳怎么了

TA贡献1798条经验 获得超7个赞

您的代码存在一些问题。您应该始终处理一次性物品。通过调用Dispose()或使用using {}块,这是首选方式。


1.)您没有处理您的 SqlCommand 对象您应该将它们包装在 using 语句中以避免此错误和可能的内存泄漏。


2.) 您没有处理您的 SqlTransaction 对象您应该始终将其包装在 using 语句中以避免可能的内存泄漏。


3.)像其他人已经写过你必须执行一个命令。;)


 using (SqlConnection connection = new SqlConnection(connectionstr))

 {

     connection.Open();


     // Delete old entries

     SqlTransaction trans = connection.BeginTransaction();

     string sql = "Delete  from PhilaMethod ";


     SqlCommand cmd = new SqlCommand(sql, connection, trans);

     trans.Commit();

     connection.Close();

 }

在此代码中,缺少执行。;) 所以你的代码应该如下所示。(未测试)


 using (SqlConnection connection = new SqlConnection(connectionstr))

 {

     connection.Open();

     // Delete old entries

     using (SqlTransaction trans = connection.BeginTransaction())

     {

       string sql = "Delete  from PhilaMethod ";

       using (SqlCommand cmd = new SqlCommand(sql, connection, trans))

       {

         cmd.ExecuteNonQuery(); // or whatever method you need

       }

       trans.Commit();

     }

     connection.Close();         

 }


查看完整回答
反对 回复 2022-06-19
  • 2 回答
  • 0 关注
  • 131 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信