C# 我无法使mySQL Delete命令正常工作

C# 我无法使mySQL Delete命令正常工作,c#,mysql,sql-delete,C#,Mysql,Sql Delete,这样我就可以将行插入mySQL数据库。 现在我正试图从数据库中删除行 我将我的代码减少到了最低限度: 您需要一个对MySql.Data.MySqlClient的引用,并使用.Net 4.5.2 using System; using System.Data; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; using MySql.Data.M

这样我就可以将行插入mySQL数据库。 现在我正试图从数据库中删除行

我将我的代码减少到了最低限度:

您需要一个对MySql.Data.MySqlClient的引用,并使用.Net 4.5.2

using System;
using System.Data;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using MySql.Data.MySqlClient;
namespace StackOverFlow_mySQLTest
{
    class Program
    {
        private static string server = "ds2";
        private static string database = "fhem";
        private static string user = "fhemdbuser";
        private static string passwort = "!2345Abcde";
        static void Main(string[] args)
        {
            MySqlCommand cmd;
            MySqlTransaction trans;

            MySqlConnection connection;

            MySqlConnectionStringBuilder builder = new MySqlConnectionStringBuilder();
            builder.Server = server;
            builder.Database = database;
            builder.UserID = user;
            builder.Port = 3307;
            builder.Password = passwort;
            builder.DefaultCommandTimeout = 120;
            builder.UseDefaultCommandTimeoutForEF = true;
            connection = new MySqlConnection(builder.ConnectionString);


            // Datenbank öffnen
            connection.Open();


            MySqlCommand selectCmdCurrentTest = new MySqlCommand("select `TIMESTAMP`, `DEVICE`, `TYPE`, `EVENT`, `READING`, `VALUE`, `UNIT` from currentTest;", connection);
            MySqlDataAdapter dataAdapterCurrentTest = new MySqlDataAdapter(selectCmdCurrentTest);
            MySqlCommand updateCmd = new MySqlCommand("update `currentTest` set `TIMESTAMP`= @p1,`DEVICE`= @p2,`TYPE`= @p3,`EVENT`= @p4,`READING`= @p5,`VALUE`= @p6,`UNIT`= @p7", connection);
            MySqlParameter p1, p2, p3, p4, p5, p6, p7;

            p1 = new MySql.Data.MySqlClient.MySqlParameter() { SourceColumn = "Timestamp", ParameterName = "@p1", MySqlDbType = MySql.Data.MySqlClient.MySqlDbType.DateTime};
            p2 = new MySql.Data.MySqlClient.MySqlParameter() { SourceColumn = "Device", ParameterName = "@p2", MySqlDbType = MySql.Data.MySqlClient.MySqlDbType.VarString};
            p3 = new MySql.Data.MySqlClient.MySqlParameter() { SourceColumn = "Type", ParameterName = "@p3", MySqlDbType = MySql.Data.MySqlClient.MySqlDbType.VarString};
            p4 = new MySql.Data.MySqlClient.MySqlParameter() { SourceColumn = "Event", ParameterName = "@p4", MySqlDbType = MySql.Data.MySqlClient.MySqlDbType.VarString};
            p5 = new MySql.Data.MySqlClient.MySqlParameter() { SourceColumn = "Reading", ParameterName = "@p5", MySqlDbType = MySql.Data.MySqlClient.MySqlDbType.VarString};
            p6 = new MySql.Data.MySqlClient.MySqlParameter() { SourceColumn = "Value", ParameterName = "@p6", MySqlDbType = MySql.Data.MySqlClient.MySqlDbType.VarString};
            p7 = new MySql.Data.MySqlClient.MySqlParameter() { SourceColumn = "Unit", ParameterName = "@p7", MySqlDbType = MySql.Data.MySqlClient.MySqlDbType.VarString};

            updateCmd.Parameters.AddRange(new[] { p1, p2, p3, p4, p5, p6, p7 });
            dataAdapterCurrentTest.UpdateCommand = updateCmd;
            MySqlCommand deleteCmd = new MySqlCommand("delete from  `currentTest` where `TIMESTAMP`like @p1 and `DEVICE` like @p2 and `TYPE` like  @p3 and `EVENT` like  @p4 and `READING` like  @p5 and `VALUE` like  @p6 and `UNIT` like  @p7", connection);
            p1 = new MySql.Data.MySqlClient.MySqlParameter() { SourceColumn = "Timestamp", ParameterName = "@p1", MySqlDbType = MySql.Data.MySqlClient.MySqlDbType.DateTime, SourceVersion = DataRowVersion.Original };
            p2 = new MySql.Data.MySqlClient.MySqlParameter() { SourceColumn = "Device", ParameterName = "@p2", MySqlDbType = MySql.Data.MySqlClient.MySqlDbType.VarString, SourceVersion = DataRowVersion.Original };
            p3 = new MySql.Data.MySqlClient.MySqlParameter() { SourceColumn = "Type", ParameterName = "@p3", MySqlDbType = MySql.Data.MySqlClient.MySqlDbType.VarString, SourceVersion = DataRowVersion.Original };
            p4 = new MySql.Data.MySqlClient.MySqlParameter() { SourceColumn = "Event", ParameterName = "@p4", MySqlDbType = MySql.Data.MySqlClient.MySqlDbType.VarString, SourceVersion = DataRowVersion.Original };
            p5 = new MySql.Data.MySqlClient.MySqlParameter() { SourceColumn = "Reading", ParameterName = "@p5", MySqlDbType = MySql.Data.MySqlClient.MySqlDbType.VarString, SourceVersion = DataRowVersion.Original };
            p6 = new MySql.Data.MySqlClient.MySqlParameter() { SourceColumn = "Value", ParameterName = "@p6", MySqlDbType = MySql.Data.MySqlClient.MySqlDbType.VarString, SourceVersion = DataRowVersion.Original };
            p7 = new MySql.Data.MySqlClient.MySqlParameter() { SourceColumn = "Unit", ParameterName = "@p7", MySqlDbType = MySql.Data.MySqlClient.MySqlDbType.VarString, SourceVersion = DataRowVersion.Original };

            deleteCmd.Parameters.AddRange(new[] { p1, p2, p3, p4, p5, p6, p7 });
            dataAdapterCurrentTest.DeleteCommand = deleteCmd;

            DataSet ds = new DataSet();
            dataAdapterCurrentTest.Fill(ds, "currentTest");
此处,
ds
中的表格仍然为空


            for (int i = 0; i < 10; i++)
            {

                DataRow newrow = ds.Tables["currentTest"].NewRow();
                newrow["Timestamp"] = DateTime.Now;
                newrow["Device"] = "Device" + DateTime.Now.Millisecond.ToString();
                newrow["TYPE"] = "Type" + DateTime.Now.Millisecond.ToString();
                newrow["EVENT"] = "Event" + DateTime.Now.Millisecond.ToString();
                newrow["READING"] = "Reading" + DateTime.Now.Millisecond.ToString();
                newrow["VALUE"] = "Value" + DateTime.Now.Millisecond.ToString();
                newrow["UNIT"] = "Unit" + DateTime.Now.Millisecond.ToString();
                ds.Tables["currentTest"].Rows.Add(newrow);
            }

            new MySqlCommandBuilder(dataAdapterCurrentTest);

            dataAdapterCurrentTest.Update(ds.Tables["currentTest"]);
            ds.Tables["currentTest"].AcceptChanges();
尽管如此,
ds
仍有10行包含预期数据(与之前相同,但日期设置为2020-07-01)


            for (int i = 0; i < ds.Tables["currentTest"].Rows.Count; i++)
            {
                ds.Tables["currentTest"].Rows[i].Delete();
            }
            new MySqlCommandBuilder(dataAdapterCurrentTest);
            dataAdapterCurrentTest.Update(ds.Tables["currentTest"]);
我不知道如何创建delete命令以使其正常工作, 我自己找到了解决办法。 问题似乎是您必须用数据库中的数据再次填充数据集。。。 下面是附加的代码部分:

数据集ds=new DataSet()之前;

            MySqlParameter p1, p2, p3, p4, p5, p6, p7;

            MySqlCommand deleteCmd = new MySqlCommand("delete from  `currentTest` where `TIMESTAMP`like @p1 and `DEVICE` like @p2 and `TYPE` like  @p3 and `EVENT` like  @p4 and `READING` like  @p5 and `VALUE` like  @p6 and `UNIT` like  @p7", conn);
            p1 = new MySql.Data.MySqlClient.MySqlParameter() { SourceColumn = "Timestamp", ParameterName = "@p1", MySqlDbType = MySql.Data.MySqlClient.MySqlDbType.DateTime, SourceVersion = DataRowVersion.Original };
            p2 = new MySql.Data.MySqlClient.MySqlParameter() { SourceColumn = "Device", ParameterName = "@p2", MySqlDbType = MySql.Data.MySqlClient.MySqlDbType.VarString, SourceVersion = DataRowVersion.Original };
            p3 = new MySql.Data.MySqlClient.MySqlParameter() { SourceColumn = "Type", ParameterName = "@p3", MySqlDbType = MySql.Data.MySqlClient.MySqlDbType.VarString, SourceVersion = DataRowVersion.Original };
            p4 = new MySql.Data.MySqlClient.MySqlParameter() { SourceColumn = "Event", ParameterName = "@p4", MySqlDbType = MySql.Data.MySqlClient.MySqlDbType.VarString, SourceVersion = DataRowVersion.Original };
            p5 = new MySql.Data.MySqlClient.MySqlParameter() { SourceColumn = "Reading", ParameterName = "@p5", MySqlDbType = MySql.Data.MySqlClient.MySqlDbType.VarString, SourceVersion = DataRowVersion.Original };
            p6 = new MySql.Data.MySqlClient.MySqlParameter() { SourceColumn = "Value", ParameterName = "@p6", MySqlDbType = MySql.Data.MySqlClient.MySqlDbType.VarString, SourceVersion = DataRowVersion.Original };
            p7 = new MySql.Data.MySqlClient.MySqlParameter() { SourceColumn = "Unit", ParameterName = "@p7", MySqlDbType = MySql.Data.MySqlClient.MySqlDbType.VarString, SourceVersion = DataRowVersion.Original };

            deleteCmd.Parameters.AddRange(new[] { p1, p2, p3, p4, p5, p6, p7 });
            deleteCmd.UpdatedRowSource = UpdateRowSource.FirstReturnedRecord;
            dataAdapterCurrentTest.DeleteCommand = deleteCmd;

添加行后:

            new MySqlCommandBuilder(dataAdapterCurrentTest);

            dataAdapterCurrentTest.Update(ds.Tables["currentTest"]);
            ds.Tables["currentTest"].AcceptChanges();
            ds.Tables["currentTest"].Clear();
            dataAdapterCurrentTest.Fill(ds, "currentTest");
            for (int i = 0; i < 20; i++)
            {
                ds.Tables["currentTest"].Rows[i].Delete();
            }
            new MySqlCommandBuilder(dataAdapterCurrentTest);

            dataAdapterCurrentTest.Update(ds.Tables["currentTest"]);
            ds.Tables["currentTest"].AcceptChanges();
            ds.Tables["currentTest"].Clear();
            dataAdapterCurrentTest.Fill(ds, "currentTest");

新建MySqlCommandBuilder(dataAdapterCurrentTest);
dataAdapterCurrentTest.Update(ds.Tables[“currentTest”]);
表[“currentTest”].AcceptChanges();
ds.表格[“currentTest”].Clear();
dataAdapterCurrentTest.Fill(ds,“currentTest”);
对于(int i=0;i<20;i++)
{
ds.Tables[“currentTest”].Rows[i].Delete();
}
新的MySqlCommandBuilder(dataAdapterCurrentTest);
dataAdapterCurrentTest.Update(ds.Tables[“currentTest”]);
表[“currentTest”].AcceptChanges();
ds.表格[“currentTest”].Clear();
dataAdapterCurrentTest.Fill(ds,“currentTest”);
好的, 我自己找到了解决办法。 问题似乎是您必须用数据库中的数据再次填充数据集。。。 下面是附加的代码部分:

数据集ds=new DataSet()之前;

            MySqlParameter p1, p2, p3, p4, p5, p6, p7;

            MySqlCommand deleteCmd = new MySqlCommand("delete from  `currentTest` where `TIMESTAMP`like @p1 and `DEVICE` like @p2 and `TYPE` like  @p3 and `EVENT` like  @p4 and `READING` like  @p5 and `VALUE` like  @p6 and `UNIT` like  @p7", conn);
            p1 = new MySql.Data.MySqlClient.MySqlParameter() { SourceColumn = "Timestamp", ParameterName = "@p1", MySqlDbType = MySql.Data.MySqlClient.MySqlDbType.DateTime, SourceVersion = DataRowVersion.Original };
            p2 = new MySql.Data.MySqlClient.MySqlParameter() { SourceColumn = "Device", ParameterName = "@p2", MySqlDbType = MySql.Data.MySqlClient.MySqlDbType.VarString, SourceVersion = DataRowVersion.Original };
            p3 = new MySql.Data.MySqlClient.MySqlParameter() { SourceColumn = "Type", ParameterName = "@p3", MySqlDbType = MySql.Data.MySqlClient.MySqlDbType.VarString, SourceVersion = DataRowVersion.Original };
            p4 = new MySql.Data.MySqlClient.MySqlParameter() { SourceColumn = "Event", ParameterName = "@p4", MySqlDbType = MySql.Data.MySqlClient.MySqlDbType.VarString, SourceVersion = DataRowVersion.Original };
            p5 = new MySql.Data.MySqlClient.MySqlParameter() { SourceColumn = "Reading", ParameterName = "@p5", MySqlDbType = MySql.Data.MySqlClient.MySqlDbType.VarString, SourceVersion = DataRowVersion.Original };
            p6 = new MySql.Data.MySqlClient.MySqlParameter() { SourceColumn = "Value", ParameterName = "@p6", MySqlDbType = MySql.Data.MySqlClient.MySqlDbType.VarString, SourceVersion = DataRowVersion.Original };
            p7 = new MySql.Data.MySqlClient.MySqlParameter() { SourceColumn = "Unit", ParameterName = "@p7", MySqlDbType = MySql.Data.MySqlClient.MySqlDbType.VarString, SourceVersion = DataRowVersion.Original };

            deleteCmd.Parameters.AddRange(new[] { p1, p2, p3, p4, p5, p6, p7 });
            deleteCmd.UpdatedRowSource = UpdateRowSource.FirstReturnedRecord;
            dataAdapterCurrentTest.DeleteCommand = deleteCmd;

添加行后:

            new MySqlCommandBuilder(dataAdapterCurrentTest);

            dataAdapterCurrentTest.Update(ds.Tables["currentTest"]);
            ds.Tables["currentTest"].AcceptChanges();
            ds.Tables["currentTest"].Clear();
            dataAdapterCurrentTest.Fill(ds, "currentTest");
            for (int i = 0; i < 20; i++)
            {
                ds.Tables["currentTest"].Rows[i].Delete();
            }
            new MySqlCommandBuilder(dataAdapterCurrentTest);

            dataAdapterCurrentTest.Update(ds.Tables["currentTest"]);
            ds.Tables["currentTest"].AcceptChanges();
            ds.Tables["currentTest"].Clear();
            dataAdapterCurrentTest.Fill(ds, "currentTest");

新建MySqlCommandBuilder(dataAdapterCurrentTest);
dataAdapterCurrentTest.Update(ds.Tables[“currentTest”]);
表[“currentTest”].AcceptChanges();
ds.表格[“currentTest”].Clear();
dataAdapterCurrentTest.Fill(ds,“currentTest”);
对于(int i=0;i<20;i++)
{
ds.Tables[“currentTest”].Rows[i].Delete();
}
新的MySqlCommandBuilder(dataAdapterCurrentTest);
dataAdapterCurrentTest.Update(ds.Tables[“currentTest”]);
表[“currentTest”].AcceptChanges();
ds.表格[“currentTest”].Clear();
dataAdapterCurrentTest.Fill(ds,“currentTest”);

值得注意的是,你的数据访问策略已经过时了。考虑使用实体框架核心或者是一个类似于ORM的小说家。我想你可以在这里找到答案。Robththavey:如果使用起来很简单,我会使用EFC。使用MSSQL或LoalDB使用EF,但是我不能让它与MySQL一起工作。所以我被困在这里。但是C考虑到我实现的目的,它仍然可以完成任务。@Ramin,我读过这篇文章,但是你一次删除一个数据行,这不是很低效吗?我想让一个实现使用数据集、数据表和数据行来处理我的数据。Dapper与任何实现
DbConnection
,的数据库一起工作。这是为了什么值得一提的是,你的数据访问策略已经过时了。考虑使用实体框架核心或者一个类似于微细ORM的DaPror。我想你可以在这里找到答案。Robththavey:如果它很容易,我会使用EFC。使用EngsMsSQL或LoalDB工作,但是我不能让它与MySQL一起工作。所以我被困在这里。但是考虑到PrPOS。在我的实现中,它仍然起作用。@Ramin,我读过这篇文章,但是你一次删除一行数据,这不是很低效吗?我希望有一个使用数据集、数据表和数据行来处理我的数据的实现。Dapper可以与任何实现
DbConnection
的数据库一起工作。