簡體   English   中英

簡單的SQL查詢不起作用

[英]Simple sql query not working

我試圖將一些數據插入數據庫(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();
    }

}

有人可以指出我的錯誤嗎? 對於其他查詢,它似乎工作正常。

提前致謝。

問題似乎是您正在嘗試使用SqlCommand類的ExecuteReader方法執行不返回結果集的查詢,該方法將嘗試執行查詢並為最終結果集創建並返回DataReader。

您應該對INSERTUPDATE sql語句使用ExecuteNonQuery


邊注

並非這是導致錯誤的原因,但是您還應該考慮使用SqlParamters而不是將值組成INSERT語句。 使用准備好的SQL語句通常可以提高性能,還有助於防止SQL注入攻擊。

有關使用准備好的語句的示例,請參見MSDN頁面或Prepare方法。

當您應該使用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 ' ''); Drop table Cookies -- ' ''); Drop table Cookies -- 這稱為“ Sql注入攻擊”,是網站被黑客入侵的5大原因之一。

編輯

只是為了幫助給出另一個示例,說明為什么使用String.Format傳遞未生成的值是不好的。 http://xkcd.com/327/

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM