这是我的问题。 我创建了一个数据访问层类,它允许我创建与数据库(Odbc,OleDb和SqlClient)通信所需的大多数对象。我还创建了一个业务对象处理层类,大量使用Reflection来处理我的业务对象的大量任务。除此之外,这个类生成我的DAL处理所需的每个属性/对象(SQL流,值列表,属性,设置检索值等)。请查看下面的代码以获得进一步说明:
Public Shared Function InvokeParam(Of T)(_classObject As T, _commandType As AdapterCommandType, _arguments As Object()) As Boolean
Dim s As String = DAL.SCRFL.GetParamStatement(_classObject, _commandType, _arguments)
'Debug.Print(s)
Dim hT As Hashtable = DAL.SCRFL.GetProperties(_classObject)
Using cnn As IDbConnection = DataFactory.CreateConnection()
Dim cmd As IDbCommand = DataFactory.CreateCommand(s, cnn)
'cmd.CommandType = CommandType.Text
cmd.CommandText = s
For Each k In hT
Dim param As IDbDataParameter = cmd.CreateParameter()
'param.DbType = DataFactory.ConvertToDbType(k.value.GetType)
param.Value = k.value
param.ParameterName = k.key
'param.Direction = ParameterDirection.Input
'Debug.Print("value:={0}, name:={1}", TypeName(k.value), TypeName(k.key))
Debug.Print("typeMatch:={0}, value:={1}, name:={2}", TypeName(param.Value) = TypeName(k.value), param.Value, param.ParameterName)
cmd.Parameters.Add(param)
Next
If (cmd.ExecuteNonQuery > 0) Then
Return True
End If
End Using
Return False
End Function
因此,DAL.SCRFL.GetParamStatement
返回格式为INSERT INTO t1 (f1, f2, f3...) values (?, ?, ?...)
的字符串,用于插入和更新,删除,选择语句的相应字符串。一切都是用反射完成的。这里没有语法错误。我可以通过直接提供程序类型命令手动执行返回值。
DAL.SCRFL.GetProperties
方法返回格式为key = property(field),value = field value。
现在,我需要为每个属性创建参数并将其添加到我的命令参数然后执行它。您将在我的代码中看到此尝试(我通过循环哈希表为每个属性/值对创建参数)。但最后我得到Data type mismatch in criteria expression.
描述的例外。我已经尝试将type
属性添加到参数对象size
等等,所有都不成功(我对它们进行了评论)。我尝试将param.Value = k.value
更改为param.Value = If(IsDBNull(k.value), DBNull.Value, k.value)
,认为这可能是问题,但k.value
来自我的商务类,我故意阻止空值。什么都没有用!这是测试;业务类从DAL.SCRFL.GetParamStatement
调用返回值:测试是针对OleDb / Access数据库完成的,如您所见,我将备注字段括在单引号中。我的反射方法读取类属性的属性(我设置为表字段名称)和DAL.SCRFL.GetParamStatement
构建基本的sql语句,用于插入,更新,删除和选择使用。 AdapterCommandType
是内置的枚举类型。)
INSERT INTO Clinics
(ClinicId, ClinicName, Phone, Fax, FederalId, DateContracted, Address, City, State, Zip, Inactive, [Memo], DateEntered, EnteredBy, DateModified, ModifiedBy)
VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)
请注意,我有另一个与此类似的方法,它执行一个sql语句(InvokeSql),在那里我彻底检查每个属性的值类型,以便在我的sql语句中构造property = value对。在这个InvokeSql
中使用完全限定的sql语句,方法不会发出一个警告(Rouphly:cnn As IDbConnection = CreateConnection(), cmd = CreateCommand(_cmdText, cnn), cmd.ExecuteNonQuery()
其中_cmdText
是sql语句。没有参数,你可以看到!) 。我提到这一点指出每当我使用通用IDbCommands参数时就会出现问题。即使在我的DataFactory中,IDbCommand设置为特定于提供者的命令类型(my DataFactory.CreateCommand(s, cnn)
返回通用IDbCommand)。
在我的DAL开发之前,我手动完成了上述所有步骤,尽管所有对象(命令,连接等)都被明确声明为提供者特定类型。从技术上讲,我正在使用与我以前使用的泛型类型的对象完全相同的场景(不是特定于提供者)。但是我不能让它发挥作用,有可能,我错过了某些东西。
答案 0 :(得分:0)
我在codeproject上发布了这个问题,答案就在那里。 http://www.codeproject.com/Questions/446516/How-to-add-parameters-and-execute-a-generic-IDbCom