Хорошо, у меня есть база данных в формате DbaseIV, которая имеет данные в кодовой странице IBM-850, которые мне нужно импортировать в SQL Server 2008. Я использую сценарий asp для импорта данных, недавно я обнаружил проблемы с хранением специальных символов в строки.
В настоящее время это поля varchar ... в ответе веб-страницы все хорошо, но когда я пытаюсь просмотреть данные в базе данных, эти специальные символы заменяются или интерпретируются другим способом.
Я использую параметризованные значения в запросе SQL для хранения данных, которые мне нужны для преобразования моих данных из кодовой страницы 850 (IBM-850) в 1252 (Windows-1252) или 65001 (UTF-8).
Пример данных
104 31 Yaxcabß NULL
и это должно быть
104 31 Yaxcabá NULL
Источник
это источник asp
function ImportarEntidadfed(oFileName,oDBFConn)
Dim sSQL, RSImport, oSysConn, aIData, cont
dim keys(1), bNewData, iUpdate(1), iInsert(1), itmp
Dim oCmd
dim afile
dim sResult
sSQL = "SELECT entidad,nom_ent,mun,nom_mun,loc,nom_loc,longitud,latitud FROM " & oFileName & " ORDER BY entidad,mun,loc;"
Set oRs = oDBFConn.execute(sSQL)
Set oSysConn = Server.CreateObject("ADODB.Connection")
oSysConn.ConnectionString=strcon
aIData= oRs.GetRows()
keys(0)=""
keys(1)=""
iUpdate(0)=0
iInsert(0)=0
iUpdate(1)=0
iInsert(1)=0
For cont = 0 to Ubound(aIData,2)
if keys(0) <> aIData(0,cont) And aIData(0,cont) <> "00" Then 'Entidad federativa
sResult = aIData(1,cont)
oSysConn.open
sSQL = "SELECT * FROM yyyyyy WHERE cve_entfed= ? ;"
'-------------------------------------------------------------------
Set oCmd = Server.CreateObject("ADODB.Command")
oCmd.CommandText = sSQL
set oCmd.ActiveConnection= oSysConn
Set oPar = oCmd.CreateParameter("cve_entfed",129,1,2,aIData(0,cont)) ' Char(2)
oCmd.Parameters.Append(oPar)
'-------------------------------------------------------------------
Set oRs=oCmd.Execute()
'Set oRs=oSysConn.execute(sSQL)
bNewData = oRs.EOF
'oSysConn.Close
if bNewData Then
sSQL = "INSERT INTO yyyyyy (descripcion,cve_entfed) VALUES ( ? , ? );"
Else
sSQL = "UPDATE yyyyyy SET descripcion= ? WHERE cve_entfed= ? ;"
End if
'-------------------------------------------------------------------
Set oCmd = Server.CreateObject("ADODB.Command")
oCmd.CommandText = sSQL
set oCmd.ActiveConnection= oSysConn
Set oPar = oCmd.CreateParameter("descripcion",200,1,255,aIData(1,cont)) 'StringSane(aIData(1,cont)) varchar(max)
oCmd.Parameters.Append(oPar)
Set oPar = oCmd.CreateParameter("cve_entfed",129,1,2,aIData(0,cont)) ' Char(2)
oCmd.Parameters.Append(oPar)
'-------------------------------------------------------------------
'oSysConn.open
'call oSysConn.execute(sSQL,itmp)
Set oRs=oCmd.Execute(itmp)
oSysConn.Close
if bNewData Then
sResult = sResult & " [INS] "
else
sResult = sResult & " [ACT] "
End if
keys(0) = aIData(0,cont)
end if
Next
Set oSysConn = nothing
ImportarEntidadfed = sResult & " (Municipios " & Cstr(iUpdate(0)) & "[ACT] " & Cstr(iInsert(0)) & "[INS]) (Localidades " & Cstr(iUpdate(1)) & "[ACT] " & CStr(iInsert(1)) & "[INS])"
end function
sub Import()
Dim oDBFConn
Dim oDir, oFs, oFiles, oFile
Dim sResult
Set oDBFConn = Server.CreateObject ("ADODB.Connection")
Set oFS = Server.CreateObject("Scripting.FileSystemObject")
Set oDir = oFs.GetFolder(Server.MapPath(".\import\") & "\")
'response.write(Server.MapPath(".\import\"))
sResult = ""
Set oFiles = oDir.Files
oDBFConn.open sDBFConn
For Each oFile in oFiles
aFile=Split(oFile.ShortName,".",-1,1)
if Ubound(aFile) = 1 Then
if Ucase(aFile(1)) = "DBF" Then
sResult = sResult & oFile.name & ":" & ImportarEntidadfed(Cstr(oFile.ShortName),oDBFConn) & "<br/>"
end if
end if
Next
oDBFConn.Close
response.write(sResult)
Set oDBFConn = nothing
Set oFS = nothing
Set oDir = nothing
End sub
Call Import()
Возможное решение
Подумав некоторое время об этой проблеме, я вспомнил, что на самом сервере SQL есть опция для преобразования кодовой страницы COLLATE
, и я обнаружил, что, возможно, сопоставление соответствует моим потребностям SQL_1Xcompat_CP850_CI_AS
, но я не знаю, как его использовать во вставке / обновлении, и если будет работать хотя бы.