2011-07-06 9 views
0

C#から実行されるSQL Serverクエリにファイルパスを含める場合。ファイルパスは、開いているファイルダイアログによって提供されたtextBoxから取得されます。 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"; 

この文字列はもちろんの画面に戻って解析されると、ファイルパス文字列は、それが必要となります。「J :\ 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(@ "\\\"、@ "\")); このパラメータを 'path'に設定してください – Lamps

2

元の投稿を正しく理解していれば、Visual Studio Debuggerのために混乱している可能性があります。例: このC#のコードを考えてみます。これは、表示さ

string str = "a\\b"; 

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

:文字列\ bは、Visual Studioで長さ3

があり、デバッガはとSTRの内容を表示します:

"a\\b" 

、それ(非常に簡略化された)実行時に「a \ b」としてコンピュータに格納される。

+0

これは問題ではありません。ご協力いただきありがとうございます。 – MoonKnight

関連する問題