 |
|
[.NET]Error ตรง "Conversion from type 'DBNull' to type 'integer' is not valid." แก้ยังไงดีครับ |
|
 |
|
|
 |
 |
|
รบกวนผู้เชี่ยวชาญช่วยดูหน่อยครับ พอดีผมทำฟอร์มนี้ขึ้นมาแล้วก่อนหน้านี้ยังใช้งานได้ปกติ รันปกติไม่มีเออเร่อ แต่พอช่วงต้นเดือนที่ผ่านมามาเช็คอีกทีกลับขึ้นเออเร่อตามหัวข้อเลยครับ แล้วพอผมลองดักค่าว่าง IsDBNull แล้วรันได้แต่ว่าในฐานข้อมูลมันไม่มีการหักค่า ColorInShop ที่ถูกทำการเบิกออกไป เหมือนค่านี้มันเป็นค่า 0 อะครับ พอจะมีวิธีแก้ไหมครับ ผมติดอยู่ตรงเออเร่อนี้มา 2 อาทิตย์ได้แล้วยังแก้ไม่ได้เลยครับ
ช่วงบรรทัดที่ 69-77 ที่เป็นปัญหาครับ
Code (VB.NET)
Private Sub cmdSave_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles cmdSave.Click
If txtEmployeeID.Text = "" Then
MessageBox.Show("กรุณาระบุรหัสพนักงาน !!!", "ผลการตรวจสอบ", MessageBoxButtons.OK, MessageBoxIcon.Information)
txtEmployeeID.Focus()
Exit Sub
End If
If lsvPrintColorList.Items.Count = 0 Then
MessageBox.Show("กรุณาป้อนรายการเบิกหมึกพิมพ์ !!!", "ผลการตรวจสอบ", MessageBoxButtons.OK, MessageBoxIcon.Information)
txtPrintCLID.Focus()
Exit Sub
End If
Dim sqlDisclose As String = ""
Dim comDisclose As OleDbCommand = New OleDbCommand
With Conn
If .State = ConnectionState.Open Then .Close()
.ConnectionString = strConn
.Open()
End With
Try
If MessageBox.Show("คุณต้องการบันทึกรายการเบิกหมึกพิมพ์ ใช่หรือไม่?", "คำยืนยัน", MessageBoxButtons.YesNo, MessageBoxIcon.Question) = DialogResult.Yes Then
AutoGenerateTranID()
sqlDisclose = "INSERT INTO Disclose (TransID,EmployeeID) "
sqlDisclose &= " VALUES('" & LastTransID & "',"
sqlDisclose &= "'" & txtEmployeeID.Text & "')"
With comDisclose
.CommandType = CommandType.Text
.CommandText = sqlDisclose
.Connection = Conn
.ExecuteNonQuery()
End With
Dim i As Integer = 0
Dim tmpPrintCLID As String = ""
Dim sqlPrintColor As String = ""
Dim tmpColorInShop As Integer = 0
Dim tmpColorInDisclose As Integer = 0
Dim tmpDiscloseNum As Integer = 0
Dim tmpDate_Disclose As Date
tmpDate_Disclose = Date.Now
For i = 0 To lsvPrintColorList.Items.Count - 1
sqlDisclose = "INSERT INTO DiscloseDetail(TransID,PrintCLID,Date_Disclose,DiscloseNum)"
sqlDisclose &= " VALUES('" & LastTransID & "',"
tmpPrintCLID = lsvPrintColorList.Items(i).SubItems(0).Text
tmpDiscloseNum = CInt(lsvPrintColorList.Items(i).SubItems(2).Text)
sqlDisclose &= "'" & tmpPrintCLID & "',"
sqlDisclose &= "'" & tmpDate_Disclose & "',"
sqlDisclose &= tmpDiscloseNum & ")"
With comDisclose
.CommandText = sqlDisclose
.ExecuteNonQuery()
End With
sqlPrintColor = "SELECT PrintCLID,ColorInShop,ColorInDisclose FROM PrintColor"
sqlPrintColor &= " WHERE (PrintCLID='" & tmpPrintCLID & "')"
da.SelectCommand.CommandText = sqlPrintColor
da.Fill(ds, "PrintColor")
tmpColorInShop = CInt(ds.Tables("PrintColor").Rows(0).Item("ColorInShop"))
tmpColorInDisclose = CInt(ds.Tables("PrintColor").Rows(0).Item("ColorInDisclose"))
ds.Tables("PrintColor").Clear()
sqlDisclose = "UPDATE PrintColor"
sqlDisclose &= " SET ColorInShop=" & tmpColorInShop - tmpDiscloseNum & ","
sqlDisclose &= " ColorInDisclose=" & tmpColorInDisclose + tmpDiscloseNum
sqlDisclose &= " WHERE (PrintCLID='" & tmpPrintCLID & "')"
With comDisclose
.CommandText = sqlDisclose
.ExecuteNonQuery()
End With
Next
MessageBox.Show("บันทึกรายการเบิกหมึกพิมพ์เรียบร้อยแล้ว !!!", "ผลการทำงาน", MessageBoxButtons.OK, MessageBoxIcon.Information)
ClearAllCustomerData()
ClearAllPrintColorData()
lsvPrintColorList.Items.Clear()
cboDepartment.SelectedIndex = 0
txtEmployeeID.Enabled = True
txtEmployeeID.Focus()
End If
Catch ErrProcess As Exception
MessageBox.Show("ไม่สามารถบันทึกรายการเบิกหมึกพิมพ์ได้ เนื่องจาก " & ErrProcess.Message, "ข้อผิดพลาด", MessageBoxButtons.OK, MessageBoxIcon.Warning)
Exit Sub
End Try
End Sub
Tag : .NET, Ms Access, Win (Windows App), VB.NET
|
ประวัติการแก้ไข 2017-10-19 15:11:55
|
 |
 |
 |
 |
