2013-04-04 93 views
2

我正在运行一个F#应用程序以将数据从Access表中提取到链接的SQL Server表。查询结果如下:INSERT INTO语句中的F#OleDb语法错误将数据从访问中提取到链接的SQL Server

INSERT INTO dbo_TempTerm (UnitID, PolicyTermYear, InsuredName, PolicyNumber, RenewalDate, CovATotal, CovBTotal, CovLTotal, DwellExtn, AllOtherPerilDeductible, MedPay, TotalPremium, HurricaneDeductible, Zone, Subzone, PercentCRC, PercentCRD, YearBuilt, RenYrs, PercentCFD, PercentHA, PercentMLD, GRP1, PercentNH, QCLM, RateV, CRI, AgentCode, AgentName, AFOCode, PolicyType, PolicyForm, OC, DateCreated) 
SELECT [UNIT ID], [POLICY TERM YEAR], [INSURED NAME], [POLICY #], [RENEWAL DT], [COV A TOTAL], [COV B TOTAL], [COV L TOTAL], [DWELL EXTN], [ALL/OTHER PERIL DEDUCTIBLE], [MED PAY], [TOT PREMIUM], [HURR DED], ZONE, SUBZONE, [%CRC], [%CRD], [YR BLT], RENYRS, [%CFD], [%HA], [%MLD], GRP1, [%NH], QCLM, [RATE V], CRI, [AGENT CODE], [AGENT NAME], [AFO CODE], [POLICY TYPE], [POLICY FORM], OC, DateCreated 
FROM tblPrior 

查询在Access中解析并正常运行。但是在我的应用程序中,它引发了一个错误:INSERT INTO语句中的语法错误。

这是我的F#,但我认为它不相关。

module Data 

open System.Data 
open System.Data.OleDb 

type Period = Prior | Current 

let Upload (p:Period) db = 
    use conn = new OleDbConnection(@"Provider=Microsoft.ACE.OLEDB.12.0;Data Source=" + db + ";Persist Security Info=False;") 

    let execNonQuery s = 
     let comm = new OleDbCommand(s, conn) in 
     comm.ExecuteNonQuery() |> ignore 

    let (table,proc) = match p with 
         | Prior -> ("tblPrior" ,"InitPriorTable") 
         | Current -> ("tblCurrent","InitCurrentTable") 

    do conn.Open() 

    let u = sprintf "INSERT INTO dbo_TempTerm (UnitID, PolicyTermYear, InsuredName, PolicyNumber, RenewalDate, CovATotal, CovBTotal, CovLTotal, DwellExtn, AllOtherPerilDeductible, MedPay, TotalPremium, HurricaneDeductible, Zone, Subzone, PercentCRC, PercentCRD, YearBuilt, RenYrs, PercentCFD, PercentHA, PercentMLD, GRP1, PercentNH, QCLM, RateV, CRI, AgentCode, AgentName, AFOCode, PolicyType, PolicyForm, OC, DateCreated) SELECT [UNIT ID], [POLICY TERM YEAR], [INSURED NAME], [POLICY #], [RENEWAL DT], [COV A TOTAL], [COV B TOTAL], [COV L TOTAL], [DWELL EXTN], [ALL/OTHER PERIL DEDUCTIBLE], [MED PAY], [TOT PREMIUM], [HURR DED], ZONE, SUBZONE, [%%CRC], [%%CRD], [YR BLT], RENYRS, [%%CFD], [%%HA], [%%MLD], GRP1, [%%NH], QCLM, [RATE V], CRI, [AGENT CODE], [AGENT NAME], [AFO CODE], [POLICY TYPE], [POLICY FORM], OC, DateCreated FROM %s" table 
    // DEBUG. 
    printfn "%s" u 
    // DEBUG. 
    execNonQuery u 
    execNonQuery proc 
+0

您是否试图使用查询从访问中提取数据并直接将其插入SQl服务器? – 2013-04-04 15:58:29

回答

3

ZoneDateCreated都是reserved words。很难预测保留字是什么时候会对SQL语句造成麻烦,但在我看来,OleDb可能不那么宽容,即更有可能因保留字而失败。查看是否包含所有这些名称的出现将允许INSERT成功。

let u = sprintf "INSERT INTO dbo_TempTerm (UnitID, PolicyTermYear, InsuredName, PolicyNumber, RenewalDate, CovATotal, CovBTotal, CovLTotal, DwellExtn, AllOtherPerilDeductible, MedPay, TotalPremium, HurricaneDeductible, [Zone], Subzone, PercentCRC, PercentCRD, YearBuilt, RenYrs, PercentCFD, PercentHA, PercentMLD, GRP1, PercentNH, QCLM, RateV, CRI, AgentCode, AgentName, AFOCode, PolicyType, PolicyForm, OC, [DateCreated]) SELECT [UNIT ID], [POLICY TERM YEAR], [INSURED NAME], [POLICY #], [RENEWAL DT], [COV A TOTAL], [COV B TOTAL], [COV L TOTAL], [DWELL EXTN], [ALL/OTHER PERIL DEDUCTIBLE], [MED PAY], [TOT PREMIUM], [HURR DED], [ZONE], SUBZONE, [%%CRC], [%%CRD], [YR BLT], RENYRS, [%%CFD], [%%HA], [%%MLD], GRP1, [%%NH], QCLM, [RATE V], CRI, [AGENT CODE], [AGENT NAME], [AFO CODE], [POLICY TYPE], [POLICY FORM], OC, [DateCreated] FROM %s" table 
+0

就是这样!非常感谢。下次我看到另一个像这样的无意义错误时,我会检查保留字列表。 – 2013-04-05 14:53:01

+0

不客气,杰夫。在我链接的页面顶部附近,有一个* Database Issue Checker Utility *的链接。您可以下载该实用程序并使用它来检查您的Access数据库。它会警告你关于问题对象名称,以及其他可能产生麻烦的问题。 – HansUp 2013-04-05 15:01:55

相关问题