我在PHP中使用了postgreSQL,这很简单:当你进行查询时,你会这样做:
$result = pg_query($conn, "SELECT author, email FROM authors WHERE dest='" + pg_escape_string($s) + "'");
Run Code Online (Sandbox Code Playgroud)
简单.安全(据我所知).
现在我想在C#中使用SQLite做同样的事情:
SQLiteCommand query = m_conn.CreateCommand();
query.CommandText = "SELECT author, email FROM authors WHERE dest=@param";
query.Parameters.Add("@dest", SqlDbType.String).Value = s;
m_datareader = query.ExecuteReader();
Run Code Online (Sandbox Code Playgroud)
是不是有点矫枉过正?如果没有,为什么?
据我所知,最后,发送到数据库的字符串仍然是一个字符串,为什么要通过这个而不是仅手动清理不安全的字符串?如果在ASP .NET中打印一些不安全的文本也是HTML
htmlAdd.Text("<div>@param1</div>");
htmlAdd.Parameters.Add("@param1").Value = unsafeUsername;
Run Code Online (Sandbox Code Playgroud)
?
我想上这堂课:
class QueryResultSet
{
public QueryResultSet(SQLiteConnection conn, string queryText)
{
m_conn = conn;
m_conn.Open();
SQLiteCommand query = m_conn.CreateCommand();
query.CommandText = queryText;
m_datareader = query.ExecuteReader();
}
public object this[string key]
{
get { return m_datareader[key]; }
}
public bool Read()
{
return m_datareader.Read();
}
~QueryResultSet()
{
m_conn.Close();
}
private SQLiteConnection m_conn;
private SQLiteDataReader m_datareader;
}
Run Code Online (Sandbox Code Playgroud)
但现在我必须改变方法:
public QueryResultSet(SQLiteConnection conn, string queryText, Dictionary<string,string> params)
Run Code Online (Sandbox Code Playgroud)
这将导致方法之前的代码进入它的大小加倍.
有什么标准方法吗?如果这个类不是一个好主意,如何避免为每个请求做10行?
参数化查询是更好的选择,因为它们通常是类型安全的,为您处理任何转义,文字格式等,以及允许服务器/后端缓存已编译的查询以获得更好的性能.
大多数数据库引擎都允许您同时执行"普通旧sql"和参数化查询.
当然,构建完整的SQL字符串需要您了解RDBMS使用的确切格式和数据类型,因为它们都有所不同.