如何在运行时解析SQL Server的文件路径

时间:2011-07-06 03:50:23

标签: c# sql tsql sql-server-2008

我希望在SQL Server查询中包含一个文件路径,该查询是从C#执行的。文件路径是从textBox获得的,而textBox又是由打开的文件对话框提供的。 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";

当这个字符串被解析回屏幕时,文件路径字符串看起来应该是:'J:\ CCCDataVic \ RMH \ PE1006Data \ DHCC.xls'。

问题是这样的:如何使用文字“\”(单反斜杠)在C#中包含一个包含路径的字符串(如上所述)而不解析查询“\”(双反斜杠) )?

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

3 个答案:

答案 0 :(得分: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);

答案 1 :(得分: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”。

答案 2 :(得分: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(@"\\", @"\"));