簡體   English   中英

使用此INSERT INTO語句和.NET OleDb命名空間時,如何解決語法錯誤?

[英]How to solve a syntax error when using this INSERT INTO statement and the .NET OleDb namespace?

嘗試將值插入Access數據庫時,我總是收到錯誤消息。

該錯誤是語法錯誤,導致以下異常:

OleDbException是INSERT INTO語句中未處理的語法錯誤。

private OleDbConnection myCon;

public Form1()
{
    InitializeComponent();
    myCon = new OleDbConnection(@"Provider=Microsoft.Jet.OLEDB.4.0; Data Source=C:\File.mdb");
}

private void insertuser_Click(object sender, EventArgs e)
{
    OleDbCommand cmd = new OleDbCommand();
    myCon.Open();
    cmd.Connection = myCon;
    cmd.CommandType = CommandType.Text;

    cmd.CommandText = "INSERT INTO User ([UserID], [Forename], [Surname], " +
                                        "[DateOfBirth], [TargetWeight], [TargetCalories], [Height]) " +
                      "VALUES ('" + userid.Text.ToString() + "' , '" +
                                    fname.Text.ToString() + "' , '" +
                                    sname.Text.ToString() + "' , '" +
                                    dob.Text.ToString() + "' , '" +
                                    tarweight.Text.ToString() + "' , '" +
                                    tarcal.Text.ToString() + "' , '" +
                                    height.Text.ToString() + "')";

    cmd.ExecuteNonQuery();
    myCon.Close();
}

嗯,您尚未指定錯誤的根源-但是您的第一個問題是直接將數據插入SQL語句中。 不要那樣做 您正在邀請SQL注入攻擊

請改用參數化的SQL語句 完成此操作后,如果仍然有問題,請使用新代碼編輯此問題, 然后說明錯誤是什么 新代碼可能已經更加清晰了,因為不會涉及巨大的串聯,因此很容易隱藏不匹配的括號之類的內容。

編輯:如評論中所述,Jet / ACE不允許使用DML,因此容易受到較少類型的SQL注入攻擊。 對於此INSERT語句,實際上可能沒有漏洞-但對於以類似方式編寫的帶有WHERE子句的SELECT,用戶輸入可能會繞開WHERE子句的某些保護。 我強烈建議您理所當然地使用參數化查詢:

  • 它們意味着您不必轉義用戶數據
  • 他們將數據與代碼分開
  • 如果您從Jet / ACE遷移,則不必擔心(無論是遷移此特定代碼,還是只是您個人開始在其他數據庫上工作)
  • 對於其他數據類型,例如日期,您無需做任何工作即可將數據轉換為適合數據庫的格式

(您也不需要對ToString所有調用。不僅我希望稱為Text的屬性已經是一個字符串,而且使用字符串連接這一事實意味着無論如何都會自動進行字符串轉換。)

我將其作為重復問題的注釋發布在: C#中的INSERT INTO語句中的語法錯誤OleDb異常無法發現錯誤

在表名稱“ User”周圍放置方括號[]。 它是SQL Server中的保留字。

“用戶”也是Access中的保留字(由提供者在您的連接字符串中判斷)。

但我完全同意Jon的看法-如果您修復當前的實現,那么您將面臨一個巨大的安全漏洞(針對User表,同樣如此!)

如果您的數據庫表包含使用Microsoft Jet 4.0保留字的列名,則可能會出現此問題。

更改數據庫表中的列名稱,以便您不使用Jet 4.0保留字。

在這之后

cmd.CommandText="INSERT INTO User ([UserID], [Forename], [Surname], [DateOfBirth], [TargetWeight], [TargetCalories], [Height]) Values ('" + userid.Text.ToString() + "' , '" + fname.Text.ToString() + "' , '" + sname.Text.ToString() + "' , '" + dob.Text.ToString() + "' , '" + tarweight.Text.ToString() + "' , '" + tarcal.Text.ToString() + "' , '" + height.Text.ToString() + "')";

檢查其中包含的內容,也許[DateOfBirth]具有非法格式

如果TargetWeightHeightTargetCalories是浮點或整數值,則它們不需要在SQL語句中用引號引起來。

另外,與您的問題沒有直接關系,但是您應該真正考慮使用參數化查詢。 您的代碼很容易受到SQL注入的攻擊。

public decimal codes(string subs)
    {
        decimal a = 0;


        con_4code();
            query = "select SUBJINTN.[SCODE] from SUBJINTN where SUBJINTN.[ABBR] = '" +                         subs.ToString() + "'";
            cmd1 = new OleDbCommand(query, concode);
            OleDbDataReader dr = cmd1.ExecuteReader();

這是博士的錯誤,它說DBMS中的語法錯誤是有效的

            if (dr.Read())
            {
                a = dr.GetDecimal(0);
                MessageBox.Show(a.ToString());
            }
            return a;



    }

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM