zengdj

点滴经验,源自实践

博客园 首页 新随笔 联系 订阅 管理
最近在做项目时,碰到一个棘手的问题,问题描述如下:

问题描述一:
在做单元测试的时候,需要为数据库初始化一些测试数据,就手工创建了一个包含大量Insert语句的脚本文件,用来往数据库插入数据,用如下的语句完成插入动作:
    OSQL -S 192.168.1.28 -U sa -P sa -i "c:\test.sql"
命令完成后,数据被成功插入相应表中。打开NUnit运行测试用例,部分测试用例不过,颇费周折后发现,其中的三个特殊字符在被插入到数据库后被转换成了其他字符,这三个字符是三个丹麦字符(øåæ)。所以在做字符串比较时与给定的字符串不等。

问题的是找到了,可原因何在呢。打开脚本文件,拷贝粘贴SQL语句至查询分析器中运行,检查结果无误,看来问题就出在OSQL读取文件时出错。在DOS命令窗口中运行 type c:\test.sql 来查看内容,结果出现预期的情况,三个特殊字符不能被正确读取。用记事本打开文件,然后另存文件,发现文件的编码方式是ANSI编码,试着将文件另存成Unicode编码,再用OSQL执行,结果终于正常。

问题被解决,以为事情可以告一段落,没想到新的问题在第二天又出现了,问题描述如下:

问题描述二:
公司采用SourceOffSite管理项目文档,将test.sql文件上传到SOS服务器后,再下载下来,便出现了新的情况,打开文件一看,傻眼了,文件全变成了乱码,SOS不能识别Unicode文件,将test.sql文件另存成ANSI编码方式,再上传到服务,再下载下来观察,结果正常。

新的问题原因找到了,便有了如下的解决方案:
既然SOS服务不能存储Unicode编码方式文本文件,只能仍然将脚本文件存成ANSI格式,这样便解决了问题二。再运行OSQL命令前,用如下的代码先将文件另存成Unicode编码方式再转交给OSQL工具使用,问题一得以解决。

将文本文件另存成Unicode (C#版)

private void ChangeTextEncoding(string folder)
        
{
            
string file = folder + "\\test.sql";
            
string dataFile = folder + "\\BMS_TestData.sql";
            
if(System.IO.File.Exists(file)) return;
            
using (StreamWriter sw = new StreamWriter(file,true,System.Text.Encoding.Unicode)) 
            
{
                
using (StreamReader sr = new StreamReader(dataFile,System.Text.Encoding.Default)) 
                
{
                    String line;
                    
while ((line = sr.ReadLine()) != null
                    
{
                        sw.WriteLine(line);
                    }

                }

            }

        }

posted on 2005-07-08 14:03  DingJun  阅读(1405)  评论(2)    收藏  举报