C# 如何在运行时解析SQL Server的文件路径
我希望在从C#执行的SQL Server查询中包含一个文件路径。文件路径是从文本框中获取的,而文本框又由打开的文件对话框提供。SQL server查询包含在以下字符串中:C# 如何在运行时解析SQL Server的文件路径,c#,sql,tsql,sql-server-2008,C#,Sql,Tsql,Sql Server 2008,我希望在从C#执行的SQL Server查询中包含一个文件路径。文件路径是从文本框中获取的,而文本框又由打开的文件对话框提供。SQL server查询包含在以下字符串中: string strSqlAcctSelect = String.Format("SELECT Code AS dhAccountType, Name as dhAcctName
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,其中包含SQL不喜欢的双反斜杠。试试这个
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);
试试这个
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);
尝试一下:
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(@"\\", @"\"));
尝试一下:
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(@"\\", @"\"));
如果我正确理解了原始帖子,您可能会因为VisualStudio调试器而感到困惑。 例如,考虑这个C代码: 这将显示:字符串a\b的长度为3 在Visual Studio中,调试器会将str的内容显示为:
"a\\b"
,但它在执行时(采用非常简化的视图)以“a\b”的形式存储在计算机中 如果我正确理解了原始帖子,您可能会因为Visual Studio调试器而感到困惑。 例如,考虑这个C代码: 这将显示:字符串a\b的长度为3 在Visual Studio中,调试器会将str的内容显示为:
"a\\b"
,但它在执行时(采用非常简化的视图)以“a\b”的形式存储在计算机中 定义“哪个SQL不喜欢”。SQL确实喜欢双反斜杠;-))这不是一个解决方案,但您可以改为使用“/”。否则,我会尝试将其视为逐字字符串文字:
This.textBoxAcctPath.Text=@“J:\CCCDataVic\RMH\PE1006Data\DHCC.xls”当然,这只在预先指定字符串值时才起作用。“SQL不喜欢”=SQL需要用单反斜杠而不是双反斜杠分隔的文件路径@道伯。使用逐字逐句字符串不起作用,因为在运行时,所有反斜杠(无论是否在相关字符串前面加@前缀)都存储为“\\”@Dr.Camus:那字符串呢。替换(“\\\\”,“\\”)。不是很优雅,但可能有用。我认为你无法说服C#去做你想做的事情。定义“哪个SQL不喜欢”。SQL确实喜欢双反斜杠;-))这不是一个解决方案,但您可以改为使用“/”。否则,我会尝试将其视为逐字字符串文字:This.textBoxAcctPath.Text=@“J:\CCCDataVic\RMH\PE1006Data\DHCC.xls”当然,这只在预先指定字符串值时才起作用。“SQL不喜欢”=SQL需要用单反斜杠而不是双反斜杠分隔的文件路径@道伯。使用逐字逐句字符串不起作用,因为在运行时,所有反斜杠(无论是否在相关字符串前面加@前缀)都存储为“\\”@Dr.Camus:那字符串呢。替换(“\\\\”,“\\”)。不是很优雅,但可能有用。我认为你无法说服C#去做你想做的事,否则的话,这是行不通的,因为我已经试过了。非常感谢您的帮助。这不起作用,您必须执行以下操作。字符串路径=this.textBoxAcctPath.Text.Replace(@“\\\”,@“\”);然后传递这个参数'path',这不起作用,因为我已经尝试过了。非常感谢您的帮助。这不起作用,您必须执行以下操作。字符串路径=this.textBoxAcctPath.Text.Replace(@“\\\”,@“\”);然后传递这个参数'path',这不是问题所在。谢谢你的帮助,这不是问题所在。谢谢你的帮助。这两种方法在一定程度上都有效。他们去掉了双反斜杠。但是,该类将它们替换为正向斜杠。为了解决这个问题,我尝试了“stringpath=newURI(this.textBoxCCTabPath.Text).LocalPath”;这再次产生了dreded双反斜杠。还有其他想法吗?这是一条路。SQL接受“/”作为路径分隔符。非常感谢你的帮助。这两个都在一定程度上起作用。他们去掉了双反斜杠。但是,该类将它们替换为正向斜杠。为了解决这个问题,我尝试了“stringpath=newURI(this.textBoxCCTabPath.Text).LocalPath”;这再次产生了dreded双反斜杠。还有其他想法吗?这是一条路。SQL接受“/”作为路径分隔符。非常感谢你的帮助。