Простой SQL-запрос не работает - PullRequest
0 голосов
/ 21 октября 2011

Я пытался вставить некоторые данные в свою базу данных (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 ]

5 голосов
/ 21 октября 2011

Проблема заключается в том, что вы пытаетесь выполнить запрос, который не возвращает набор результатов, используя метод ExecuteReader класса SqlCommand , который попытается выполнить ваш запрос и создать и вернуть DataReader для возможного набора результатов.

Вы должны использовать ExecuteNonQuery для INSERT и UPDATE SQL-операторов.


ПОБОЧНОЕ ПРИМЕЧАНИЕ

Не потому, что это причина того, что вы получаете ошибку, но вам также следует рассмотреть возможность использования SqlParamters вместо того, чтобы объединять значения в оператор INSERT. Использование подготовленных операторов SQL обычно повышает производительность, а также помогает предотвратить атаки SQL-инъекциями.

Пример использования подготовленных операторов см. На странице MSDN или Prepare метод.

3 голосов
/ 21 октября 2011

Вы используете ExecuteReader, когда должны использовать ExecuteNonQuery.

Не связано с вашей ошибкой, вам действительно не следует использовать 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 --?Это называется «Sql Injection Attack» и является одной из 5 основных причин взлома сайтов.

РЕДАКТИРОВАТЬ

Просто чтобы привести еще один пример того, почему используется StringФорматировать для передачи значений, которые вы не генерировали, плохо.http://xkcd.com/327/

...