2016-12-16 11 views
0

でFROM句の構文エラー、それは完全に働いています。..私はデータを挿入するには、このコマンドを使用するの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; 
} 

しかし、私は追加したり、このコマンドを交換した後、「FROM句の構文エラーは、」現れます..

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

2番目の 'cmd.CommandText'が最初のものを上書きする?1つのコマンドに2つの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です。

すべてのクエリでデータの消去とパラメータ化が必要です。 Webから制御できないものは連結しないでください。

コマンドでパラメータを使用するということは、基本的にパラメータを示す適切な文字識別子を使用することを意味します。 SQLとAccessでは、 "@"記号でうまくいくはずです。他のデータベースは異なるパラメータを使用します。 VFPは "?"プレースホルダとして、SAP Advantage Databaseは ":"を使用します。

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

は、その後、あなたは良いことがあります。..何かのように、あなたのコマンドを(それらのすべては、選択、挿入、更新、削除)を変更

。誰かが "O'Mally"のような名前の一部として引用符を入れると、連結が失敗する可能性があります。この見積もりは見積もりの​​バランスを崩し、失敗を引き起こします。

カラムが数値データ型または日付データ型である場合は、送信するパラメータがAddWithValue()コールによってそのタイプであることを確認してください。

さらに、わかりやすくするために、insert文の値を明示的に "@parmSomething"と呼んでいるので、実際の列名ではなくパラメーター値であることがわかります...特にWebの初心者およびクエリ。

最後に他の人によると。日付、時刻、その他のSQL句などの予約語には注意してください。これらは、[日付]または[日付]などのかっこで囲む必要があります。Date

複数の挿入文では、通常、SQLは1つの文の終わりを識別し、

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); 
... 
... 
... 

次に実行します。うまくいけば、これらのサンプルの読みやすさもあなたに役立ちます。

関連する問題