OleDbCommand中FROM子句中的语法错误

时间:2016-12-16 20:00:48

标签: c# sql ado.net

当我使用此命令插入数据时,它完全正常工作..

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

2 个答案:

答案 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 + "')";

答案 1 :(得分:0)

你有没有听说过SQL-Injection ....你很开放曝光。

您的所有查询都应该清理和参数化数据。切勿连接无法通过网络控制的内容。

在命令中使用参数基本上意味着使用指示参数的正确字符标识符。在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 );

然后你应该好。如果有人将引号作为名称的一部分放入,例如“O'Mally”,则连接可能会失败。引用会错误地平衡你的报价并导致失败。

如果您的列是数字或日期数据类型,请确保您通过AddWithValue()调用发送的参数属于该类型。

此外,为了澄清,我明确地将insert语句中的值称为“@parmSomething”,因此您知道它是参数值,而不是实际的列名称并避免混淆...尤其是作为Web的初学者和查询。

最后如其他人所说。注意日期,时间和其他sql子句等保留字。这些应该被限定或包含在括号中,例如[日期]或Date

对于多个insert语句,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 );
...
...
...

然后执行它。希望这些样本的可读性也对您有所帮助。