C#中的SQL - 为什么这么详细?

Cle*_*lot 3 c# sql

我在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行?

Dea*_*nna 7

参数化查询是更好的选择,因为它们通常是类型安全的,为您处理任何转义,文字格式等,以及允许服务器/后端缓存已编译的查询以获得更好的性能.

大多数数据库引擎都允许您同时执行"普通旧sql"和参数化查询.

当然,构建完整的SQL字符串需要您了解RDBMS使用的确切格式和数据类型,因为它们都有所不同.