none
Visual Studio C#...新增一筆資料的問題(新增空值??) RRS feed

  • 問題

  • 各位大大好:

    我使用的程式語言是Visual Studio C#...

    我想要新增一筆資料到Access裡面

    以下是我的程式碼

    //新增一筆記錄

            objCmd = new OleDbCommand("INSERT INTO EF_Glass(G_no, GT_type, G_name, G_depth, G_sDec," + "G_sRet, G_sAlum, G_sFact, G_pDec, G_pRet, G_pAlum, G_pFact, G_ps)" + "VALUES (@labG_no, @txtGT_type, @txtG_name, @txtG_depth, @txtG_sDec, @txtG_sRet, @txtG_sAlum," +             "@txtG_sFact,@txtG_pDec, @txtG_pRet, @txtG_pAlum, @txtG_pFact, @txtG_ps)", objConn);

            objCmd.Parameters.Add("@G_no", labG_no.Text);

            objCmd.Parameters.Add("@GT_type", txtGT_type.Text);

            objCmd.Parameters.Add("@G_name", txtG_name.Text);

            objCmd.Parameters.Add("@G_depth", txtG_depth.Text);

            objCmd.Parameters.Add("@G_sDec", txtG_sDec.Text);

            objCmd.Parameters.Add("@G_sRet", txtG_sRet.Text);

            objCmd.Parameters.Add("@G_sAlum", txtG_sAlum.Text);

            objCmd.Parameters.Add("@G_sFact", txtG_sFact.Text);

            objCmd.Parameters.Add("@G_pDec", txtG_pDec.Text);

            objCmd.Parameters.Add("@G_pRet", txtG_pRet.Text);

            objCmd.Parameters.Add("@G_pAlum", txtG_pAlum.Text);

            objCmd.Parameters.Add("@G_pFact", txtG_pFact.Text);

            objCmd.Parameters.Add("@G_ps", txtG_ps.Text);

            objConn.Open();

            objCmd.ExecuteNonQuery();

            objConn.Close();

            BindData();

            ShowGlassData();

            dbGlass.Visible = true;

            //顯示訊息:成功新增的訊息!!

            msg.Text = "您已成功新增玻璃名稱為 \"" + txtG_name.Text + "\" 的玻璃檔案!!";

     

    下面是我在Access開的資料表欄位及屬性

    G_no 文字 必須有資料

    GT_type 文字 必須有資料

    G_name 文字 必須有資料

    G_depth 數字 不一定有資料

    G_sDec 數字 不一定有資料

    G_sRet 數字 不一定有資料

    G_sAlum 數字 不一定有資料

    G_sFact 數字 不一定有資料

    G_pDec 貨幣 不一定有資料

    G_pRet 貨幣 不一定有資料

    G_pAlum 貨幣 不一定有資料

    G_pFact 貨幣 不一定有資料

    G_ps 文字 不一定有資料

    G_sign 文字 不一定有資料

     

    我想設定的是在輸入G_depthG_sDecG_sRetG_sAlumG_sFactG_pDecG_pRetG_pAlumG_pFactG_psG_sign等欄位時不一定要輸入資料,在G_sDec欄位內輸入資料時,要新增此筆記錄是沒問題的,但當我在G_sDec欄位沒有輸入任何資料,而想要以空值的方式新增此筆記錄時會出現錯誤

     

    錯誤:準則運算式的資料類型不符合。

    錯誤那一行的程式碼是:objCmd.ExecuteNonQuery();

    可以請問各位大大幫忙解答是怎麼回事嗎??有什麼解決方案??謝謝各位感激不盡

    2010年4月9日 下午 05:47

