这是我的代码:
[WebMethod]
public static void SendChatMessage(string msg, int ToClient)
{
if (msg != null && ToClient != 0)
{
if (msg.Contains(":-)")) msg.Replace(":-)", "<img src='Styles/emojie/smile.png' /> ");
else if (msg.Contains(":-(")) msg.Replace(":-(", "<img src='Styles/emojie/sad.png' /> ");
else if (msg.Contains(":'-(")) msg.Replace(":'-(", "<img src='Styles/emojie/cry.png' /> ");
else if (msg.Contains(":-$")) msg.Replace(":-$", "<img src='Styles/emojie/shy.png' /> ");
int FromClientID = Convert.ToInt32(HttpContext.Current.Session["ClientID"]);
string query = "insert into chat (FROM_CLIENT,TO_CLIENT,CHAT_MSG) values (" + FromClientID + "," + ToClient + ",'" + msg + "')";
new SQLHelper(SQLHelper.ConnectionStrings.WebSiteConnectionString).Insert(query);
}
}
将msg发送到数据库,因为它不是替换我做错了什么?
答案 0 :(得分:9)
您假设Replace
修改了现有的*字符串。它没有。它会返回一个 new 字符串,并进行修改。它必须,因为字符串在.NET中是不可变的。您可能期望更改字符串(Substring
,ToUpper
等)的所有字符串操作实际上会返回一个新字符串。
所以你所有的电话都是这样的:
msg.Replace(...);
应该是:
msg = msg.Replace(...);
您应该也开始使用参数化SQL,而不是将所有值直接放入SQL查询中。这将使您的代码更具可读性,避免SQL injection attacks,并删除大量数据类型转换问题。
此外,我会在每个if
语句中使用大括号,并将语句放在不同的行上:
if (msg.Contains(":-)"))
{
msg = msg.Replace(":-)", "<img src='Styles/emojie/smile.png' /> ");
}
哦,目前由于msg
语句,您只会在if / else
中创建一个一个替换项。如果您已经替换:-(
,是否真的不想替换:-)
?真的没有必要先进行Contains
检查......我只是无条件地将呼叫链接在一起:
msg = msg.Replace(":-)", "<img src='Styles/emojie/smile.png'/> ")
.Replace(":-(", "<img src='Styles/emojie/sad.png'/> ")
.Replace(":'-(", "<img src='Styles/emojie/cry.png'/> ")
.Replace(":-$", "<img src='Styles/emojie/shy.png'/> ");
更简单。
答案 1 :(得分:1)
调用string.Replace
实际上并没有更改字符串,因此您需要重新分配它:
msg = msg.Replace( ... );