我正在开发一个项目,我必须通过循环更新MySql中的表并在C#中更新每一行(逐个)。 注意:我必须更新表格中只有一列的值。
现在,我知道这个问题曾经被问过很多次,但是经过花了很多时间在互联网上搜索后,我找不到解决问题的方法。
更多说明:
所以我已经知道了使这项工作成为必要的一些事情:
SELECT
和UPDATE
查询/命令。所以我需要做的唯一事情就是循环本身。
现在,在我的研究中,我发现了一些建议使用Reader
的答案。我不知道这是否是我需要的和(如果是的话)如何正确使用它。
下面是我到目前为止的代码(用于建立连接和执行查询)。
我的代码:
class ReaderDemo1
{
public static void Update()
{
Console.WriteLine("[Core] Opening Connection To Database...");
Database.openStockConn(Settings.databaseName, Settings.databaseUsername, Settings.databasePassword, Settings.sshHost, Settings.sshUsername, Settings.sshPassword);
if (Database.stockConn.State != ConnectionState.Open)
{
Database.openStockConn(Settings.databaseName, Settings.databaseUsername, Settings.databasePassword, Settings.sshHost, Settings.sshUsername, Settings.sshPassword);
}
Console.WriteLine("[Core] database connection is now open!\n");
MySqlCommand cmd = new MySqlCommand("SELECT value FROM catalog_product_entity_decimal", Database.stockConn);
try
{
Console.WriteLine("[Price] Updating Prices...");
MySqlCommand command = new MySqlCommand("UPDATE catalog_product_entity_decimal SET value= 1112 WHERE value_id= 4063", Database.stockConn);
command.ExecuteNonQuery();
Console.WriteLine("[Price] Prices Have Been Updated!");
}
catch
{
Console.WriteLine("Updating Failed!");
}
finally
{
if (Database.stockConn != null)
{
Database.stockConn.Close();
}
}
}
}
只是给出一些额外的背景:
Database.cs
是我创建连接的位置(SSH
和MySql
)Settings.cs
是我拥有SSH
和MySql
个关联的所有登录数据的地方。如果你们想知道,我已经尝试了一些关于循环的事情但是(正如我已经提到的)这些尝试都没有成功。
我尝试使用阅读器:
using (var reader = command.ExecuteReader())
{
var indexOfValue = reader.GetOrdinal("value");
while (reader.Read())
{
var price1 = reader.GetValue(indexOfValue);
Console.WriteLine("Executing Update Command...");
MySqlCommand cmd = new MySqlCommand("UPDATE catalog_product_entity_decimal SET value= 1222 WHERE entity_id= 759 AND entity_id= 839 AND entity_id= 881", con);
cmd.ExecuteNonQuery();
Console.WriteLine("Update Command Executed!");
}
}
如上所述,上面的代码不起作用,我希望它如何工作(可能因为它现在实际上没有做任何事情)。只是为了让你们知道,我没有遇到错误。我只是坚持如何做到这一点。
我希望你们其中一个人可以帮助我,或指出我的方向,如果你认为我的问题与另一个问题重复,那就告诉我,我会调查一下! :)提前谢谢。
亲切的问候,
LKS
修改
如果你们想知道,this就是我的表格。 该表包含大约5600行,因此这些行只是顶行。
答案 0 :(得分:2)
我想不出你想要一次读一行并在循环中一次写一行的任何理由,但这就是你可以做到的。
使用一个SqlCommand读取和单独的SqlCommand进行更新。为每次更新更改循环中的参数。
public static void Update()
{
Database.openStockConn(Settings.databaseName, Settings.databaseUsername, Settings.databasePassword, Settings.sshHost, Settings.sshUsername, Settings.sshPassword);
if (Database.stockConn.State != ConnectionState.Open)
{
Database.openStockConn(Settings.databaseName, Settings.databaseUsername, Settings.databasePassword, Settings.sshHost, Settings.sshUsername, Settings.sshPassword);
}
Console.WriteLine("[Core] database connection is now open!\n");
MySqlCommand cmd1 = new MySqlCommand("SELECT value FROM catalog_product_entity_decimal", Database.stockConn);
MySqlCommand cmd2 = new MySqlCommand("UPDATE catalog_product_entity_decimal SET value= 1112 WHERE value_id= 4063", Database.stockConn);
try
{
Console.WriteLine("[Price] Updating Prices...");
using (var reader = cmd1.ExecuteReader())
{
var indexOfValue = reader.GetOrdinal("value");
while (reader.Read())
{
var price1 = reader.GetValue(indexOfValue);
Console.WriteLine("Executing Update Command...");
cmd2.ExecuteNonQuery();
Console.WriteLine("Update Command Executed!");
}
}
}
catch
{
Console.WriteLine("Updating Failed!");
}
finally
{
if (Database.stockConn != null)
{
Database.stockConn.Close();
}
}
}
答案 1 :(得分:2)
SQL是基于集合的,这意味着几乎总有一种更好的方法然后循环遍历表。 您的问题也是如此。您希望避免循环遍历整个表以逐个记录更新,因为这非常慢。
对于我想要实现的目标并不明显,因为你的代码示例循环遍历一个表然后在你的循环中,你一遍又一遍地执行相同的语句,但你总是更新确切的相同的记录?
如果要使用来自另一个表的信息更新表中的记录,您可能需要查看UPDATE语句以及JOIN子句,如here所述。
答案 2 :(得分:2)
就像Frederiks的回答一样,你现在要做的就是循环一个表并一遍又一遍地执行相同的Query。
即使您设法让代码正常工作,它也会非常慢(因为您有大约5600行需要更新)。
所以我的建议是你创建一个包含新值的新表(所以你想要在循环之后得到的那个)。然后只需运行一个更新命令,使用新表中的值更新旧表。
此选项可能需要几秒钟才能完成,因此速度更快! :)
您需要的查询应如下所示:
protected void onPostExecute(Void aVoid) {
super.onPostExecute(aVoid);
display.setText("TEST");
修改强>
另外/更新我的回答,您可以更准确地更新表格:
UPDATE old_table
INNER JOIN new_table
USING (column) --> // if you want to update a specific column
因此,在上面的代码中,您使用UPDATE old_table
INNER JOIN new_table ON old_table.value_id = new_table.value_id // Use this to set your columns with unique values's
SET old_table.value = new_table.value // For the column with the value's you want to update
中的值更新了old_table
。在此示例中,您只从一列(您想要的)更新值。
您可以展开查询以获得不同的结果。
答案 3 :(得分:0)
您可以通过计算行数然后更新记录来尝试此更改。
MySqlCommand cmd = new MySqlCommand("SELECT count(*) FROM catalog_product_entity_decimal", Database.stockConn);
try
{
var reader = cmd .ExecuteReader();
if(reader.Read()){
var totalRows=reader.GetInt32(0);
Console.WriteLine("[Price] Updating Prices...");
while(totalRows-->0){
MySqlCommand command = new MySqlCommand("UPDATE catalog_product_entity_decimal SET value= 1112 WHERE value_id= 4063", Database.stockConn);
command.ExecuteNonQuery();
}
Console.WriteLine("[Price] Prices Have Been Updated!");
}
}
catch
{
Console.WriteLine("Updating Failed!");
}
finally
{
if (Database.stockConn != null)
{
Database.stockConn.Close();
}
}