我无法让我的 mySQL 删除命令起作用
I cant get my mySQL Delete command to work
有了它,我可以将行插入到我的 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 Whosebug_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
中的table还是空的
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 行包含预期数据。
for (int i = 0; i < ds.Tables["currentTest"].Rows.Count; i++)
{
ds.Tables["currentTest"].Rows[i]["Timestamp"] = new DateTime(2020, 7, 1, 0, 0, 0);
}
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"]);
上面的行抛出异常 "System.Data.DBConcurrencyException" 并显示消息 "Parallelitätsverletzung: Der DeleteCommand hat sich auf 0 der erwarteten 1 Datensätze ausgewirkt.",这意味着 1 行中的 0 行受到影响
ds.Tables["currentTest"].AcceptChanges();
}
}
}
我不明白如何创建删除命令以使其正常工作
好的,
我自己找到了解决方案。
问题似乎是你必须用数据库中的数据再次填充数据集......
所以这里是额外的代码部分:
在 DataSet 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");
有了它,我可以将行插入到我的 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 Whosebug_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
中的table还是空的
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 行包含预期数据。
for (int i = 0; i < ds.Tables["currentTest"].Rows.Count; i++)
{
ds.Tables["currentTest"].Rows[i]["Timestamp"] = new DateTime(2020, 7, 1, 0, 0, 0);
}
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"]);
上面的行抛出异常 "System.Data.DBConcurrencyException" 并显示消息 "Parallelitätsverletzung: Der DeleteCommand hat sich auf 0 der erwarteten 1 Datensätze ausgewirkt.",这意味着 1 行中的 0 行受到影响
ds.Tables["currentTest"].AcceptChanges();
}
}
}
我不明白如何创建删除命令以使其正常工作
好的, 我自己找到了解决方案。 问题似乎是你必须用数据库中的数据再次填充数据集...... 所以这里是额外的代码部分:
在 DataSet 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");