将值插入mysql数据库无法正常工作

问题描述 投票:0回答:1

我尝试从C#中填充mySQL / MariaDB表。读取表并填充数据集即可。

表结构及其键等已给出,无法更改:

CREATE TABLE `fhem`.`history` (TIMESTAMP TIMESTAMP, DEVICE varchar(32), TYPE varchar(32), EVENT varchar(512), READING varchar(32), VALUE varchar(32), UNIT varchar(32));
CREATE TABLE `fhem`.`current` (TIMESTAMP TIMESTAMP, DEVICE varchar(32), TYPE varchar(32), EVENT varchar(512), READING varchar(32), VALUE varchar(32), UNIT varchar(32));
CREATE INDEX Search_Idx ON `fhem`.`history` (DEVICE, READING, TIMESTAMP);

这是我的代码,用于连接到数据库,创建sql命令和适配器,然后用数据库表中的数据填充数据集。然后,我创建一个新的数据行,用值填充各列,并将其添加到DataSet的DataTable中。

    class Program
    {
        static void Main(string[] args)
        {
            MySqlConnectionStringBuilder connBuilder = new MySqlConnectionStringBuilder();

            connBuilder.Server = "ds2";
            connBuilder.Database = "fhem";
            connBuilder.UserID = "fhemdbuser";
            connBuilder.Port = 3307;
            connBuilder.Password = "!2345Abcde";
            //connBuilder.DefaultCommandTimeout = 120;
            //connBuilder.UseDefaultCommandTimeoutForEF = true;
            //connBuilder.AllowUserVariables = true;

            MySqlConnection conn = new MySqlConnection(connBuilder.ConnectionString);
            conn.Open();
            MySqlCommand selectCmdCurrent = new MySqlCommand("select `TIMESTAMP`, `DEVICE`, `TYPE`, `EVENT`, `READING`, `VALUE`, `UNIT` from current;", conn);
            MySqlCommand selectCmdCurrentTest = new MySqlCommand("select `TIMESTAMP`, `DEVICE`, `TYPE`, `EVENT`, `READING`, `VALUE`, `UNIT` from currentTest;", conn);
            MySqlCommand updateCmd = new MySqlCommand("update `currentTest` set `TIMESTAMP`=@p1,`DEVICE`=@p2,`TYPE`=@p3,`EVENT`=@p4,`READING`=@p5,`VALUE`=@p6,`UNIT`=@p7", conn);
            updateCmd.Parameters.Add("@p1", MySql.Data.MySqlClient.MySqlDbType.DateTime);
            updateCmd.Parameters.Add("@p2", MySql.Data.MySqlClient.MySqlDbType.VarString, 128);
            updateCmd.Parameters.Add("@p3", MySql.Data.MySqlClient.MySqlDbType.VarString, 128);
            updateCmd.Parameters.Add("@p4", MySql.Data.MySqlClient.MySqlDbType.VarString, 512);
            updateCmd.Parameters.Add("@p5", MySql.Data.MySqlClient.MySqlDbType.VarString, 128);
            updateCmd.Parameters.Add("@p6", MySql.Data.MySqlClient.MySqlDbType.VarString, 128);
            updateCmd.Parameters.Add("@p7", MySql.Data.MySqlClient.MySqlDbType.VarString, 128);

            MySqlCommand insertCmd = new MySqlCommand("insert into `currentTest` values(@p1, @p2, @p3, @p4, @p5, @p6, @p7)", conn);
            insertCmd.Parameters.Add("@p1", MySql.Data.MySqlClient.MySqlDbType.DateTime);
            insertCmd.Parameters.Add("@p2", MySql.Data.MySqlClient.MySqlDbType.VarString, 128);
            insertCmd.Parameters.Add("@p3", MySql.Data.MySqlClient.MySqlDbType.VarString, 128);
            insertCmd.Parameters.Add("@p4", MySql.Data.MySqlClient.MySqlDbType.VarString, 512);
            insertCmd.Parameters.Add("@p5", MySql.Data.MySqlClient.MySqlDbType.VarString, 128);
            insertCmd.Parameters.Add("@p6", MySql.Data.MySqlClient.MySqlDbType.VarString, 128);
            insertCmd.Parameters.Add("@p7", MySql.Data.MySqlClient.MySqlDbType.VarString, 128);
            MySqlDataAdapter dataAdapterCurrent = new MySqlDataAdapter(selectCmdCurrent);
            MySqlDataAdapter dataAdapterCurrentTest = new MySqlDataAdapter(selectCmdCurrentTest);
            // MySqlCommandBuilder builder = new MySqlCommandBuilder(dataAdapterCurrent);
            dataAdapterCurrentTest.InsertCommand = insertCmd;
            dataAdapterCurrentTest.UpdateCommand = updateCmd;
            DataSet ds = new DataSet();
            MySqlCommand prepareCmd = new MySqlCommand("truncate currentTest;", conn);
            prepareCmd.ExecuteNonQuery();
            //prepareCmd = new MySqlCommand("insert into currentTest select * from current;", conn);
            //prepareCmd.ExecuteNonQuery();
            prepareCmd = new MySqlCommand("INSERT INTO `currentTest` VALUES(\"2020-06-06 12:45:23\",\"DEVICE\", \"TYPE\", \"EVENT\", \"READING\", \"VALUE\", \"UNIT\")", conn);
            for (int i = 0; i < 10; i++)
                prepareCmd.ExecuteNonQuery();
            dataAdapterCurrentTest.Fill(ds, "currentTest");
            dataAdapterCurrent.Fill(ds, "current");
            int row = 0;

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

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

而手动插入命令将正确的值输入数据库,而通过]的编程方法>

DataRow newrow = ds.Tables["currentTest"].NewRow();
ds.Tables["currentTest"].Rows.Add(newrow);
dataAdapterCurrentTest.Update(ds.Tables["currentTest"]);
ds.Tables["currentTest"].AcceptChanges();

仅添加具有有效日期的行,而其他列为NULL。

[编辑#1]:我对代码进行了一些更改,基本上,我修改了第二个for循环以像在第一个循环中那样插入新数据。然后,将数据正确写入数据库。但是我怀疑,是否是调用.ExecuteNonQuery()几千次以将我的日志文件放入数据库的一种有效方式...

[编辑#2]:120分钟后,带有.ExecuteNonQuery()的数据库中的100000个插入仍在运行。这非常慢。

我尝试从C#中填充mySQL / MariaDB表。读取表并填充数据集即可。表结构及其键等已给出且无法更改:CREATE TABLE`fhem`.` ... >>>> [[

您的代码几乎是正确的,只需进行2次更改。 1.在dataAdapterCurrentTest.Update(ds.Tables["currentTest"])
之前添加以下行

new MySqlCommandBuilder(dataAdapterCurrentTest);

2.代码注释行

dataAdapterCurrentTest.InsertCommand=insertCmd

所以最终的代码是

class Program { static void Main(string[] args) { MySqlConnectionStringBuilder connBuilder = new MySqlConnectionStringBuilder(); connBuilder.Server = "ds2"; connBuilder.Database = "fhem"; connBuilder.UserID = "fhemdbuser"; connBuilder.Port = 3307; connBuilder.Password = "!2345Abcde"; //connBuilder.DefaultCommandTimeout = 120; //connBuilder.UseDefaultCommandTimeoutForEF = true; //connBuilder.AllowUserVariables = true; MySqlConnection conn = new MySqlConnection(connBuilder.ConnectionString); conn.Open(); MySqlCommand selectCmdCurrent = new MySqlCommand("select `TIMESTAMP`, `DEVICE`, `TYPE`, `EVENT`, `READING`, `VALUE`, `UNIT` from current;", conn); MySqlCommand selectCmdCurrentTest = new MySqlCommand("select `TIMESTAMP`, `DEVICE`, `TYPE`, `EVENT`, `READING`, `VALUE`, `UNIT` from currentTest;", conn); MySqlCommand updateCmd = new MySqlCommand("update `currentTest` set `TIMESTAMP`=@p1,`DEVICE`=@p2,`TYPE`=@p3,`EVENT`=@p4,`READING`=@p5,`VALUE`=@p6,`UNIT`=@p7", conn); updateCmd.Parameters.Add("@p1", MySql.Data.MySqlClient.MySqlDbType.DateTime); updateCmd.Parameters.Add("@p2", MySql.Data.MySqlClient.MySqlDbType.VarString, 128); updateCmd.Parameters.Add("@p3", MySql.Data.MySqlClient.MySqlDbType.VarString, 128); updateCmd.Parameters.Add("@p4", MySql.Data.MySqlClient.MySqlDbType.VarString, 512); updateCmd.Parameters.Add("@p5", MySql.Data.MySqlClient.MySqlDbType.VarString, 128); updateCmd.Parameters.Add("@p6", MySql.Data.MySqlClient.MySqlDbType.VarString, 128); updateCmd.Parameters.Add("@p7", MySql.Data.MySqlClient.MySqlDbType.VarString, 128); MySqlCommand insertCmd = new MySqlCommand("insert into `currentTest` values(@p1, @p2, @p3, @p4, @p5, @p6, @p7)", conn); insertCmd.Parameters.Add("@p1", MySql.Data.MySqlClient.MySqlDbType.DateTime); insertCmd.Parameters.Add("@p2", MySql.Data.MySqlClient.MySqlDbType.VarString, 128); insertCmd.Parameters.Add("@p3", MySql.Data.MySqlClient.MySqlDbType.VarString, 128); insertCmd.Parameters.Add("@p4", MySql.Data.MySqlClient.MySqlDbType.VarString, 512); insertCmd.Parameters.Add("@p5", MySql.Data.MySqlClient.MySqlDbType.VarString, 128); insertCmd.Parameters.Add("@p6", MySql.Data.MySqlClient.MySqlDbType.VarString, 128); insertCmd.Parameters.Add("@p7", MySql.Data.MySqlClient.MySqlDbType.VarString, 128); MySqlDataAdapter dataAdapterCurrent = new MySqlDataAdapter(selectCmdCurrent); MySqlDataAdapter dataAdapterCurrentTest = new MySqlDataAdapter(selectCmdCurrentTest); // MySqlCommandBuilder builder = new MySqlCommandBuilder(dataAdapterCurrent); // dataAdapterCurrentTest.InsertCommand = insertCmd; dataAdapterCurrentTest.UpdateCommand = updateCmd; DataSet ds = new DataSet(); MySqlCommand prepareCmd = new MySqlCommand("truncate currentTest;", conn); prepareCmd.ExecuteNonQuery(); //prepareCmd = new MySqlCommand("insert into currentTest select * from current;", conn); //prepareCmd.ExecuteNonQuery(); prepareCmd = new MySqlCommand("INSERT INTO `currentTest` VALUES(\"2020-06-06 12:45:23\",\"DEVICE\", \"TYPE\", \"EVENT\", \"READING\", \"VALUE\", \"UNIT\")", conn); for (int i = 0; i < 10; i++) prepareCmd.ExecuteNonQuery(); dataAdapterCurrentTest.Fill(ds, "currentTest"); dataAdapterCurrent.Fill(ds, "current"); int row = 0; Stopwatch sw = new Stopwatch(); for (int i = 0; i < 10; i++) { DataRow newrow = ds.Tables["currentTest"].NewRow(); newrow["Timestamp"] = DateTime.Now; newrow["Device"] = "Device"; newrow["TYPE"] = "Type"; newrow["EVENT"] = "Event"; newrow["READING"] = "Reading"; newrow["VALUE"] = "Value"; newrow["UNIT"] = "Unit"; ds.Tables["currentTest"].Rows.Add(newrow); } new MySqlCommandBuilder(dataAdapterCurrentTest); dataAdapterCurrentTest.Update(ds.Tables["currentTest"]); ds.Tables["currentTest"].AcceptChanges(); } }

c# mysql dataadapter
1个回答
0
投票
您的代码几乎是正确的,只需进行2次更改。 1.在dataAdapterCurrentTest.Update(ds.Tables["currentTest"])
© www.soinside.com 2019 - 2024. All rights reserved.