2016-12-16 6 views
0

Когда я Используя эту команду, чтобы вставить данные, он полностью работает ..Синтаксическая ошибка в ЕКЕ в OleDbCommand

using (con = new OleDbConnection(@"PROVIDER=Microsoft.Jet.OLEDB.4.0;" + @"DATA SOURCE=C:\Users\ABDUL MALEK\Documents\Visual Studio 2010\WebSites\WebSite1\App_Data\Database.mdb")) 
{ 
    cmd = new OleDbCommand(); 
    cmd.CommandText = "insert into Customer(Customer_Phone,Customer_Name) VALUES('"+tb_CustNum.Text+"','"+tb_CustName.Text+"')"; 
    cmd.Connection = con; 
    con.Open(); 
    cmd.ExecuteNonQuery(); 
    con.Close(); 
    Label1.Visible= true; 
} 

Но, после того, как добавить или заменить эту команду, «Синтаксическая ошибка в ЕКЕ» показывает вверх ..

cmd.CommandText = "insert into Transaction(Product_Code,Date,Quantity,Total,Customer_Phone) values('" + ddl_PizzaCode.SelectedItem + "','" + DateTime.Now.ToString("dddd, dd MMMM yyyy") + "','" + tb_Quan.Text + "','" + Lb_Price.Text + "','" + tb_CustNum.Text + "')"; 

Это полный код-за:

public partial class _Default : System.Web.UI.Page 
{ 
    OleDbConnection con; 
    OleDbCommand cmd; 

    int Quan; 
    double TotalPrice; 
    //int i = 0; 
    string Date = DateTime.Now.ToString("dddd, dd MMMM yyyy"); 

    protected void Page_Load(object sender, EventArgs e) 
    { 
     Lb_Date.Text = Date; 
    } 

    protected void bt_Calc_Click(object sender, EventArgs e) 
    { 
     Quan = Convert.ToInt32(tb_Quan.Text); 
     TotalPrice = Convert.ToDouble(Lb_Price.Text) * Quan; 
     Lb_TotalPrice.Text = TotalPrice.ToString(); 
    } 

    protected void ddl_PizzaCode_SelectedIndexChanged(object sender, EventArgs e) 
    { 
     DataTable dt = new DataTable(); 
     string strquery = "SELECT * FROM Product WHERE ID = " + ddl_PizzaCode.SelectedValue; 
     using (con = new OleDbConnection(@"PROVIDER= Microsoft.Jet.OLEDB.4.0;" + @"DATA SOURCE =C:\Users\ABDUL MALEK\Documents\Visual Studio 2010\WebSites\WebSite1\App_Data\Database.mdb")) 
     { 
      using (cmd = new OleDbCommand(strquery, con)) 
      { 
       OleDbDataAdapter Da = new OleDbDataAdapter(cmd); 
       Da.Fill(dt); 
      } 
      Lb_PizzaName.Text = dt.Rows[0]["Product_Name"].ToString(); 
      Lb_Price.Text = dt.Rows[0]["Price_per_Unit"].ToString(); 
     } 
    } 

    protected void btn_Save_Click(object sender, EventArgs e) 
    { 
     using (con = new OleDbConnection(@"PROVIDER=Microsoft.Jet.OLEDB.4.0;" + @"DATA SOURCE=C:\Users\ABDUL MALEK\Documents\Visual Studio 2010\WebSites\WebSite1\App_Data\Database.mdb")) 
     { 
      cmd = new OleDbCommand(); 
      cmd.CommandText = "insert into Transaction(Product_Code,Date,Quantity,Total,Customer_Phone) values('" + ddl_PizzaCode.SelectedItem + "','" + DateTime.Now.ToString("dddd, dd MMMM yyyy") + "','" + tb_Quan.Text + "','" + Lb_Price.Text + "','" + tb_CustNum.Text + "')"; 
      cmd.CommandText = "insert into Customer(Customer_Phone,Customer_Name) VALUES('"+tb_CustNum.Text+"','"+tb_CustName.Text+"')"; 
      cmd.Connection = con; 
      con.Open(); 
      cmd.ExecuteNonQuery(); 
      con.Close(); 
      Label1.Visible= true; 
     } 
     BindUserDetails(); 
    } 
    protected void BindUserDetails() 
    { 
     DataSet ds = new DataSet(); 
     DataSet ds2 = new DataSet(); 
     string strquery = "SELECT * FROM Customer"; 
     string strquery2 = "SELECT * FROM Transaction"; 
     using (con = new OleDbConnection(@"PROVIDER=Microsoft.Jet.OLEDB.4.0;" + @"DATA SOURCE=C:\Users\ABDUL MALEK\Documents\Visual Studio 2010\WebSites\WebSite1\App_Data\Database.mdb")) 
     { 
      using (cmd = new OleDbCommand(strquery, con)) 
      { 
       OleDbDataAdapter Da = new OleDbDataAdapter(cmd); 
       Da.Fill(ds); 
      } 
      using (cmd = new OleDbCommand(strquery2, con)) 
      { 
       OleDbDataAdapter Da = new OleDbDataAdapter(cmd); 
       Da.Fill(ds2); 
      } 
     } 
    } 
} 
+4

