【问题标题】:Simple sql query not working简单的sql查询不起作用
【发布时间】:2011-12-12 04:48:55
【问题描述】:

我尝试将一些数据插入我的数据库(sql server/本地文件),但它不起作用。

public bool SaveCookie(string cookie, string expires)
{
    SimpleDBM db = new SimpleDBM();
    db.Connect();
    try
    {
        string query = string.Format("INSERT INTO Cookies(cookie_value, cookie_expires) VALUES('{0}', '{1}');", cookie, expires);
        SqlCommand cmd = new SqlCommand();
        cmd.CommandText = query;
        //... 
        SqlDataReader data = db.Query(ref cmd);
        return data.Read();
    }
    catch
    {
        return false;
    }
    finally
    {
        db.Close();
    }
}

SimpleDBM 类:

public class SimpleDBM {

    public static string dbpath = @"...";
    public static string dbname = "db.mdf";
    public static string dfullPath = Path.Combine(dbpath, dbname);
    public static string connStr = string.Format(@"Data Source=.\SQLEXPRESS;AttachDbFilename={0};Integrated Security=True;Connect Timeout=30;User Instance=True", dfullPath);

    private SqlConnection con; 

    public void Connect()
    {
        con = new SqlConnection();
        con.ConnectionString = connStr;
        con.Open();
    }

    public SqlDataReader Query(ref SqlCommand cmd)
    {
        cmd.Connection = con;
        return cmd.ExecuteReader();
    }

    public void Close()
    {
        con.Close();
    }

}

谁能指出我的错误?对于其他查询,它似乎工作正常。

提前致谢。

【问题讨论】:

  • 你得到什么错误?还是您根本没有收到错误,只是没有插入?
  • 异常应该告诉你错误是什么。
  • Fee fi fo fum,我闻到了 SQL 注入的味道。
  • @TheMask:使用 参数化查询! 不要将 SQL 语句串在一起,而是使用:INSERT INTO Cookies(cookie_value, cookie_expires) VALUES(@Cookie, @Expires);,然后在 SqlComamnd 中设置参数值.请参阅 Scott Chamberlain 的回答 - 他非常详细地展示了它

标签: c# .net sql sql-server-2005


【解决方案1】:

问题似乎是您正在尝试使用 SqlCommand 类的 ExecuteReader 方法执行不返回结果集的查询,该方法将尝试执行您的查询并创建并返回 DataReader用于最终结果集。

您应该将ExecuteNonQuery 用于INSERTUPDATE sql 语句。


旁注

这并不是您收到错误的原因,但您还应该考虑使用 SqlParamters 而不是将值组合到 INSERT 语句中。使用准备好的 SQL 语句通常可以提高性能,还有助于防止 SQL 注入攻击。

有关使用预准备语句的示例,请参阅 MSDN 页面或Prepare 方法。

【讨论】:

    【解决方案2】:

    当您应该使用 ExecuteNonQuery 时,您正在使用 ExecuteReader。

    与您的错误无关,您真的不应该将String.Format 与SqlCommand 一起使用。你应该做的是

    string query = "INSERT INTO Cookies(cookie_value, cookie_expires) VALUES(@cookie, @expires);", cookie, expires);
    SqlCommand cmd = new SqlCommand();
    cmd.Parameters.AddWithValue("@cookie", cookie);
    cmd.Parameters.AddWithValue("@expires", expires);
    cmd.CommandText = query;
    

    用你的方法问问你自己是否有人传递了' ''); Drop table Cookies --的cookie?这称为“Sql 注入攻击”,是网站被黑客入侵的 5 大原因之一。

    编辑

    只是为了帮助给出另一个示例,说明为什么使用 String.Format 传递您没有生成的值是不好的。

    【讨论】:

    • 虽然 XKCD 片段很有趣,但“String.Format”不好的笼统说法有点误导。事实上 String.Format 真的很有用——不好的是使用它来生成 SQL 语句,因为 SQL 注入问题(可能还有其他问题)。只是一个想法;)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多