none
VB2010 連接ACCESS 資料庫時運行INSERT 指令時出錯 RRS feed

  • 問題

  • Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
            Dim dbpath As String = "OT time-off.accdb"
            Dim source As String
            source = "provider=microsoft.Ace.oledb.12.0;data source=" & dbpath
            Dim conn As OleDbConnection
            conn = New OleDbConnection(source)
            conn.Open()

            Dim officerid As String
            Dim pw As String
            Dim rank As String
            Dim post As String
            Dim team As String
            Dim supcode As String
            Dim tob As String
            Dim ename As String
            Dim cname As String
            Dim title As String
            Dim homereg As String
            Dim initial As String
            Dim lnn As String
            Dim hkid As String
            Dim locker As String
            Dim govid As String
            Dim joindate As String
            Dim htel As String
            Dim otel As String
            Dim info As String
            Dim mtel As String
            Dim cmds As OleDbCommand
            Dim ldate As String = "2020/08/09"

            officerid = oid.Text
            pw = password.Text
            team = textbox1.Text
            supcode = scode.Text
            ename = textbox20.Text
            cname = chiname.Text
            initial = textbox3.Text
            homereg = hr.Text
            lnn = textbox4.Text
            locker = textbox5.Text
            joindate = maskbox1.Text
            hkid = textbox6.Text
            govid = gid.Text
            htel = textbox7.Text
            otel = textbox8.Text
            rank = combo1.Text
            post = combo2.Text
            tob = MaskedTextBox1.Text
            title = combo4.Text
            mtel = textbox9.Text
            info = "Insert Into staff (Special_right,officer_code,Password,Rank,Post,Supervisor_code,Team,Time-off_balance,Name,Chinese_name,Title,Initial,HKID,Govt_ID,Mobile,Home_Tel,Officer_Tel,Home_Reg,Lotus_Notes_Name,Locker,Join_Session_Date,Leave_Session_Date) Values ('" &
            officerid.Trim() & "' , '" & pw.Trim() & "','" & rank.Trim() & "','" & post.Trim() & "','" & supcode.Trim() & "', '" &
           team.Trim() & "', '" & tob.Trim() & "','" & ename.Trim() & "','" & cname.Trim() & "','" & title.Trim() & "', '" & initial.Trim() & "','" &
            hkid.Trim() & "', '" & govid.Trim() & "', '" & mtel.Trim() & "', '" & htel.Trim() & "', '" & otel.Trim() & "', '" & homereg.Trim() & "','" & sp_right & "', '" &
            lnn.Trim() & "', '" & locker.Trim() & "', '" & joindate.Trim() & "','" & ldate.Trim() & "')"
            cmds = New OleDbCommand(info, conn)
            cmds.ExecuteNonQuery()

            conn.Close()
        End Sub

    上面的CODE 是一個讓別人填寫資料表後按下ADD 的按鈕

    Info 是INSERT的 SQL command, 第一個括號是ACCESS相對的資料項目名稱

    運行時他一直說" cmds.ExecuteNonQuery()" 這行有問題,

    insert指令語法有誤, 可是我是照著參考書來打的....弄了半天還是不知道有什麼問題

    剛剛試了, 如果只新增一項的話程式能運行, 但當加多了一項之後,同樣的問題再出現了...OTZ



    • 已編輯 kahung30 2014年7月23日 上午 02:53
    2014年7月23日 上午 01:24

解答

  • 請使用參數查詢法,至少不用組字串組到眼睛花掉,也不會有 SQL Injection 的問題。

    另外,Access 內的 SQL 不可以出現保留字。

    http://support.microsoft.com/kb/286335/zh-tw


    強力監督SQL Injection問題!!

      • 小朱的技術隨手寫:http://www.dotblogs.com.tw/regionbbs/
      • 雲端學堂Facebook: http://www.facebook.com/studyazure

    • 已標示為解答 kahung30 2014年7月23日 下午 01:54
    2014年7月23日 上午 01:32
    版主
  • 你把 Password 改個名字,Pwd 好了,再試一次。

    強力監督SQL Injection問題!!

      • 小朱的技術隨手寫:http://www.dotblogs.com.tw/regionbbs/
      • 雲端學堂Facebook: http://www.facebook.com/studyazure

    • 已標示為解答 kahung30 2014年7月23日 下午 01:54
    2014年7月23日 上午 08:06
    版主
  • 1. 請先充實 Access SQL 的知識 (買本書是不錯的作法)。

    2. Access 可用的 Data Types: http://www.w3schools.com/sql/sql_datatypes.asp


    強力監督SQL Injection問題!!

      • 小朱的技術隨手寫:http://www.dotblogs.com.tw/regionbbs/
      • 雲端學堂Facebook: http://www.facebook.com/studyazure

    • 已標示為解答 kahung30 2014年7月23日 下午 01:54
    2014年7月23日 上午 11:54
    版主

所有回覆

  • 請使用參數查詢法,至少不用組字串組到眼睛花掉,也不會有 SQL Injection 的問題。

    另外,Access 內的 SQL 不可以出現保留字。

    http://support.microsoft.com/kb/286335/zh-tw


    強力監督SQL Injection問題!!

      • 小朱的技術隨手寫:http://www.dotblogs.com.tw/regionbbs/
      • 雲端學堂Facebook: http://www.facebook.com/studyazure

    • 已標示為解答 kahung30 2014年7月23日 下午 01:54
    2014年7月23日 上午 01:32
    版主
  • 保留字是什麼,

    另外參數查詢法是什麼 

    剛剛學只懂看書搬字過紙,什麼都不懂OTZ

    2014年7月23日 上午 01:46
  • http://blog.xuite.net/regionbbs/techlogs/17446836

    保留字就是系統保留下來,你不能用的字,前面有給你一個連結,裡面有保留字的清單。


    強力監督SQL Injection問題!!

      • 小朱的技術隨手寫:http://www.dotblogs.com.tw/regionbbs/
      • 雲端學堂Facebook: http://www.facebook.com/studyazure

    2014年7月23日 上午 03:07
    版主
  • 這個頁面我剛剛找到看過, 不過還是不太懂

    舉個例

    如果

    info = "Insert Into staff (Officer_code,password) Values ('" & officerid.Trim() & "' , '" & pw.Trim() & "')"

    那麼應該如何應用參數查詢?

    2014年7月23日 上午 03:54
  • http://www.mikesdotnetting.com/Article/26/Parameter-Queries-in-ASP.NET-with-MS-Access

    強力監督SQL Injection問題!!

      • 小朱的技術隨手寫:http://www.dotblogs.com.tw/regionbbs/
      • 雲端學堂Facebook: http://www.facebook.com/studyazure

    2014年7月23日 上午 05:51
    版主
  • 先謝過大大, 以下是小的照著網頁的更改

    可是同一樣的問題 (INSERT的語法有錯誤)

    info = "Insert Into staff (officer_code,Password,Rank,Post,Supervisor_code,Team,Time-off_balance,Name,Chinese_name,Title,Initial,HKID,Govt_ID,Mobile,Home_Tel,Officer_Tel,Home_Reg,Lotus_Notes_Name,Locker,Join_Session_Date,Leave_Session_Date) Values (?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?)"
            cmds = New OleDbCommand(info, conn)
            cmds.CommandType = CommandType.Text
            cmds.Parameters.AddWithValue("officer_code", officerid)
            cmds.Parameters.AddWithValue("Password", pw)
            cmds.Parameters.AddWithValue("Rank", rank)
            cmds.Parameters.AddWithValue("Post", post)
            cmds.Parameters.AddWithValue("Supervisor_code", supcode)
            cmds.Parameters.AddWithValue("Team", team)
            cmds.Parameters.AddWithValue("Time-off_balance", tob)
            cmds.Parameters.AddWithValue("Name", ename)
            cmds.Parameters.AddWithValue("Chinese_name", cname)
            cmds.Parameters.AddWithValue("Title", title)
            cmds.Parameters.AddWithValue("Initial", initial)
            cmds.Parameters.AddWithValue("HKID", hkid)
            cmds.Parameters.AddWithValue("Govt_ID", govid)
            cmds.Parameters.AddWithValue("Mobile", mtel)
            cmds.Parameters.AddWithValue("Home_Tel", htel)
            cmds.Parameters.AddWithValue("Officer_Tel", otel)
            cmds.Parameters.AddWithValue("Home_Reg", homereg)
            cmds.Parameters.AddWithValue("Lotus_Notes_Name", lnn)
            cmds.Parameters.AddWithValue("Locker", locker)
            cmds.Parameters.AddWithValue("Join_Session_Date", joindate)
            cmds.Parameters.AddWithValue("Leave_Session_Date", ldate)

            cmds.ExecuteNonQuery()

            conn.Close()

    2014年7月23日 上午 06:46
  • info = "Insert Into staff (officer_code,Password) Values (?,?)"

            Using cmds As New OleDbCommand(info, conn)
                cmds.CommandType = CommandType.Text
                cmds.Parameters.AddWithValue("officer_code", TextBox2.Text)
                cmds.Parameters.AddWithValue("Password", TextBox10.Text)
                cmds.ExecuteNonQuery()
            End Using

    我簡化了來作測試, 結果還是一樣,

    OLEDBEXCEPTION 未處理,
    INSERT INTO 陳述式的語法錯誤。


    接著換了 單項試試看

    info = "Insert Into staff (officer_code) Values (?)"

            Using cmds As New OleDbCommand(info, conn)
                cmds.CommandType = CommandType.Text
                cmds.Parameters.AddWithValue("officer_code", TextBox2.Text)
                cmds.ExecuteNonQuery()
            End Using

    結果成功運行.. 到底是什麼問題OTZ

    • 已編輯 kahung30 2014年7月23日 上午 07:22
    2014年7月23日 上午 07:20
  • 你把 Password 改個名字,Pwd 好了,再試一次。

    強力監督SQL Injection問題!!

      • 小朱的技術隨手寫:http://www.dotblogs.com.tw/regionbbs/
      • 雲端學堂Facebook: http://www.facebook.com/studyazure

    • 已標示為解答 kahung30 2014年7月23日 下午 01:54
    2014年7月23日 上午 08:06
    版主
  • 弄好了, 謝謝, 

    另外想問一下,

    我的資料表裡面有 一項是SPECIAL RIGHT (YES/NO 的格子)

    我設計的表單裡有一個CHECKBOX 讓用家勾選他是還是不是有SPECIAL RIGHT的

    想問一下有方法INSERT進去資料表嗎? (因為好像只能INSERT TEXT類型的

    另外 INSERT 時間類型的資料 又是如何弄呢 (因為想弄一項是計錄用戶還剩下多少時間 E.G. 09:30:00)

    謝謝大大今天一整天耐心的解答 OTZ


    這是小的CHECKBOX的 CODE

    Private Sub spright_CheckedChanged(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles spright.CheckedChanged
            If spright.Checked Then
                sp_right = True
            Else
                sp_right = False
            End If
        End Sub

    以下是在PUBLIC的一小段宣告 sp_right

    Public Class Form6
        Dim sp_right As Boolean = False

    • 已編輯 kahung30 2014年7月23日 上午 09:14
    2014年7月23日 上午 09:11
  • 1. 請先充實 Access SQL 的知識 (買本書是不錯的作法)。

    2. Access 可用的 Data Types: http://www.w3schools.com/sql/sql_datatypes.asp


    強力監督SQL Injection問題!!

      • 小朱的技術隨手寫:http://www.dotblogs.com.tw/regionbbs/
      • 雲端學堂Facebook: http://www.facebook.com/studyazure

    • 已標示為解答 kahung30 2014年7月23日 下午 01:54
    2014年7月23日 上午 11:54
    版主
  • 工作上突然要小的製作一個程序OTZ 

    沒辦法之下唯有草草看了一本VISUAL BASIC 2010 的書

    可是SQL 那邊他沒說太深入 結果自己弄的時侯一堆ERROR 

    有時間的話我會好好惡補一下的

    勞煩大大了..


    • 已編輯 kahung30 2014年7月23日 下午 01:55
    2014年7月23日 下午 01:54
  • Office 2003 以前的 Access 線上手冊比較完整,2007 以後變成微軟網站線上版,反而精簡很多,例如:


    INSERT INTO 陳述式

    新增一個或多個記錄至一個資料表。 此動作可參照為一個新增查詢


    語法

    多重記錄新增查詢:

    INSERT INTO target [(field1[, field2[,
    ...]])] [IN externaldatabase]
        SELECT
    [source.]field1[, field2[, ...]
        FROM
    tableexpression

    單一記錄新增查詢:

    INSERT INTO target [(field1[, field2[,
    ...]])]
        VALUES (value1[, value2[, ...])

    INSERT INTO 陳述式可分為以下幾個部份:

    部份 敘述
    target 欲新增記錄的資料表或查詢的名稱。
    field1, field2 如果其後為 target 引數,指欲新增資料的欄位名稱;如果其後為 source
    引數,則指欲從其取得資料的欄位名稱。
    externaldatabase 外部資料庫的路徑 有關路徑的資訊,請參閱
    IN 子句。
    source 複製記錄的來源資料表或查詢的名稱。
    tableexpression 欲插入資料至其中的一個或多個資料表的名稱。 此引數可為單一資料表名稱、一個已儲存的查詢,或由 INNER JOINLEFT
    JOIN
    RIGHT JOIN 合成的結果。
    value1, value2 欲插入至新增記錄的特定欄位值。 每一個值將依照排列中的位置順序插入至相關欄位之中: value1
    將被插入至新增記錄的 field1 之中,value2 插入至 field2,依此類推。
    您必須使用逗點將這些值分隔,並且將文字欄位用引號 (' ') 括起來。


    註解

    您可以使用 INSERT INTO 陳述式來新增一個單一記錄至一個資料表中,如以上所示使用單一記錄新增查詢語法。
    在這種例子中,您的程式碼指定了每一欄位的記錄名稱和值。 您必須指定想要分配每一記錄欄位的值以及在此欄位的值。 如果您沒有指定每一個欄位時,預設值或 Null 值將被插入至沒有資料的欄之中。 這些記錄將被新增至資料表的尾部。

    您亦可以使用 INSERT INTO 從其他的資料表新增一組記錄,或使用 SELECT 來查詢 ... FROM
    子句如以上所示之多重記錄新增查詢語法,您亦可以從另一資料表或查詢使用 INSERT INTO 新增一組記錄。 在這個範例中,SELECT
    子句將指定新增欄位至指定的 target 資料表。

    sourcetarget 資料表可以指定一個資料表或查詢。 如果指定查詢,Microsoft Jet 資料庫引擎
    會將記錄新增到任何及所有被此查詢所指定的資料表。

    INSERT INTO 是選擇性的,但當使用時,請置於 SELECT 陳述式之前。

    如果您的目的地資料表包含一個主索引,確定您新增至主索引欄位的值是唯一且不為 Null
    的值;如果您沒有這樣做,Microsoft Jet
    資料庫引擎
    將不會新增記錄。

    如果您使用自動編號欄位新增記錄至一個資料表中,並且您要將新增記錄重新編號,不要包含自動編號欄位在您的查詢之中。
    如果您要保持欄位中的原始值,請將自動編號加在您的查詢之中。

    使用 IN 子句,可新增記錄至另一個資料庫中的資料表。

    若要建立一個新的資料表,使用 SELECT... INTO 陳述式建立產生資料表查詢

    若要在您執行新增查詢之前找出哪些記錄是被新增的,首先執行和檢視一個使用相同的選取範圍準則之選取查詢所獲得的結果。

    新增查詢為從一個或多個資料表中複製記錄至另一個資料表。 包含您新增之記錄的資料表將不會被新增查詢所影響。

    除了從另一資料表中來新增現存的記錄,您可以指定在單一新增記錄之中使用 VALUES 子句來指定對每一欄位的值。 如果您省略欄位清單,VALUES
    子句在資料表之中必須包含每一欄位的值;否則, INSERT 運算將會失敗。 使用額外的 INSERT INTO 陳述式與一個 VALUES
    子句來建立您要的每一個額外的記錄。


    請參閱
    FROM 子句 (Microsoft Jet SQL) SELECT 陳述式 (Microsoft Jet
    SQL)
    IN 子句 (Microsoft Jet SQL) SELECT...INTO 陳述式 (Microsoft Jet
    SQL)
    INNER JOIN 運算 (Microsoft Jet
    SQL)
    WHERE 子句 (Microsoft Jet
    SQL)
    LEFT JOIN 和 RIGHT JOIN 運算
    (Microsoft Jet SQL)


    範例

    INSERT INTO 陳述式範例


    不精確的問法,就會得到隨便猜的答案;自己都不肯花時間好好描述問題,又何必期望網友會認真回答?

    2014年7月24日 下午 12:20
  • 請使用參數查詢法,至少不用組字串組到眼睛花掉,也不會有 SQL Injection 的問題。

    另外,Access 內的 SQL 不可以出現保留字。

    http://support.microsoft.com/kb/286335/zh-tw


    強力監督SQL Injection問題!!

    這位仁兄,請發表自己的高見,不要複製人家的話幫自己打廣告,謝謝。

    強力監督SQL Injection問題!!

      • 小朱的技術隨手寫:http://www.dotblogs.com.tw/regionbbs/
      • 雲端學堂Facebook: http://www.facebook.com/studyazure


    • 已編輯 AskaSuModerator 2014年7月28日 上午 10:33 刪除引文中的廣告連結及公司名稱
    2014年7月28日 上午 08:11
    版主