VB 2008 中的数据类型不匹配
Posted
技术标签:
【中文标题】VB 2008 中的数据类型不匹配【英文标题】:Data type mismatch in VB 2008 【发布时间】:2012-04-28 21:58:53 【问题描述】:大家好,我有一个问题。当我尝试在我的程序中使用这段将供应商添加到数据库中的代码时,我遇到了数据类型不匹配错误。据我所知,供应商的状态造成了错误。
如何将名为radActive
和radInactive
的单选按钮的值存储在数据库中?我应该使用Boolean
还是String
?我使用 Microsoft Access 作为我的数据库,Status
的字段设置为Yes/No
。
这是代码。
Public Sub SupplierInsertData()
Dim conn As OleDb.OleDbConnection
Dim cmd As OleDb.OleDbCommand
Dim SupplierType As String
Dim Status As Boolean
'Check for supplier type
If frmDatabaseSupplier.radLocal.Checked = True Then
SupplierType = "Local"
ElseIf frmDatabaseSupplier.radForeign.Checked = True Then
SupplierType = "Foreign"
End If
'Check for supplier status
If frmDatabaseSupplier.radActive.Checked = True Then
Status = True
ElseIf frmDatabaseSupplier.radInactive.Checked = True Then
Status = False
End If
'For inserting of data in the database.
Dim cmdString As String = "INSERT INTO Supplier(SupplierLastName, SupplierFirstName, SupplierMiddleInitial, " & _
"SupplierCompany, SupplierType, SupplierStreetAddress, SupplierCity, SupplierContactNumber, SupplierEmail, " & _
"Status)" & _
"VALUES('" & frmDatabaseSupplier.txtSupplierLastName.Text & "','" & frmDatabaseSupplier.txtSupplierFirstName.Text & "','" & frmDatabaseSupplier.txtSupplierMiddleInitial.Text & "','" _
& frmDatabaseSupplier.txtSupplierCompany.Text & "','" & SupplierType & "', '" & frmDatabaseSupplier.txtSupplierStreetAddress.Text & "','" & frmDatabaseSupplier.txtSupplierCity.Text & "','" _
& frmDatabaseSupplier.txtSupplierContactNumber.Text & "','" & frmDatabaseSupplier.txtSupplierEmail.Text & "','" & Status & "')"
conn = New OleDb.OleDbConnection("Provider=Microsoft.ACE.OLEDB.12.0;Data Source=|DataDirectory|\ProjectAnalysisSystem.accdb")
cmd = New OleDb.OleDbCommand(cmdString, conn)
conn.Open()
cmd.ExecuteNonQuery()
conn.Close()
End Sub
谢谢!
【问题讨论】:
您不应该尝试解决类型不匹配错误。您应该解决SQL injection 问题。只要您使用parametrized statements,类型不匹配错误就会自行解决。 但我认为目前安全性还不是问题。我仍然首先专注于功能。我会在创建信息系统时尝试研究这些东西。谢谢你的提示。 :) 【参考方案1】:尝试更改代码的最后一部分。
您应该使用参数将文本框或变量的值传递给数据库引擎。
并且不要忘记将 OleDbConnection 等一次性对象封装在 using
语句中。
Dim cmdString As String = "INSERT INTO Supplier(SupplierLastName, SupplierFirstName, SupplierMiddleInitial, " & _
"SupplierCompany, SupplierType, SupplierStreetAddress, SupplierCity, SupplierContactNumber, SupplierEmail, " & _
"Status)" & _
"VALUES(@supplierName, @supplierFirst, @supplierMiddle, @supplierCo, @supplierType, @supplierStreet, @supplierCity, " & _
"@supplierContact, @supplierMail, @status)"
Using conn As New OleDb.OleDbConnection("Provider=Microsoft.ACE.OLEDB.12.0;Data Source=|DataDirectory|\ProjectAnalysisSystem.accdb")
Dim cmd As OleDbCommand = New OleDb.OleDbCommand(cmdString, conn))
cmd.Parameters.AddWithValue("@supplierName", frmDatabaseSupplier.txtSupplierLastName.Text)
cmd.Parameters.AddWithValue("@supplierFirst", frmDatabaseSupplier.txtSupplierFirstName.Text)
cmd.Parameters.AddWithValue("@supplierMiddle", frmDatabaseSupplier.txtSupplierMiddleInitial.Text)
cmd.Parameters.AddWithValue("@supplierCo", frmDatabaseSupplier.txtSupplierCompany.Text )
cmd.Parameters.AddWithValue("@supplierType", SupplierType)
cmd.Parameters.AddWithValue("@supplierStreet", frmDatabaseSupplier.txtSupplierStreetAddress.Text)
cmd.Parameters.AddWithValue("@supplierCity", frmDatabaseSupplier.txtSupplierCity.Text)
cmd.Parameters.AddWithValue("@supplierContact", frmDatabaseSupplier.txtSupplierContactNumber.Text)
cmd.Parameters.AddWithValue("@supplierMail", frmDatabaseSupplier.txtSupplierEmail.Text)
cmd.Parameters.AddWithValue("@status", Status) '<- Here the status var is correctly identified as a boolean, not as a string
conn.Open()
cmd.ExecuteNonQuery()
End Using
【讨论】:
cmd.AddWithValue 缺少语法中的参数。 cmd.Parameters.AddWithValue。如我错了请纠正我。 :)) OleDb 提供程序不支持命名参数。您需要使用问号代替查询中的参数名称。一定要按相同的顺序添加参数。 @Ju-chan 你是对的,忘记参数集合。已更正 @ChrisDunaway 确实,NET OleDb 提供程序不支持命名参数,但在 ACE 和之前的 JET.OLEDB 提供程序中,您也可以使用命名参数语法。按照它们在sql字符串中出现的顺序添加参数很重要 感谢您的所有意见 :)【参考方案2】:您遇到数据类型不匹配错误,因为您的 INSERT statement
尝试为数据类型为 Yes/No 的 Status
字段存储字符串值。
这并不是真正的 VB.Net 问题。如果您从 VBA 尝试相同的操作,您会从 Access 的数据库引擎中得到相同的错误。这是下面 VBA 过程的输出。
INSERT INTO Supplier (Status)
VALUES('True')
Error -2147217913 (Data type mismatch in criteria expression.)
程序...
Public Sub Ju_chan()
Dim cmdString As String
Dim Status As Boolean
Dim strMsg As String
On Error GoTo ErrorHandler
Status = True
cmdString = "INSERT INTO Supplier (Status)" & vbCrLf & _
"VALUES('" & Status & "')"
Debug.Print cmdString
CurrentProject.Connection.Execute cmdString
ExitHere:
On Error GoTo 0
Exit Sub
ErrorHandler:
strMsg = "Error " & Err.Number & " (" & Err.Description _
& ")"
Debug.Print strMsg
GoTo ExitHere
End Sub
请理解,这并不是要让您远离使用参数。我只是想澄清你为什么会收到这个错误。
【讨论】:
非常感谢你给我一个想法:)以上是关于VB 2008 中的数据类型不匹配的主要内容,如果未能解决你的问题,请参考以下文章
在 MS Access 中保存来自 VB.Net Windows 窗体的数据时出现错误 System.Data.OleDb.OleDbException:“标准表达式中的数据类型不匹配”。