[英]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。
您應該對INSERT
和UPDATE
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傳遞未生成的值是不好的。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.