- PR -

string及びstringBuilderのreplaceについて

投稿者投稿内容
Liquid_Force
大ベテラン
会議室デビュー日: 2003/08/28
投稿数: 102
投稿日時: 2006-01-23 11:37
こんにちわ、またしてもよくわからない動作があるのでどなたかご教示下さい。

Win2000
VS.NET2003
VB.NET

WEBフォームを使用しています。
SQLをコンスタントで記述し、変数をロジック内で置換する為に以下のコードを
書いているのですが、置換されずにそのまま処理されてしまいます。

【コード】
private const SQL = "SELECT * FROM table WHERE aaa = '@aaa'"

Dim sbSQL As New StringBuilder(SQL,50)

sbSQL.Replace("@aaa",Cstr(Session("aaa")))

SQL文をログ出力してみると、置換されていません。
原因がわからないのでご存知の方よろしくお願いします。
じゃんぬねっと
ぬし
会議室デビュー日: 2004/12/22
投稿数: 7811
お住まい・勤務地: 愛知県名古屋市
投稿日時: 2006-01-23 11:43
以下のようなコードでテストしました。

コード:

    Private Const SQL As String = "SELECT * FROM table WHERE aaa = '@aaa'"

    Private Sub Button1_Click(...) Handles Button1.Click
        Dim sbSQL As New System.Text.StringBuilder(SQL, 50) 

        sbSQL.Replace("@aaa", "MakiMakiLove") 

        MessageBox.Show(sbSQL.ToString())
    End Sub


問題なく sbSQL 自身のインスタンスは置換できています。
原因は別のところ (SQL を渡すところ) か、Session("aaa") にあると思います。

_________________
C# と VB.NET の入門サイト
じゃんぬねっと日誌
Liquid_Force
大ベテラン
会議室デビュー日: 2003/08/28
投稿数: 102
投稿日時: 2006-01-23 11:57
早々の回答ならびに動作確認までありがとうございます!

そうですよねぇ。なぜにうまく動作しないのか・・・
もしかして値渡しと参照渡しが関係しているのでしょうか?
コードの詳細は以下の通りです。

【コード】
Private Const SQL As String = "SELECT * FROM table WHERE aaa = '@aaa'"

TextBox1.Text = recordCount(SQL)

Private function recordCount(ByVal sql As String) as int32
Dim sbSQL as New StringBuilder(sql,50)

@sql.Relpace("@aaa", "MakiMakiLove")
または
 AsbSQL.Relpace("@aaa", "MakiMakiLove")

End Private

どちらもうまく動作しません。やはり別の原因が理由でしょうか。
じゃんぬねっと
ぬし
会議室デビュー日: 2004/12/22
投稿数: 7811
お住まい・勤務地: 愛知県名古屋市
投稿日時: 2006-01-23 12:17
引用:

Liquid_Forceさんの書き込み (2006-01-23 11:57) より:

TextBox1.Text = recordCount(SQL)


関係ないところですが、TextBox の Text プロパティは String 型です。
TextBox1.Text = recordCount(SQL).ToString() とすべきです。

引用:

(1) sql.Relpace("@aaa", "MakiMakiLove")


これでは、当然無理でしょう。
 Dim stDest As String = sql.Replace("@aaa", "MakiMakiLove")
のように Replece が返す値を受け取られないと。

引用:

 (2) sbSQL.Relpace("@aaa", "MakiMakiLove")


StringBuilder であるならば、こちらは ToString() すれば期待通りの結果が取得できるでしょう。
こちらのコードでもダメですか?
Dim sb As System.Text.StringBuilder = sbSQL.Replace("@aaa", "MakiMakiLove")

引用:

どちらもうまく動作しません。やはり別の原因が理由でしょうか。


式ウォッチなどで見て検証すべきです。
私は説明の都合上、MessageBox.Show を書きました。

_________________
C# と VB.NET の入門サイト
じゃんぬねっと日誌
じゃんぬねっと
ぬし
会議室デビュー日: 2004/12/22
投稿数: 7811
お住まい・勤務地: 愛知県名古屋市
投稿日時: 2006-01-23 12:24
コード:

    Private Const SQL As String = "SELECT * FROM table WHERE aaa = '@aaa'"  

    Private Function recordCount(ByVal sql As String) As System.Int32
        Dim sbSQL As New System.Text.StringBuilder(sql, 50)

        sql = sql.Replace("@aaa", "MakiMakiLove")
       sbSQL.Replace("@aaa", "MakiMakiLove") 

        Console.WriteLine(sql)
        Console.WriteLine(sbSQL)
    End Function

    Private Sub Button1_Click(ByVal sender As Object, ByVal e As System.EventArgs) Handles Button1.Click
        TextBox1.Text = recordCount(SQL).ToString()
    End Sub


期待通りの動作を確認しました。
(recordCount メソッドの戻り値は意味なしですが)

_________________
C# と VB.NET の入門サイト
じゃんぬねっと日誌
えんぞ@?
ぬし
会議室デビュー日: 2004/07/06
投稿数: 271
お住まい・勤務地: はまっこ
投稿日時: 2006-01-23 13:30
MSDNクラスライブラリ - StringBuilder.Replace メソッド (String, String)
http://www.microsoft.com/japan/msdn/library/default.asp?url=/japan/msdn/library/ja/cpref/html/frlrfsystemtextstringbuilderclassreplacetopic2.asp
引用:

戻り値
oldValue のすべてのインスタンスが newValue に置換されたこのインスタンスへの参照。


なちゃ
ぬし
会議室デビュー日: 2003/06/11
投稿数: 872
投稿日時: 2006-01-23 14:16
private const SQL = "SELECT * FROM table WHERE aaa = '@aaa'"

の文字列が変わってなかったんでしょうね。
※わざわざStringBuilderを使っていてこの間違いはある意味珍しいと思う。
Liquid_Force
大ベテラン
会議室デビュー日: 2003/08/28
投稿数: 102
投稿日時: 2006-01-23 16:41
レス遅くなってすみません。(別システムの障害対応してました・・・)

みなさん回答ありがとうございます!
あぁ・・・ぜんぜん理解してませんでした、StringもStringBuilderも。

sql = sql.Replace("@aaa","MakiMakiLove")

で無事に置換できました。
stringBuilderも同様に戻り値を再設定してませんでした。
ありがとうございました。

スキルアップ/キャリアアップ(JOB@IT)