我只使用存储过程对db执行任何操作。在你说:)之前我不想使用ORB。
对于每个表,我有一个相应的DAO类(VB或C#),例如:
Namespace Dao
Public Class Client
Public Sub New(ByVal id As Integer, ByVal description As String)
Me.id = id
Me.description = description
End Sub
Property id As Integer
Property description As String
End Class
End Namespace
构造函数构建类字段/属性。 在另一个类中,我通常构建一个DAO类的列表(容器),调用SELECT存储过程,获取字段并构建单个DAO:
Public Shared Function GetList() As List(Of Dao.Client)
Dim model As New List(Of Dao.Client)
Using dr As MySqlDataReader = DBUtils.CallReadingStoredProcedure("sp_get_clients")
While dr.Read
Dim client As New Dao.Client(dr.GetInt32(0), dr.GetString(1))
model.Add(client)
End While
Return model
End Using
End Function
有时我需要从另一个方法创建相同的Dao.class。如果构建它的字段很多,那么它将是有用的,而不是直接将值传递给DAO.class构造函数 - 这很容易出错 - 只是将数据读取器传递给另一个构造函数,该构造函数提取字段并构建自身。
就像将建筑责任传递给Dao.class本身一样:
Namespace Dao
Public Class Client
Public Sub New(ByVal dr As DataReader)
Me.id = dr.GetInt32("id")
Me.marca_id = dr.GetInt32("marca_id")
Me.categoria_id = dr.GetInt32("categoria_id")
Me.codice = dr.GetString("codice")
Me.descrizione = dr.GetString("descrizione")
... many other
End Sub
...
End Class
End Namespace
这种方式即使我使用不同的存储过程来获取客户端,我也使用相同的代码来构建它们。
只要datareader字段(即SELECT字段)始终命名为相同,它就可以正常工作。这是可能的,但是当我有一个JOIN时,命名字段不包含表名,即在SP中使用此查询:
SELECT
OA.id, -- 0
OA.articolo_id, -- 1
OA.quantita, -- 2
OA.quantita_evasa, -- 3
OA.prezzo, -- 4
A.id, -- 5
A.marca_id, -- 6
A.categoria_id, -- 7
A.codice, -- 8
A.descrizione, -- 9
A.prezzo_listino, -- 10
A.sconto, -- 11
A.prezzo_speciale, -- 12
A.ha_matricola, -- 13
A.unita_misura, -- 14
A.peso, -- 15
A.codice_barre, -- 16
other fields ...
FROM nm_ordini_articoli OA
JOIN articoli A ON (OA.articolo_id = A.id)
other JOINs...
我无法dr.getInt32("OA.id")
,因为字段名称为“id”,表名为“OA”。我可以使用索引,但这是纯粹的疯狂,因为我应该尝试在不同的存储过程中对相同的数据使用相同的索引!
问题是:我想要一个Dao构造函数来构建一个给出datareader的类;如何从datareader获取命名字段,包括表别名或名称?我想做dr.getInt32("real table name", "field name")
或dr.getInt32("table.field")
其他建议? 感谢。
答案 0 :(得分:2)
DataReader.GetSchemaTable
返回的DataTable
中提供了查询结果的大部分元数据。该表的详细信息取决于提供者,对于SQL Server,它在SqlDataReader.GetSchemaTable
中记录,包括ColumnName
,BaseColumnName
和BaseTableName
列。
请记住,可能会在查询中计算返回的列,但没有给出名称,因此它们都可以是null
。
答案 1 :(得分:0)
我的一位聪明的朋友给了我这个优雅而简单的解决方案:使用字段别名...... 它的确很好用!
SELECT
OA.id AS ordine_articolo_id,
...