'VALUES ('" + tb_CustNum.Text + "', '" + tb_CustName.Text + "')" 'Sql Injection !!!!! – vendettamit

+0

Вы понимаете, что ваш второй' cmd.CommandText' перезаписывает первый, правый Если вы хотите две команды INSERT в одной команде, вам нужно объединить их с точкой с запятой. Также предоставьте полную трассировку стека из этой ошибки. –

+0

Извините, но я не знал, как объединить их с точкой с запятой. можете ли вы дать мне пример, пожалуйста? –

ответ

0

слово DATE является ключевым словом в SQL Server и, следовательно, должен быть в квадратных скобках, когда вы используете его как имя поля в C#. Эта линия должна работать:

cmd.CommandText = "insert into Transaction(Product_Code, [Date], Quantity, Total, Customer_Phone) values('" + ddl_PizzaCode.SelectedItem + "','" + DateTime.Now.ToString("dddd, dd MMMM yyyy") + "','" + tb_Quan.Text + "','" + Lb_Price.Text + "','" + tb_CustNum.Text + "')"; 
0

Вы когда-нибудь слышали о SQL-инъекции .... вы WIDE OPEN для экспозиции.

ВСЕ ваши запросы должны иметь данные, очищенные и параметризованные. Никогда не конкатенируйте то, что вы не можете контролировать из Интернета.

Использование параметров в ваших командах в основном означает использование соответствующего символьного идентификатора, указывающего параметр. В SQL и Access вы должны быть хорошо знаком «@». Другие базы данных используют разные параметры. VFP использует "?" как владелец места, база данных SAP Advantage использует «:».

Меняйте команды (все из них выбрать, вставка, обновление, удаление), чтобы что-то вроде ..

cmd.CommandText = 
@"insert into Customer 
     (Customer_Phone, Customer_Name) 
    VALUES 
     (@parmCustomerPhone, @parmCustomerName)"; 

cmd.Parameters.AddWithValue("@parmCustomerPhone", tb_CustNum.Text); 
cmd.Parameters.AddWithValue("@parmCustomerName", tb_CustName.Text); 

Тогда вы должны быть хорошо. Конкатенация может завершиться неудачей, если кто-то добавит цитату «как часть имени, например« О'Малли ». Котировка будет неправильно сбалансировать ваши кавычки и привести к сбою.

Если ваши столбцы имеют числовые или датавые типы данных, убедитесь, что параметр, который вы отправляете, имеет этот тип через вызов AddWithValue().

Кроме того, для пояснения я прямо называю значения в инструкции insert как «@parmSomething», поэтому вы знаете, что это значение параметра, а не фактическое имя столбца и избегание путаницы ... особенно в качестве новичка для Интернета и запрос.

И наконец, как отмечено другим. Будьте осторожны с зарезервированными словами, такими как дата, время и другие предложения sql. Они должны быть квалифицированы или завернуты в скобки, такие как [Дата] или Date

Что касается ваших нескольких операторов вставки, SQL обычно использует полуточку, чтобы идентифицировать конец одного оператора и допускать множественность в одном вызове таких как

cmd.CommandText = 
@"insert into Transaction 
    (Product_Code, 
    [Date], 
    Quantity, 
    Total, 
    Customer_Phone) 
    values 
    (@parmPizza, 
    @parmNow, 
    @parmQty, 
    @parmPrice, 
    @parmPhone); 

insert into Customer 
    (Customer_Phone, 
    Customer_Name) 
    VALUES 
    (@parmCustPhone, 
    @parmCustName) "; 

// NOW, add all the parameters... 
cmd.Parameters.AddWithValue("@eachParmAbove", respectiveTextDateNumericValue); 
... 
... 
... 

THEN выполнить его. Надеюсь, читаемость этих образцов поможет вам.