Date :
2017-10-19 15:11:05 |
By :
ford24832 |
View :
3573 |
Reply :
56 |
|
 |
 |
 |
 |
|
|
|
 |
 |
|
 |
 |
 |
|
|
 |
 |
|
Error นี้ไม่มีอะไรซับซ้อครับ แค่ค่ามัน Null เลยทำการ Convert ไม่ได้ครับ ฉะนั้นควรจะเช็คค่า Null ก่อนจะ Convert ครับ หรือไม่สร้งเป็น Function แล้วเรียกเอาดีกว่าครับ จะได้แก้ที่ Function ได้เลย
|
 |
 |
 |
 |
Date :
2017-10-20 09:45:16 |
By :
mr.win |
|
 |
 |
 |
 |
|
|
 |
 |
|
 |
 |
 |
|
|
 |
 |
|
วิธีแก้นะครับ แก้ตอนคุณ Query มาครับ ผมไม่รู็ว่าคอลัมไหนที่เป็น NULL นะครับ ผมจำลองว่าเป็น ColorInDisclose ละกัน
SELECT PrintCLID,ColorInShop,ISNULL(ColorInDisclose,0) ColorInDisclose FROM PrintColor
|
 |
 |
 |
 |
Date :
2017-10-20 10:20:31 |
By :
OOP |
|
 |
 |
 |
 |
|
|
 |
 |
|
 |
 |
 |
|
|
 |
 |
|
ฐานข้อมูลอะไรครับ
|
 |
 |
 |
 |
Date :
2017-10-20 13:24:40 |
By :
OOP |
|
 |
 |
 |
 |
|
|
 |
 |
|
 |
 |
 |
|
|
 |
 |
|
ไม่เคยใช้ access แฮะ ลองแก้ตั้งแต่แรกเริ่มเดิมทีดูครับเซ็ตให้ field นั้น not null แล้วใส่ default เป็น 0 ดู
แล้วก็มีวิธีถึกกว่านั้น โดยใช้ ds.Tables("PrintColor").Contains("ColorInShop") เอาไปเช็ค if ครับ ถ้า true ก็เขียนแบบเดิม แต่ถ้า false ก็ assign 0 ให้ได้เลย เป็นวิธีเขียนแบบถึกๆ ที่ป้องกัน nullable ได้ครับ
|
 |
 |
 |
 |
Date :
2017-10-22 03:16:11 |
By :
PlaKriM |
|
 |
 |
 |
 |
|
|
 |
 |
|
 |
 |
 |
|
|
 |
 |
|
ลองแบบนี้ดูนะครับ
1.ดีบักเพื่อดูค่า tmpColorInShop
2.ดีบักเพื่อดูค่า tmpDiscloseNum
3.ดีบักเพื่อดูค่า tmpColorInDisclose
ดูว่าก่อน Update ค่าที่ได้เป็นเท่าไหร่นะครับ
ถ้าไม่ตรงกับที่ต้องการ ให้ย้อน โค้ดขึ้นไปอีก ว่า ต้นเหตุมาจากไหนครับ
|
 |
 |
 |
 |
