0

我有一个简单的 Sqlite 表,其中包含电话号码和计数器的 2 列。我想根据还包含电话号码和计数器的 .csv 文件更新表格。如果数据库中存在该数字,则应通过现有计数器的总和 + 文件中的计数器进行更新。如果它不存在,则应使用文件中的值插入一条新记录。我剩下的一个问题是电话号码的第一个位置为零。当我填充数据库时,零被保留,(我可以手动选择并找到一个现有的数字,如 09999)当我从文件中获取值时,零被保留,但是当我尝试插入/更新时,我的 Ruby 代码中发生了一些事情插入不带前导零的新记录,因此 0999 在数据库中变为 999。没有前导零的数字被正确处理。

rowArray=thisFile[k].split(';')
number = rowArray[0]
couplings = rowArray[1]


updString="INSERT OR REPLACE INTO Caller (Telno,count) VALUES (#{number},COALESCE((SELECT count + #{couplings} FROM Caller WHERE Telno=#{number}),#    {couplings}))"

db.execute(updString)

知道我在这里做错了什么吗?最简单的解决方案是去掉前导零,但我更愿意做对。提前谢谢了。

4

1 回答 1

0

您需要在调用中使用占位符prepare并将调用中的实际值传递给execute. 像这样

insert = db.prepare(<<__SQL__)
INSERT OR REPLACE INTO Caller (Telno, count)
VALUES (:number, COALESCE((SELECT count + :couplings FROM Caller WHERE Telno = :number), :couplings))
__SQL__

insert.execute(number: number, couplings: couplings)

(注意:number:couplings在 SQL 语句中被命名为占位符。它们可以是任何东西,但我选择它们以匹配要绑定的变量的相应名称。)

问题是,使用简单的插值,你最终会得到一个字符串

INSERT OR REPLACE INTO Caller (Telno, count) VALUES (0999, ...

并且0999看起来是一个数字而不是一个字符串。如果您将字符串传递给,execute那么变量将与正确的类型绑定。

于 2013-07-29T14:46:24.147 回答