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

本文关键字:Server 文件 路径 SQL 运行时 | 更新日期: 2023-09-27 18:01:10

我希望在从C#执行的SQL Server查询中包含一个文件路径。文件路径是从文本框中获得的,而文本框又是由打开的文件对话框提供的。SQL服务器查询包含在以下字符串中:

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''PE106Data''DHCC.xls"。

问题是:如何在C#中使用文本"''"(单反斜杠(在SQL查询中包含包含路径的字符串(如上所述(,而不解析查询"''"?

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

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

试试这个

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);

如果我正确理解了原始帖子,您可能会因为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"的形式存储在计算机中。

尝试一下:

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(@"''", @"'"));