Date :
2017-10-22 07:42:12 |
By :
Dr.K |
|
 |
 |
 |
 |
|
|
 |
 |
|
 |
 |
 |
|
|
 |
 |
|
แบบนี้ได้ไหมครับ ทำทั้งหมดที่ COlumn เป็นตัวเลขนะครับ
SELECT IIF(IsNULL(ColorInDisclose), 0, ColorInDisclose ) AS ColorInDisclose FROM PrintColor
|
 |
 |
 |
 |
Date :
2017-10-24 17:46:08 |
By :
OOP |
|
 |
 |
 |
 |
|
|
 |
 |
|
 |
 |
 |
|
|
 |
 |
|
ds.Tables("PrintColor").Columns.Contains("ColorInShop")
โทษทีครับ พิมพ์สด มีตกหล่น
|
 |
 |
 |
 |
Date :
2017-10-24 22:26:00 |
By :
PlaKriM |
|
 |
 |
 |
 |
|
|
 |
 |
|
 |
 |
 |
|
|
 |
 |
|
ทำทั้งหมดทุก COlumn ที่เป็นตัวเลขตามที่บอกละยัง
|
 |
 |
 |
 |
Date :
2017-10-25 09:18:51 |
By :
OOP |
|
 |
 |
 |
 |
|
|
 |
 |
|
 |
 |
 |
|
|
 |
 |
