2011-07-06 31 views
0

我希望在从C#执行的SQL Server查询中包含文件路径。文件路径是从文本框获得的,而文本框又由打开的文件对话框提供。 SQL Server查询包含在以下字符串:如何在运行时解析SQL Server的文件路径

string strSqlAcctSelect = String.Format("SELECT Code AS dhAccountType, 
                Name as dhAcctName 
              INTO {0} " + "FROM OPENROWSET('Microsoft.Ace.OLEDB.12.0', 'Excel 8.0; DATABASE = 
    {1}', 'SELECT * FROM " + "[Sheet1$]')", strAcctTabName, this.textBoxAcctPath.Text); 

凡在运行时:

this.textBoxAcctPath.Text = "J:\\CCCDataVic\\RMH\\PE1006Data\\DHCC.xls"; 

当此字符串被解析回当然屏幕的文件路径字符串看起来理所应当:“Ĵ :\ CCCDataVic \ RMH \ PE1006Data \ DHCC.xls'。如何在不解析查询“\”的情况下使用文字“\”(单斜杠)在C#中的SQL查询中包含一个路径的字符串(如上所示)削减)?

不管你做什么,字符串都被解析为包含SQL不喜欢的双反斜杠的SQL。

+0

定义“哪个SQL不喜欢”。 SQL确实像双反斜杠;-)))) – zerkms

+1

这不是一个解决方案,但可以使用“/”来代替。 – dawebber

+2

否则,我会尝试把它当作逐字字符串文字: 'this.textBoxAcctPath.Text = @“J:\ CCCDataVic \ RMH \ PE1006Data \ DHCC.xls”;' 这当然只适用于字符串值是预先指定的。 – dawebber

回答

2

试试这个

string path = new Uri(this.textBoxAcctPath.Text).AbsolutePath; 

但是,如果你提供无效的路径,这将引发异常,所以我建议你使用下面的代码

string validPath = string.Empty; 

if (Uri.TryCreate(this.textBoxAcctPath.Text, UriKind.Absolute, out uri)) 
{ 
    validPath = uri.AbsolutePath;    
} 
else 
{ 
    throw new ArgumentException("Invalid Path"); 
} 


string strSqlAcctSelect = String.Format("SELECT Code AS dhAccountType, 
                Name as dhAcctName 
              INTO {0} " + "FROM OPENROWSET('Microsoft.Ace.OLEDB.12.0', 'Excel 8.0; DATABASE = 
    {1}', 'SELECT * FROM " + "[Sheet1$]')", strAcctTabName, validPath); 
+0

这些都在一定程度上工作。他们删除双反斜杠。然而,这个类用正斜杠代替它们。为了解决这个问题,我尝试了“string path = new Uri(this.textBoxCCTabPath.Text).LocalPath;”这又产生了双重的双反斜杠。任何其他想法? – MoonKnight

+0

这是要走的路。 SQL接受“/”作为路径分隔符。非常感谢您的帮助。 – MoonKnight

1

试试这个:

string strSqlAcctSelect = String.Format("SELECT Code AS dhAccountType, 
                                                     Name as dhAcctName 
                                           INTO {0} " + "FROM OPENROWSET('Microsoft.Ace.OLEDB.12.0', 'Excel 8.0; DATABASE = 
    {1}', 'SELECT * FROM " + "[Sheet1$]')", strAcctTabName, this.textBoxAcctPath.Text.Replace(@"\\", @"\")); 
+0

这不起作用,因为我试过这个。非常感谢您的帮助。 – MoonKnight

+0

这不起作用,你必须做下面的事情。 string path = this.textBoxAcctPath.Text.Replace(@“\\\”,@“\”)); 然后通过此参数'路径' – Lamps

2

如果我已经正确理解原始文章,那么您可能会因为Visual Studio调试器而感到困惑。 例如考虑此C#代码:

string str = "a\\b"; 

    MessageBox.Show(string.Format("string {0} has length {1}", str, str.Length)); 

这显示:字符串A \ B具有长度3

在Visual Studio中,调试器将显示str的内容为:

"a\\b" 

,但它在执行时存储在计算机中(以非常简化的视图)作为“a \ b”。

+0

这不是问题。谢谢你的帮助。 – MoonKnight