加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

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

发布时间:2020-12-15 23:59:52 所属栏目:百科 来源:网络整理
导读:我在 PHP中使用了postgreSQL,这很简单:当你进行查询时,你会这样做: $result = pg_query($conn,"SELECT author,email FROM authors WHERE dest='" + pg_escape_string($s) + "'"); 简单.安全(据我所知). 现在我想在C#中使用SQLite做同样的事情: SQLiteComm
我在 PHP中使用了postgreSQL,这很简单:当你进行查询时,你会这样做:

$result = pg_query($conn,"SELECT author,email FROM authors WHERE dest='" + pg_escape_string($s) + "'");

简单.安全(据我所知).

现在我想在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();

是不是有点矫枉过正?如果没有,为什么?

据我所知,最后,发送到数据库的字符串仍然是一个字符串,为什么要通过这个而不是仅手动清理不安全的字符串?如果在ASP .NET中打印一些不安全的文本也是HTML

htmlAdd.Text("<div>@param1</div>");
htmlAdd.Parameters.Add("@param1").Value = unsafeUsername;

我想上这堂课:

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;
}

但现在我必须改变方法:

public QueryResultSet(SQLiteConnection conn,string queryText,Dictionary<string,string> params)

这将导致方法之前的代码进入它的大小加倍.

有什么标准方法吗?如果这个类不是一个好主意,如何避免为每个请求做10行?

解决方法

我使用扩展方法

public static IDataReader GetReader(this IDbConnection conn,string query,params object[] values) {
  var Command=conn.CreateCommand();
  var paramNames=Enumerable.Range(1,values.Length).Select(i=>string.Format("@param{0}",i)).ToArray();
  Command.CommandText=string.Format(query,paramNames);
  for (var i=0;i<values.Length;i++) {
    var param=Command.CreateParameter();
    param.ParameterName=paramNames[i];
    param.Value=values[i];
    Command.Parameters.Add(param);
  }
  return Command.ExecuteReader();
}

然后,您可以在代码中使用字符串格式语法进行查询.

例如

Conn.GetReader("SELECT author,email FROM authors WHERE dest={0}",dest);

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读