简单的SQL查询无法正常工作

时间:2011-10-20 23:08:01

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

我尝试将一些数据插入到我的数据库(sql server / local file)中,但它不起作用。

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

}

有人可以指出我的错误吗?对于其他查询,它似乎工作正常。

提前致谢。

2 个答案:

答案 0 :(得分:5)

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

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


SIDE NOTE

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

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

答案 1 :(得分:3)

当您应该使用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 Injection Attack”,是网站遭到入侵的五大原因之一。

修改

只是为了帮助提供另一个例子,说明为什么使用String.Format传递未生成的值是不好的。 http://xkcd.com/327/