解答

  • objCmd.Parameters.Add("@G_sDec", Convert.ToInt32(txtG_sDec.Text));
    這樣的寫法並不妥當...如您所述,有多個欄位不一定要輸入資料,若空字串轉型為 int 就會跳出『輸入字串格式不正確』。

    針對選擇性欄位處理的作法有幾種,判斷使用者是否給值再決定該怎麼回寫到資料庫是一個辦法,例如:
    // ...<前略>...
    if (String.IsNullOrEmpty(txtG_sDec.Text))
        objCmd.Parameters.Add("@G_sDec", DBNull.Value);
    else
        objCmd.Parameters.Add("@G_sDec", Convert.ToInt32(txtG_sDec.Text));

     


    Hunterpo's IT Vision - http://www.dotblogs.com.tw/hunterpo/
    • 已標示為解答 2010年4月10日 上午 04:55
    2010年4月10日 上午 04:05

所有回覆

  • 你的G_sDec 是數字型態 , 你傳空字串給他

    當然資料類型不符合啊

    請把G_sDec改成文字
    先查MSDN文件庫
    再用GOOGLE搜尋
    才到論壇來發問

    這是論壇不是技術支援中心
    沒有人得無償解答你的問題

    在標題或文章註明很急
    不會增加網友回覆速度
    2010年4月9日 下午 05:54
  • 你如果要給它Null值, 必須給予 DBNull.Value的值指派給參數

    參考

    小朱 Oh~my god... 資料庫中的 NULL 值和程式語言中的 null 不同,別混為一談

    Jeff Yeh Null / DBNull / String.Empty 差異


    MSDN 文件庫很重要
    回應幫助你的人是一種禮貌, 良好的禮貌有助於激發大家對你問題回應的熱情
    進步的人會找尋自己程式中的缺點,半桶水則把自己程式的錯誤推到不相干事物的身上
    2010年4月10日 上午 01:15
    版主
  • 謝謝"狼鷹"大大的指教...

    惠會聽取"狼鷹"大大的意見,多多使用MSDN文件...

    惠的表達的不清楚...

    惠在Access資料表那邊想以數值型態儲存G_sDec欄位資料...

    當使用者輸入資料到G_sDec欄位,是可以新增此筆記錄...

    程式碼是:objCmd.Parameters.Add("@G_sDec", txtG_sDec.Text);

    如果想要輸入空字串到G_sDec欄位,將G_sDec屬性改成字串惠知道...

     

    惠不懂的是...

    如果今天惠是要新增null值到G_sDec欄位,但G_sDec資料類型為數值的情況下...

    後來惠將程式碼改成:objCmd.Parameters.Add("@G_sDec", Convert.ToInt32(txtG_sDec.Text));

    錯誤訊息是:輸入字串格式不正確

    (這如同"Bill Chung"大大說的,惠把資料庫中的null值和程式語言中的null值混為一談了吧?!)

    還有惠在資料類型轉換運用上不太好...

    大大們抱歉...

    謝謝各位前輩的指教...

     

     

    2010年4月10日 上午 03:33
  • objCmd.Parameters.Add("@G_sDec", Convert.ToInt32(txtG_sDec.Text));
    這樣的寫法並不妥當...如您所述,有多個欄位不一定要輸入資料,若空字串轉型為 int 就會跳出『輸入字串格式不正確』。

    針對選擇性欄位處理的作法有幾種,判斷使用者是否給值再決定該怎麼回寫到資料庫是一個辦法,例如:
    // ...<前略>...
    if (String.IsNullOrEmpty(txtG_sDec.Text))
        objCmd.Parameters.Add("@G_sDec", DBNull.Value);
    else
        objCmd.Parameters.Add("@G_sDec", Convert.ToInt32(txtG_sDec.Text));

     


    Hunterpo's IT Vision - http://www.dotblogs.com.tw/hunterpo/
    • 已標示為解答 2010年4月10日 上午 04:55
    2010年4月10日 上午 04:05
  • "hunterpo0323"大大的意思惠了解了....

    謝謝"hunterpo0323"、"狼鷹"、"Bill Chung"前輩的指教...

     

    2010年4月10日 上午 04:54