|
คำสั่งนี้จะได้อะไรออกมา ลอง DEbug แล้วเอามันไปรันใน Access ดูหน่อยครับ อยากรู้ผลลัพธ์คำสั่งนี้
Code (C#)
sqlPrintColor = "SELECT PrintCLID,ColorInShop,ColorInDisclose FROM PrintColor"
sqlPrintColor &= " WHERE (PrintCLID='" & tmpPrintCLID & "')"
|
 |
 |
 |
 |
Date :
2017-10-25 10:32:39 |
By :
OOP |
|
 |
 |
 |
 |
|
|
 |
 |
|
 |
 |
 |
|
|
 |
 |
|
ลองตามนี้คับ เอาไปแทนตรง บรรทัดที่ 75-76
Code (VB.NET)
If tmpColorInShop = CInt(ds.Tables("PrintColor").Rows(0).Item("ColorInShop")) <> DBNull.Value And tmpColorInShop = CInt(ds.Tables("PrintColor").Rows(0).Item("ColorInShop")) IsNot Nothing Then
tmpColorInShop = CInt(ds.Tables("PrintColor").Rows(0).Item("ColorInShop"))
End If
If tmpColorInDisclose = CInt(ds.Tables("PrintColor").Rows(0).Item("ColorInDisclose")) <> DBNull.Value And tmpColorInDisclose = CInt(ds.Tables("PrintColor").Rows(0).Item("ColorInDisclose")) IsNot Nothing Then
tmpColorInDisclose = CInt(ds.Tables("PrintColor").Rows(0).Item("ColorInDisclose"))
End If
|
 |
 |
 |
 |
Date :
2017-10-25 14:17:51 |
By :
OOP |
|
 |
 |
 |
 |
|
|
 |
 |
|
 |
 |
 |
|
|
 |
 |
|
ตรง IF ตัด CInt ออกก่อนครับ
|
 |
 |
 |
 |
Date :
2017-10-27 09:12:39 |
By :
OOP |
|
 |
 |
 |
 |
|
|
 |
 |
|
 |
 |
 |
|
|
 |
 |
|
เช็คจาก statement sql น่าจะดีที่สุด
โดยเปลี่ยน isnull จากคห 2 ข้างบน เป็น Nz([fieldname], CCur(0))
Code (SQL)
SELECT PrintCLID,Nz([ColorInShop],0) ColorInShop,Nz([ColorInDisclose],0) ColorInDisclose FROM PrintColor
ปล. หลีกเลี่ยงการใช้ if() เพราะช้ากว่า
|
ประวัติการแก้ไข 2017-10-27 09:51:43
 |
 |
 |
 |
Date :
2017-10-27 09:50:06 |
By :
Chaidhanan |
|
 |
 |
 |
 |
|
|
 |
 |
|
 |
 |
 |
|
|
 |
 |
|
ตรวจสอบ ค่า ก่อนทำการ Convert
Code (VB.NET)
If String.IsNullOrEmpty(lsvPrintColorList.Items(i).SubItems(2).Text) Then
tmpDiscloseNum = 0
else
tmpDiscloseNum = CInt(lsvPrintColorList.Items(i).SubItems(2).Text)
End If
|
 |
 |
 |
 |
Date :
2017-10-27 10:52:37 |
By :
xxxx |
|
 |
 |
 |
 |
|
|
 |
 |
|
 |
 |
 |
|
|
 |
 |
|
ขอโทษ copy มาแล้วแก้ไม่ครบ
Code (SQL)
SELECT PrintCLID,
Nz([ColorInShop], 0) as Color_InShop,
Nz([ColorInDisclose],0) as Color_InDisclose
FROM PrintColor
ถ้ายังไงลองเอาโค๊ด sql ของ access ที่แก้ไขแล้ว เต็มๆ มาลงให้ดูหน่อยครับ
ปล. น่าจะใช้ alias ซ้ำกับ ชื่อ field ไม่ได้
|
ประวัติการแก้ไข 2017-10-27 14:16:46 2017-10-27 14:24:06 2017-10-27 14:35:45
 |
 |
 |
 |
Date :
2017-10-27 14:15:02 |
By :
Chaidhanan |
|
 |
 |
 |
 |
|
|
 |
 |
|
 |
 |
 |
|
|
 |
 |
|
เขียนคำสั่งเพื่อใช้คิวรี่ เก็บไว้ที่ไหนครับ
ที่เป็น select ...... แล้วขึ้น errror ว่า
Syntax error (missing operator) in query expression 'Nz([ColorInShop],0) ColorInShop'.
เอาอันนั้นมาลง
|
 |
 |
 |
 |
Date :
2017-10-27 17:42:55 |
By :
Chaidhanan |
|
 |
 |
 |
 |
|
|
 |
 |
|
 |
 |
 |
|
|
 |
 |
|
Code (VB.NET)
If String.IsNullOrEmpty(lsvPrintColorList.Items(i).SubItems(2).Text) Then
'กรณีที่ตรวจสอบแล้วเป็นจริง แสดงว่าเป็นค่าว่าง
tmpDiscloseNum = 0
Else
'กรณีที่ตรวจสอบแล้วไม่ใช่ค่าว่างหรือ Null
tmpDiscloseNum = CInt(lsvPrintColorList.Items(i).SubItems(2).Text)
End If
|
 |
 |
 |
 |
Date :
2017-10-27 17:47:59 |
By :
xxxx |
|
 |
 |
 |
 |
|
|
 |
 |
|
 |
 |
 |
|
|
 |
 |
|
ขอดู Code ที่ ใส่เงื่อนไขในการตรวจสอบ ค่าว่างหรือ DBNull ทีครับ
|
 |
 |
 |
 |
Date :
2017-10-30 10:35:19 |
By :
xxxx |
|
 |
 |
 |
 |
|
|
 |
 |
|
 |
 |
 |
|
|
 |
 |
|
อ่ะ ไกล์ให้
- dbnull ไม่ใช่ null คนละตัวกัน
- ไม่เกี่ยวกับ sql statment
|
 |
 |
 |
 |
Date :
2017-10-30 10:41:28 |
By :
ห้ามตอบเกินวันละ 2 กระทู้ |
|
 |
 |
 |
 |
|
|
 |
 |
|
 |
 |
 |
|
|
 |
 |
|
SELECT PrintCLID,Nz([ColorInShop],0) ColorInShop,Nz([ColorInDisclose],0) ColorInDisclose FROM PrintColor
ตัว alias name เปลี่ยนใหม่ อย่าให้เหมือนกับชื่อ field จริง
SELECT PrintCLID,Nz([ColorInShop],0) AS ColorIn_Shop,Nz([ColorInDisclose],0) AS ColorIn_Disclose FROM PrintColor
|
 |
 |
 |
 |
Date :
2017-10-30 10:44:42 |
By :
Chaidhanan |
|
 |
 |
 |
 |
|
|
 |
 |
|
 |
 |
 |
|
|
 |
 |
|
ยังไม่ได้อีกรึกระทู้นี้ นานมากกกกกกก
|
 |
 |
 |
 |
Date :
2017-10-30 12:46:43 |
By :
Dr.K |
|
 |
 |
 |
 |
|
|
 |
 |
|
 |
 |
 |
|
|
 |
 |
|
พอดียิ่งอ่าน แล้วก็ยิ่งงง สรุป
ปัญหาอยู่ที่โค้ดนี้ใช่ไม๊ครับ
Code (VB.NET)
sqlPrintColor = "SELECT PrintCLID,ColorInShop,ColorInDisclose FROM PrintColor"
sqlPrintColor &= " WHERE (PrintCLID='" & tmpPrintCLID & "')"
da.SelectCommand.CommandText = sqlPrintColor
da.Fill(ds, "PrintColor")
tmpColorInShop = CInt(ds.Tables("PrintColor").Rows(0).Item("ColorInShop"))
tmpColorInDisclose = CInt(ds.Tables("PrintColor").Rows(0).Item("ColorInDisclose"))
รึว่าอยู่ที่
Code (VB.NET)
sqlDisclose = "UPDATE PrintColor"
sqlDisclose &= " SET ColorInShop=" & tmpColorInShop - tmpDiscloseNum & ","
sqlDisclose &= " ColorInDisclose=" & tmpColorInDisclose + tmpDiscloseNum
sqlDisclose &= " WHERE (PrintCLID='" & tmpPrintCLID & "')"
With comDisclose
.CommandText = sqlDisclose
.ExecuteNonQuery()
End With
tmpColorInShop tmpColorInDisclose ไม่สามารถ อ่านค่าเป็น integer ได้ ปัญหานี้ยังคงอยู่นะครับ
ใช้ทั้ง ISNULL IsDBNull DBNull ก็ยังติด Error อยู่
ลองแบบนี้ดูนะครับ
Code (VB.NET)
If String.IsNullOrEmpty(ds.Tables("PrintColor").Rows(0).Item("ColorInShop")) Then
tmpColorInShop = 0
Else
tmpColorInShop = CInt(ds.Tables("PrintColor").Rows(0).Item("ColorInShop"))
End If
If String.IsNullOrEmpty(ds.Tables("PrintColor").Rows(0).Item("ColorInDisclose")) Then
tmpColorInDisclose = 0
Else
tmpColorInDisclose = CInt(ds.Tables("PrintColor").Rows(0).Item("ColorInDisclose"))
End If
ปล.ปัญหานี้จะหายไปอย่างสิ้นเชิงเมื่อเรา แก้ที่ต้นเหตุ คือตอนที่ Insert ColorInShop,ColorInDisclose ใน PrintColor เป็น 0 ตั้งแต่แรกครับ
เพราะงั้นถ้าทำทุกอย่างแล้วไม่ได้ แนะนำให้ไปแก้ใน Access ให้เป็น 0 แทนค่า null แค่นี้ก็แก้ปัญหาได้แล้วครับ   
อย่ายึดติดแค่ว่าต้องแก้ที่โปรแกรมอย่างเดียว เพราะเป้าหมายใหญ่คือ ค่า null ถ้าเราทำให้มันไม่ null ซะ ปัญหา null ก็จะหายไป
พร้อมสู้กับปัญหาอื่นต่อไปครับ 5555
|
 |
 |
 |
 |
Date :
2017-10-31 09:25:30 |
By :
Dr.K |
|
 |
 |
 |
 |
|
|
 |
 |
|
 |
 |
 |
|
|
 |
 |
|
ลองดูตามนี้ครับ ถ้าไม่ได้ก็จนปัญญาละ เอาไปแทนตรง บรรทัดที่ 75-76
Code (VB.NET)
If Not (DBNull.Value Is ds.Tables("PrintColor").Rows(0).Item("ColorInShop")) And Not (Nothing Is ds.Tables("PrintColor").Rows(0).Item("ColorInShop")) Then
tmpColorInShop = CInt(ds.Tables("PrintColor").Rows(0).Item("ColorInShop"))
End If
If Not (DBNull.Value Is ds.Tables("PrintColor").Rows(0).Item("ColorInDisclose")) And Not (Nothing Is ds.Tables("PrintColor").Rows(0).Item("ColorInDisclose")) Then
tmpColorInDisclose = CInt(ds.Tables("PrintColor").Rows(0).Item("ColorInDisclose"))
End If
|
ประวัติการแก้ไข 2017-10-31 09:28:11
 |
 |
 |
 |
Date :
2017-10-31 09:27:33 |
By :
OOP |
|
 |
 |
 |
 |
|
|
 |
 |
|
 |
 |
|
|