2013-06-05 58 views
0

将csv导入MYSQL数据库以更新现有数据时出现问题。导入新数据的工作正常,只是更新错误。通过VBScript的MYSQL更新命令

`CSVSerial = arrServiceList(0) 
CSVAssetTag = arrServiceList(1) 
CSVLocation = arrServiceList(2) 
CSVRoom = arrServiceList(3) 
CSVCheckedOutTo = arrServiceList(4) 

commandText = "Update Inventory Set Room = CSVRoom, Location = CSVLocation, AssetTag = CSVAssetTag, CheckedOutTo = CSVCheckedOutTo where SerialNumber = CSVSerial"` 

我试过做$ CSVSerial,'$ CSVSerial','CSVSerial',他们似乎没有认出它们中的任何一个。如果我做了

Msgbox (CSVSerial & "," & CSVRoom & "," & CSVLocation & "," & CSVAssettag & "," & CSVCheckedOutTo) 

所有的数据在那里都是正确的。我确定这很简单,只是没有很多MySQL的经验。

感谢

回答

1

你的查询只使用文字字符串CSVRoomCSVLocation等,而不是它们的值。 $CSVSerial将不能在VB中工作 - 这是一个PHP的东西(加上一些其他语言)。另外,如果这些是字符串值,则需要用单引号括起来。尝试这样的代替:

commandText = "Update Inventory Set Room = '" & CSVRoom & "', " & _ 
    "Location = '" & CSVLocation & "', " & _ 
    "AssetTag = '" & CSVAssetTag & "', " & _ 
    "CheckedOutTo = '" & CSVCheckedOutTo & "' where SerialNumber = '" & CSVSerial & "'" 

我假设所有的列都是字符串。如果有任何数字,你不需要在他们周围的单引号,但他们再也不应该伤害。


附录:后续问题是如何只有他们空白或空更新列。

要测试的空白或空,你可以使用这样的条件:

Room IS NULL OR Room = '' 

...或者是这样的:

COALESCE(Room, '') = '' 

第二个是短,所以我会去因为命令行变得很长。基本的MySQL命令是这样的:

UPDATE Inventory SET 
    Room = CASE WHEN COALESCE(Room, '') = '' THEN Room ELSE 'new value' END, 
    ... 

所以如果房间''NULL它设置为现有''NULL值。如果不是,则将其设置为新值。

下面是它在VBScript中的外观。这是未经测试的,因为我没有VBScript可用。

commandText = "UPDATE Inventory SET " & _ 
    "Room = CASE WHEN COALESCE(Room, '') = '' THEN Room ELSE '" & CSVRoom & "' END, " & _ 
    "Location = CASE WHEN COALESCE(Location, '') = '' THEN Location ELSE '" & CSVLocation & "' END, " & _ 
    "AssetTag = CASE WHEN COALESCE(AssetTag, '') = '' THEN AssetTag ELSE '" & CSVAssetTag & "' END, " & _ 
    "CheckedOutTo = CASE WHEN COALESCE(CheckedOutTo, '') = '' THEN CheckedOutTo ELSE '" & CSVCheckedOutTo & "' END " & _ 
    "WHERE SerialNumber = '" & CSVSerial & "'" 
+0

谢谢,这工作完美。如果字段为空,那么在commandtext中有没有更新的方法? –

+0

你是指每列?例如,更新'房间',除非它是空白的,更新'位置',除非它是空的,等等。通过“空白”,你的意思是一个零长度的列值,或者你的意思是'NULL'?或者呢? –

+0

是正确的,如果它是空白或为空,我不想覆盖当前的内容。 –