Salesforce Dataloader 命令行连接数据库以及导入导出数据常见注意事项

时间:2022-02-08 06:40:40
Salesforce Dataloader 导入数据几条注意事项
2011-06-24 23:44

一. 导入数据几条注意事项

1. Dataload的时候经常会遇到Trigger提示Too Many SOQL Error. 主要因为Trigger将SOQL放到了循环里了。要想改正这个错误需要修改Trigger,但是在不能修改Trigger的情况下可以将Dataloader的每次提交行数修改为10行甚至1行,这样将不会触发循环超出限制。

2. Dataload的时候经常会遇到Trigger报错200条记录都报错,但是可能只是其中1条错误,由于Trigger是200条一个Batch,所以一个错误会导致200条错误。

3. 在进行有主键外键的系统迁移到SFDC系统的时候可以使用External Id 进行Upsert 操作。这样Lookup field可以不是必须使用ID进行更新,可以使用External ID进行更新了。同样适用于Sandbox到Production的数据转移。

4. Company Profile 时区需要设置成GMT,否则Createdate和LastmodifiedDate会自己加减。

5. Dataloader时区最好需要设置成GMT。不然当Dataloader时区和Salesforce时区相差12小时的时候,系统会自动减去一天。

6. Opportunity Object and Contact Role是Master, Detail 关系,并且Salesforce认为两个Object同属于Opportunity,所以Insert Contact Role的时候,Opportunity的LastModifiedDate会同时更新成当前日期。目前没办法解决。

7. Opportunity Stage name 会自动记录到StageHistory里,而且当History改变的时候,系统认为这个Opportunity也改变了,所有LastmodifiedDate也会被改变,所有在用CSV文件导入到Salesforce的时候,要注意StageName列的位置要排在LastModifiedDate前面。

. Data Loader 配置命令行运行以及连接SQLServer 数据库 

1.encrypt.bat  -g aaaa > key.txt. 生成key file.

2. encrypt.bat -e<password+security token> "<filepath>\key.txt". 生产加密密码.

3. 生成或者Copy一个Map文件. 

4. 配置process-conf.xml

5. 配置database-conf.xml,如果数据要和DB交互的话,Dataloader可以通过JDBC建立连接

6. 运行命令 process.bat"C:\Program Files\salesforce.com\Data Loader\bin" insertAccount

process-conf.xml:例子

<!DOCTYPE beans PUBLIC"-//SPRING//DTD BEAN//EN""http://www.springframework.org/dtd/spring-beans.dtd">
<beans>
    <bean id="insertAccount"
         class="com.salesforce.dataloader.process.ProcessRunner"
          singleton="false">
        <description>insertAccount job gets accountinfo from salesforce and updates or inserts info intodatabase."</description>
        <property name="name"value="insertAccount"/>
        <property name="configOverrideMap">
            <map>
                <entrykey="sfdc.debugMessages" value="false"/>
                <entrykey="sfdc.debugMessagesFile"value="C:\dataloader\samples\status\sfdcSoapTrace.log"/>
                <entrykey="sfdc.endpoint" value="https://login.salesforce.com"/>
                <entrykey="sfdc.username" value="xxxxxx@xxxx.xx"/>
                <entrykey="sfdc.password"value="............................................................................"/>
                <entrykey="process.encryptionKeyFile" value="C:\ProgramFiles\salesforce.com\Data Loader\bin\key.txt"/>               
                <entrykey="sfdc.timeoutSecs" value="600"/>
                <entrykey="sfdc.loadBatchSize" value="200"/>
                <entrykey="sfdc.entity" value="Account"/>
                <entrykey="sfdc.extractionRequestSize" value="500"/>
                <entrykey="sfdc.extractionSOQL" value="SELECT ID, NAME, CREATEDDATEFROM ACCOUNT"/>
                <entrykey="process.operation" value="extract"/>
                <entrykey="dataAccess.type" value="databaseWrite"/>
                <entrykey="dataAccess.name" value="insertAccount"/>
            </map>
        </property>
    </bean>    
</beans>

database-conf.xml: SQLServer2005.

<!DOCTYPE beans PUBLIC"-//SPRING//DTD BEAN//EN""http://www.springframework.org/dtd/spring-beans.dtd">
<beans>
<bean id="dbDataSource"class="org.apache.commons.dbcp.BasicDataSource"destroy-method="close">
    <property name="driverClassName"value="com.microsoft.sqlserver.jdbc.SQLServerDriver"/>
    <!--property name="url"value="jdbc:sqlserver://localhost:1433;DatabaseName=Test1"/-->
    <property name="url"value="jdbc:sqlserver://localhost:1433;DatabaseName=Test1;user=sa;password=xxxxxx"/>
    <property name="username" value="sa"/>
    <property name="password"value="yg010101"/>
</bean>
<bean id="insertAccount"
     class="com.salesforce.dataloader.dao.database.DatabaseConfig"
      singleton="true">
    <property name="sqlConfig"ref="insertAccountSql"/>
    <property name="dataSource"ref="dbDataSource"/>
</bean>
<bean id="insertAccountSql"
     class="com.salesforce.dataloader.dao.database.SqlConfig"singleton="true">
    <property name="sqlString">
        <value>
            INSERT INTO dbo.Accounts(ID,  NAME  ,CREATEDDATE)
                            VALUES (@ID@, @NAME@,@CREATEDDATE@)
        </value>
    </property>
    <property name="sqlParams">
        <map>
            <entry key="ID"   value="java.lang.String"/>
            <entry key="NAME" value="java.lang.String"/>
            <entry key="CREATEDDATE" value="java.lang.datetime"/>
        </map>
    </property>
</bean>
</beans>