我正在使用sqlite客户端用于我的数据库的Windows Phone。我在此代码中遇到了有关文本格式的问题:
cmd.CommandText = @" Insert into Restaurants (address,description,id,latitude,longitude,name,opening_hours,phone,sandwich,price,updated_at,website,score,rating_count,thumbnail_url) values ('" + r.address + "','" + r.description + "',"+r.id +","+r.latitude+","+r.longitude+",'"+r.name+"','"+r.opening_hours+"','"+r.phone+"','"+r.sandwich+"','"+r.price+"','"+r.updated_at+"','"+r.website+"',"+r.score+","+r.rating_count+",'"+r.thumbnail_url+"')";
cmd.ExecuteScalar();
问题是文本字段可能类似于"xyz it's abc"
,因此'
会破坏我的更新命令。如何保留'
并让我的代码运行?
答案 0 :(得分:4)
使用Parameter
代替硬编码字符串(查询)。
cmd.CommandText = @"Insert into Restaurants
(address,description,id,latitude,longitude,name,opening_hours,
phone,sandwich,price,updated_at,website,score,rating_count,thumbnail_url)
values
(@address,@description,@id,@latitude,@longitude,@name,@opening_hours,
@phone,@sandwich,@price,@updated_at,@website,@score,
@rating_count,@thumbnail_url)";
答案 1 :(得分:4)
使用parameters而不是使用(更多)开放攻击的逐字查询字符串,而不是:
cmd.Parameters.Add("@Param0", SqlDbType.VarChar, 80).Value = "value";
答案 2 :(得分:1)
考虑使用存储过程或参数化查询而不是直接SQL。这将使您的代码更容易受到问题的影响。
答案 3 :(得分:0)
您可以通过执行以下操作来逃避角色:
cmd.CommandText = cmd.CommandText.Replace("'", "''");
但以您的方式构建查询可能会导致一些严重的安全风险。查看the following article,其中介绍了如何更改动态sql以使用sql参数: