none
新建欄位資料寫入問題 RRS feed

  • 問題

  • 我使用 VB 2008 建立一個全新 Access 資料表,資料表中新增幾個欄位,
    假設我欄位設定 Char(10) 只儲存 3 個字元的話,剩下 7 個字元會自動變成 space 來儲存,
    請問可不可以設定輸入幾個字元就儲存幾個字元就好,剩下的空間不要變成 space 來儲存呢?
    看網路上的教學都是用下面的語法建立欄位,請各位大大幫我看看是不是語法不正確?

    Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
    
            Dim lcCreaStr As String = "Provider=Microsoft.Jet.OLEDB.4.0;Data Source='d:\abc.mdb';Jet OLEDB:Database Password=''"
            Dim loCatalog As Object = CreateObject("ADOX.Catalog")
            Dim Conn As New OleDbConnection(lcCreaStr)
    
            loCatalog.Create(lcCreaStr)
    
            Dim str1 As String = "CREATE TABLE 客戶(SID integer  IDENTITY (1,1) PRIMARY KEY, ID char(10), 姓名 char(10), 性別 char(10), 電話 char(10), 住址 char(10), 生日 char(10)) "
    
            Dim cmd As OleDbCommand = New OleDbCommand(str1, Conn)
            Conn.Open()
    
            cmd.ExecuteNonQuery()
    
            Conn.Close()
    
    
    
    
    '/新增一筆紀錄
        Private Sub Button2_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button2.Click
            Dim str As String = "Provider=Microsoft.Jet.Oledb.4.0;Data source=d:\abc.mdb"
            Dim conn As OleDbConnection = New OleDbConnection(str)
            conn.Open()
    
            Dim str1 As String = "Insert Into 客戶(ID, 姓名, 性別, 電話, 住址, 生日)Values('" & TextBox2.Text & "','" & TextBox1.Text & "','" & TextBox3.Text & "','" & TextBox4.Text & "','" & TextBox5.Text & "', '" & TextBox6.Text & "')"
            Dim cmd As OleDbCommand = New OleDbCommand(str1, conn)
    
            cmd.executenonquery()
            conn.Close()
    
            MessageBox.Show("新增一筆紀錄", "成功新增", MessageBoxButtons.OKCancel, MessageBoxIcon.Information)
        End Sub



    • 已編輯 C.Kevin 2012年3月8日 上午 05:18
    2012年3月8日 上午 05:13

解答

  • 1. 請改用參數化查詢法來組建你的 SQL,否則哪天你的應用程式被 SQL Injection 攻擊,別怪說沒人提醒你。

    2. 不想保留空白,將資料型別改為 varchar (只有英文和數字字元) 或 nvarchar (需要中文字或其他非英數字元)。


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

    2012年3月8日 上午 05:39
    版主
  • 您好,請參考,

    Microsoft Access Data Types


    以上說明若有錯誤請指教,謝謝。
    亂馬客blog: http://www.dotblogs.com.tw/rainmaker/

    2012年3月8日 上午 06:31
  • 除了其他前輩提到所提到的,因為char型態的欄位所存放的內容不足宣告的長度時,會自動在右側補上空白,原文如下:

    http://msdn.microsoft.com/zh-tw/library/ms175055(v=sql.90).aspx

    或許你可以改成使用varchar(10)就不會補空白了。


    以上說明若有錯誤請指教,謝謝。
    http://www.dotblogs.com.tw/terrychuang/


    • 已編輯 TerryChuang 2012年3月8日 上午 07:37
    • 已標示為解答 C.Kevin 2012年3月8日 上午 08:49
    2012年3月8日 上午 07:36

所有回覆

  • 1. 請改用參數化查詢法來組建你的 SQL,否則哪天你的應用程式被 SQL Injection 攻擊,別怪說沒人提醒你。

    2. 不想保留空白,將資料型別改為 varchar (只有英文和數字字元) 或 nvarchar (需要中文字或其他非英數字元)。


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

    2012年3月8日 上午 05:39
    版主
  • 不懂您第 1 個說的參數化查詢法的意思。

    剛剛發現可以使用 String 耶,也沒空白的問題了,
    請問如果我把 Char() 改成 String 對往後資料庫搜索或維護和更改之前有什麼影響嗎?

    • 已編輯 C.Kevin 2012年3月8日 上午 06:00
    2012年3月8日 上午 05:49
  • 不懂您第 1 個說的參數化查詢法的意思

    我在 [全文搜索運算式錯誤] 這篇問答就有說明用 DbParameter , 不過我猜你應該覺得這是廢話. 你可以繼續維持這樣串

     Dim str1 As String = "Insert Into 客戶(ID, 姓名, 性別, 電話, 住址, 生日)Values('" & TextBox2.Text & "','" & TextBox1.Text & "','" & TextBox3.Text & "','" & TextBox4.Text & "','" & TextBox5.Text & "', '" & TextBox6.Text & "')"

    等到有一天你真的把寫軟體當成工作, 然後你的客戶告訴你說資料庫整個被入侵刪光光再來後悔也沒關係.

    黑暗執行緒 [你的網站正在裸奔嗎?]


    在現實生活中,你和誰在一起的確很重要,甚至能改變你的成長軌跡,決定你的人生成敗。 和什麼樣的人在一起,就會有什麼樣的人生。 和勤奮的人在一起,你不會懶惰; 和積極的人在一起,你不會消沈; 與智者同行,你會不同凡響; 與高人為伍,你能登上巔峰。

    2012年3月8日 上午 05:57
  • Bill 大大,我想你可能覺得我小聰明,其實是看不懂您貼的文庫資料。
    有誤會真是有點抱歉。
    2012年3月8日 上午 06:14
  • 看不懂要去試, 要去找相關資料.[點部落中關於參數化查詢的相關文章]

    不要別人給了你九陰真經, 你卻老學成九陰白骨爪


    在現實生活中,你和誰在一起的確很重要,甚至能改變你的成長軌跡,決定你的人生成敗。 和什麼樣的人在一起,就會有什麼樣的人生。 和勤奮的人在一起,你不會懶惰; 和積極的人在一起,你不會消沈; 與智者同行,你會不同凡響; 與高人為伍,你能登上巔峰。


    2012年3月8日 上午 06:22
  • 您好,請參考,

    Microsoft Access Data Types


    以上說明若有錯誤請指教,謝謝。
    亂馬客blog: http://www.dotblogs.com.tw/rainmaker/

    2012年3月8日 上午 06:31
  • 謝謝 Bill ~~
    2012年3月8日 上午 06:32
  • 謝謝 亂馬客~~
    2012年3月8日 上午 06:47
  • 除了其他前輩提到所提到的,因為char型態的欄位所存放的內容不足宣告的長度時,會自動在右側補上空白,原文如下:

    http://msdn.microsoft.com/zh-tw/library/ms175055(v=sql.90).aspx

    或許你可以改成使用varchar(10)就不會補空白了。


    以上說明若有錯誤請指教,謝謝。
    http://www.dotblogs.com.tw/terrychuang/


    • 已編輯 TerryChuang 2012年3月8日 上午 07:37
    • 已標示為解答 C.Kevin 2012年3月8日 上午 08:49
    2012年3月8日 上午 07:36
  • 如果你是寫 ASP,我還沒話說,

    但都已經寫到 .NET 了,有點 Sense 吧!

    第一次貼"接字串" SQL,大家會好心提醒, 

    第二次,

    不能一句"我看不懂"就帶過,

    還是我們會錯意,你中文看不懂,喜歡看英文的。


    blog.kkbruce.net
    Plurk
    Google+專頁

    春有百花秋有月,
    夏有涼風冬有雪,
    若無閒事在心頭,
    便是人間好時節。


    • 已編輯 KKBruceMVP 2012年3月8日 上午 07:37 少字
    2012年3月8日 上午 07:37
  • 請問 Bill 大大,
    您「ADO.NET中SQL語法的參數」文章中舉的例子(如下)

            Dim SQLStr As String = "Select * From myTable Where myNo = @myNo "
            Dim myConn As New SqlConnection(連線字串)
            Dim myCmd As New SqlCommand(SQLStr, myConn)
            myCmd.Parameters.AddWithValue("@myNo", Trim(TextBox1.Text))

    請問「myCmd.Parameters.AddWithValue」要加入什麼類別庫呢?

    我是用 OleDb ,OleDbCommand 因該就是 sqlCommand 吧,
    可是弄不出來,是不是還要加進什麼類別庫,
    我目前加進的類別庫為;

    Imports System.Data
    Imports System.Data.SqlClient
    Imports System.Data.OleDb


    請指教,謝謝~~


    • 已編輯 C.Kevin 2012年3月8日 上午 08:48
    2012年3月8日 上午 08:48
  • 你用 OleDb, 就是用 OleDbConnection, OleDbCommand, ....

    它的所在命名空間, 也是要Import的就是 System.Data.OleDb


    在現實生活中,你和誰在一起的確很重要,甚至能改變你的成長軌跡,決定你的人生成敗。 和什麼樣的人在一起,就會有什麼樣的人生。 和勤奮的人在一起,你不會懶惰; 和積極的人在一起,你不會消沈; 與智者同行,你會不同凡響; 與高人為伍,你能登上巔峰。

    2012年3月8日 上午 08:51
  • 好像找不到「Parameters.AddWithValue」這個方法@@

    我是這樣打;

    Imports System.Data
    Imports System.Data.SqlClient
    Imports System.Data.OleDb

    Public Class Form1
    Private Sub Button2_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button2.Click Dim str As String = "Provider=Microsoft.Jet.Oledb.4.0;Data source=d:\abc.mdb" Dim conn As OleDbConnection = New OleDbConnection(str) conn.Open() Dim str1 As String = "Insert Into 客戶(ID, 姓名, 性別, 電話, 住址, 生日)Values(@ID, @name, @gender, @phone, @address, @birthday)" Dim cmd As OleDbCommand = New OleDbCommand(str1, conn) 'Conn.Parameters.AddWithValue("@ID", Trim(TextBox1.Text)) '<----以 ID 為例子 cmd.executenonquery() conn.Close() MessageBox.Show("新增一筆紀錄", "成功新增", MessageBoxButtons.OKCancel, MessageBoxIcon.Information) End Sub
    End Class




    • 已編輯 C.Kevin 2012年3月8日 上午 08:59
    2012年3月8日 上午 08:57
  • 因為你用錯執行個體啊, 你用到 OleDebConnection的個體去了, 明明我的例子是對著 SqlCommand, 所以轉成OleDb 是要用上 OleDbCommand的執行個體.

    順便教你怎麼看文件好了.

    你先看 [OleDbCommand.Parameters 屬性 ]裡面提到

    屬性值

    型別:System.Data.OleDb.OleDbParameterCollection
    SQL 陳述式或預存程序的參數。預設值為空集合。

    以上就表示當你要用到 OleDbCommand.Parameters 屬性的功能時, 要查詢 [OleDbParameterCollection 類別 ]

    在這邊你就會看到 [OleDbParameterCollection.AddWithValue 方法 ]


    在現實生活中,你和誰在一起的確很重要,甚至能改變你的成長軌跡,決定你的人生成敗。 和什麼樣的人在一起,就會有什麼樣的人生。 和勤奮的人在一起,你不會懶惰; 和積極的人在一起,你不會消沈; 與智者同行,你會不同凡響; 與高人為伍,你能登上巔峰。

    2012年3月8日 上午 09:16
  • 都是學問...有比較知道MSDN怎查詢了。

    我試了SQL 的新增「Insert Into」跟刪除「Delete」語法,參數法查詢都有成功,
    但修改「Update」跟查詢「select」的參數法卻不成功,

    使用修改「Update」時是資料庫無反應,使用查詢「select」時是出現「無值提供給一或多個必要參數。」的錯誤訊息。
    如果都改回以前的"字串法"功能都還正常,請問是哪邊錯了。


    查詢「select」;   select * from 客戶 where 後面接的參數位置是之前程式放 TextBox 的地方。

        Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
            Dim str As String = "Provider=Microsoft.Jet.Oledb.4.0;Data source=d:\abc.mdb"
            Dim conn As OleDbConnection = New OleDbConnection(str)
            conn.Open()
    
            Dim str1 As String = "select [ID], [姓名], [性別], [電話], [住址], [生日] from 客戶 where 姓名 = @name "
            Dim adp1 As OleDbDataAdapter = New OleDbDataAdapter(str1, conn)
    
            Dim cmd As OleDbCommand = New OleDbCommand(str1, conn)
            cmd.Parameters.AddWithValue("@name", Trim(TextBox1.Text))
    
            Dim set1 As DataSet = New DataSet
            adp1.Fill(set1, "la")
    
            TextBox2.Text = set1.Tables("la").Rows(0)("ID")
            TextBox3.Text = set1.Tables("la").Rows(0)("性別")
            TextBox4.Text = set1.Tables("la").Rows(0)("電話")
            TextBox5.Text = set1.Tables("la").Rows(0)("住址")
            TextBox6.Text = set1.Tables("la").Rows(0)("生日")
    
            conn.Close()
        End Sub


    修改「Update」;   Update 客戶 set  後面接的參數位置是之前程式放 TextBox 的地方。
        Private Sub Button3_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button3.Click
            Dim str As String = "Provider=Microsoft.Jet.Oledb.4.0;Data source=d:\abc.mdb"
            Dim conn As OleDbConnection = New OleDbConnection(str)
            conn.Open()
    
            Dim str1 As String = "Update 客戶 set ID = @ID, 性別 = @gender, 電話 = @phone Where 姓名 = @name"
            Dim cmd As OleDbCommand = New OleDbCommand(str1, conn)
    
            cmd.Parameters.AddWithValue("@name", Trim(TextBox1.Text))
    cmd.Parameters.AddWithValue("@ID", Trim(TextBox2.Text)) cmd.Parameters.AddWithValue("@gender", Trim(TextBox3.Text)) cmd.Parameters.AddWithValue("@phone", Trim(TextBox4.Text)) cmd.ExecuteNonQuery() conn.Close() MessageBox.Show("修改一筆紀錄", "成功修改", MessageBoxButtons.OKCancel, MessageBoxIcon.Information) End Sub









    • 已編輯 C.Kevin 2012年3月9日 上午 05:37
    2012年3月9日 上午 05:22
  • Select 的部份, 你的 OleDbDataAdapter 建構函式 用錯了, 你這樣的用法, OleDbCommand 和 OleDbDataAdapter 怎麼產生關聯 ?

    [OleDbDataAdapter 建構函式 (OleDbCommand)]

           Dim str1 As String = "select [ID], [姓名], [性別], [電話], [住址], [生日] from 客戶 where 姓名 = @name "
            Dim cmd As OleDbCommand = New OleDbCommand(str1, conn)
            cmd.Parameters.AddWithValue("@name", Trim(TextBox1.Text))
            Dim adp1 As OleDbDataAdapter = New OleDbDataAdapter(cmd)
            Dim set1 As DataSet = New DataSet
            adp1.Fill(set1, "la")

    Update 部份, DbParameter 的順序要對照你的SQL 敘述

            cmd.Parameters.AddWithValue("@ID", Trim(TextBox2.Text))
            cmd.Parameters.AddWithValue("@gender", Trim(TextBox3.Text))
            cmd.Parameters.AddWithValue("@phone", Trim(TextBox4.Text))
            cmd.Parameters.AddWithValue("@name", Trim(TextBox1.Text))


    在現實生活中,你和誰在一起的確很重要,甚至能改變你的成長軌跡,決定你的人生成敗。 和什麼樣的人在一起,就會有什麼樣的人生。 和勤奮的人在一起,你不會懶惰; 和積極的人在一起,你不會消沈; 與智者同行,你會不同凡響; 與高人為伍,你能登上巔峰。

    2012年3月9日 上午 05:55
  • Bill 謝謝~~!!!

    我有感覺怪,可是不知道怎麼改..
    Bill 大大,要怎麼樣閱讀MSDN才會得到像你解答時這樣清楚的程式使用呢?
    我的意思是文章可能會類似說明參數要按照順序,什麼"方法"要跟什麼"方法"串在一起,
    我知道MSDN像字典,不可能有每個人想要的範例,語法解釋的像是自己看不懂國字,
    一直沒辦法掌握MSDN使用的方式,
    滿多語法都互相關聯,有時繼承有時類別有時屬性....,當只想了解某一個方法時,因為已經不知道該方法是什麼,所以文章提到的相關延伸說明就會進去看,查到最後就變成一糊不知道自己在查什麼。

    將你部落格中「為新手整理的MSDN索引」練習完有辦法消除閱讀MSDN的障礙嗎?
    我也很想要自己成長,就是會有障礙,我也不想這樣

    2012年3月9日 上午 06:54
  • [MSDN文件庫閱讀入門 (1)]

    [MSDN文件庫閱讀入門 (2)]

    [MSDN文件庫閱讀入門 (3)]

    [MSDN文件庫閱讀入門 (4)]

    以上四篇你可以參考一下, 基本上我的過程是這樣, 當我從書上或是別人的文章 (包含 Blog, 論壇) 看到我不懂的東西, 就會去MSDN 找關於它的資料.

    一個很簡單的方法, 當你想要找 SqlCommand 類別, 你就在搜尋引擎上用 "SqlCommand 類別 + MSDN" 當關鍵字, 就可以很快找到它的位置.

    然後再仔細去看它的內容, 花時間去想. 小朱在他的文章 [如何讀 MSDN Library?]中有很精彩的說明, 你可以看一看.


    在現實生活中,你和誰在一起的確很重要,甚至能改變你的成長軌跡,決定你的人生成敗。 和什麼樣的人在一起,就會有什麼樣的人生。 和勤奮的人在一起,你不會懶惰; 和積極的人在一起,你不會消沈; 與智者同行,你會不同凡響; 與高人為伍,你能登上巔峰。

    2012年3月9日 上午 07:35
  • 謝謝~~
    2012年3月9日 上午 07:52
  • 用 Like 去查詢發現也有問題,傷腦筋
    假如用 TextBox 或 DataGridView 顯示查詢結果會變成沒有 "Like" 的功能,全文符合才會顯示。

    Textbox 或 DataGridView 顯示;

    Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
            Dim str As String = "Provider=Microsoft.Jet.Oledb.4.0;Data source=d:\abc.mdb"
            Dim conn As OleDbConnection = New OleDbConnection(str)
            conn.Open()
    
            Dim str1 As String = "select [ID], [姓名], [性別], [電話], [住址], [生日] from 客戶 where 姓名 Like @name "
            Dim cmd As OleDbCommand = New OleDbCommand(str1, conn)
            cmd.Parameters.AddWithValue("@name", Trim(TextBox1.Text))
    
            Dim adp1 As OleDbDataAdapter = New OleDbDataAdapter(cmd)
            Dim set1 As DataSet = New DataSet
            adp1.Fill(set1, "la")
    
            TextBox2.Text = set1.Tables("la").Rows(0)("ID")
            TextBox3.Text = set1.Tables("la").Rows(0)("性別")
            TextBox4.Text = set1.Tables("la").Rows(0)("電話")
            TextBox5.Text = set1.Tables("la").Rows(0)("住址")
            TextBox6.Text = set1.Tables("la").Rows(0)("生日")
    
            DataGridView1.DataSource = set1.Tables("la")
            conn.Close()
        End Sub



    • 已編輯 C.Kevin 2012年3月9日 上午 08:28
    2012年3月9日 上午 08:27
  • LIKE '%@name%'

    論壇是網友平等互助 保證解答請至 微軟技術支援服務


    提問時,錯誤情境描述與錯誤訊息很重要,情境描述包含你做了什麼,預期的結果與實際發生的結果。一個最爛的問法範例:「我的電腦電腦怎麼不能開機?」誰知道你家是不是沒電還是你根本找不到電源鈕。

    2012年3月9日 下午 02:58
  • 結果是要這樣打  '%'+ @name +'%'    

    謝謝 心冷熱情熄 的提醒~~~。


    • 已編輯 C.Kevin 2012年3月12日 上午 03:22
    2012年3月12日 上午 01:46