在SQLite中更新列中的值

时间:2016-02-16 10:35:25

标签: c# sqlite

我想将column2传递给函数并使用function的输出更新column3。我已经使用func函数来计算输出。当我运行该程序 它只取最后一个值作为输入并输出所有具有相同值的列。我做错了什么?

sqlite1 = new SQLiteConnection("DataSource = D:/datab.db;version=3");
sqlite1.Open();
string query1 = "select * from ramrotable";
SQLiteCommand cmd = new SQLiteCommand(query1, sqlite1);
SQLiteDataReader reader = cmd.ExecuteReader();
while (reader.Read())
{
    Console.WriteLine("Age::" + reader["age"]);
    //int data = Convert.ToInt16(reader["age"]);
    string tempquery = string.Format("UPDATE ramrotable SET num = 
                       func({0})",reader["age"]);
    cmd = new SQLiteCommand(tempquery, sqlite1);
    cmd.ExecuteNonQuery();
}

string query4 = "select * from ramrotable";
cmd = new SQLiteCommand(query4, sqlite1);
reader = cmd.ExecuteReader();

while (reader.Read())
{
    Console.WriteLine("Name: " + reader["name"] + " Age: " +  
                       reader["age"] + " Num: " + reader["num"]);          
}

2 个答案:

答案 0 :(得分:1)

您需要使用WHERE子句告诉SQLite要更新哪条记录。否则所有记录都会受到影响。请确保在WHERE子句中使用列(或列的组合),唯一地标识记录!

理想情况下,每条记录都会有一个包含唯一值的ID列,并且是主键。

我从评论中了解到,您实际上想要更新num列的值,具体取决于同一记录的age中的值 ,对于表中的所有记录。

要做到这一点,您既不需要获取所有记录也不需要循环。您需要做的就是调用以下语句:

UPDATE ramrotable SET num = func(age)

这会获取age列的值,将其传递给func,并将结果设置为表格中每条记录的num的新值< / em>的

因此,您上面写的所有内容都可以缩短为

sqlite1 = new SQLiteConnection("DataSource = D:/datab.db;version=3");
sqlite1.Open();

cmd = new SQLiteCommand("UPDATE ramrotable SET num =  func(age)", sqlite1);
cmd.ExecuteNonQuery();

答案 1 :(得分:0)

使用时

string tempquery = string.Format("UPDATE ramrotable SET num = 
                   func({0})",reader["age"]);

您正在使用当前的func(年龄)值更新每一行。

要使用精确值更新每一行,您应该在while循环之外使用单个命令:

string updatequery = "UPDATE ramrotable SET num = func(age)";
cmd = new SQLiteCommand(updatequery, sqlite1);
cmd.ExecuteNonQuery();