如何添加参数并执行通用IDbCommand

时间:2012-08-24 07:14:14

标签: database parameters data-access-layer business-logic-layer idbcommand

这是我的问题。 我创建了一个数据访问层类,它允许我创建与数据库(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开发之前,我手动完成了上述所有步骤,尽管所有对象(命令,连接等)都被明确声明为提供者特定类型。从技术上讲,我正在使用与我以前使用的泛型类型的对象完全相同的场景(不是特定于提供者)。但是我不能让它发挥作用,有可能,我错过了某些东西。

1 个答案:

答案 0 :(得分:0)

我在codeproject上发布了这个问题,答案就在那里。 http://www.codeproject.com/Questions/446516/How-to-add-parameters-and-execute-a-generic-IDbCom

相关问题