1、问题描述

最近在写vb.net的时候,碰到了一个有点棘手的问题。就是在vb里面去解决一对多的关系。

对应关系如下,一个合同会对应多个开票。

最简单暴力的方法就是循环查询了,但是这样子肯定不行的。如果是java的话可以写个合同BO类,然后里面有个List<开票类>,但我用的语言是vb,没有java这么好用。后来我去和其他同事请教,才知道在vb.net  ADO里面有个操作,可以操控sql语句的返回形式叫:shape append relate。

2、解决方法

wsc

Public Function ListAAA()
dim cn,rs,sSQL
Set cn = CreateObject("ADODB.Connection")
Set rs = CreateObject("ADODB.Recordset")
cn.Open CS_RS
cn.CursorLocation = 3
sSQL = sSQL & "SHAPE{"
sSQL = sSQL & "select top 100 A.ID,A.ContractNumber from Intranet..tbTestSaleContract A "
sSQL = sSQL & "}"
sSQL = sSQL & "APPEND"
sSQL = sSQL & "({"
sSQL = sSQL & "select B.ID as invoiceId,B.contractId,B.InvoiceType from Intranet..tbTestInvoiceApply B where B.contractId=? "
sSQL = sSQL & "}"
sSQL = sSQL & "RELATE ID TO PARAMETER 0"
sSQL = sSQL & ") as rsBillingInfo"
rs.Open sSQL,cn
Set ListAAA = rs End Function

asp

<%
Response.Charset="gb2312"
Set dbTest = CreateObject("dbTest.wsc")
Set rs=dbTest.ListAAA()
do while not rs.eof
Set rs1=rs("rsBillingInfo").value
do while not rs1.eof
Response.write "合同号:"&rs("ContractNumber")&","&"开票类型:"&rs1("InvoiceType")&","&"开票ID:"&rs1("invoiceId")&"<br/>"
rs1.MoveNext
loop
rs.MoveNext
loop
%>

或者我把wsc和asp合并一下,直接在前端asp使用ADO技术操作数据库

<%
Response.Charset="gb2312" dim cn,sSQL,CS_RS
Set cn = CreateObject("ADODB.Connection")
CS_RS="Driver={SQL Server};Server=127.0.0.1;Uid=xxx;Pwd=xxxx;Provider=xxx;Database=xxxx;"
sSQL = sSQL & "SHAPE{"
sSQL = sSQL & "select top 100 A.ID,A.ContractNumber from Intranet..tbTestSaleContract A "
sSQL = sSQL & "}"
sSQL = sSQL & "APPEND"
sSQL = sSQL & "({"
sSQL = sSQL & "select B.ID as invoiceId,B.contractId,B.InvoiceType from Intranet..tbTestInvoiceApply B where B.contractId=? "
sSQL = sSQL & "}"
sSQL = sSQL & "RELATE ID TO PARAMETER 0"
sSQL = sSQL & ") as rsBillingInfo"
cn.Open CS_RS
Set rs=cn.Execute(sSQL)
do while not rs.eof
Set rs1=rs("rsBillingInfo").value
do while not rs1.eof
Response.write "合同号:"&rs("ContractNumber")&","&"开票类型:"&rs1("InvoiceType")&","&"开票ID:"&rs1("invoiceId")&"<br/>"
rs1.MoveNext
loop
rs.MoveNext
loop
rs.Open sSQL,cn
%>

test页面输出

说明:

shape append relate的基本语法为:

shape {select ...} append ({select ...} RELATE ID TO PARAMETER 0,ID TO PARAMETER 1) 

3、总结

ADO是.NET操作数据库的一种技术,和java中常用的jdbc类似。不过现在除了一些比较老的系统还在用.NET技术,IIS搭建网站以外,基本比较少见了。.NET正在逐渐慢慢地开始被其他技术取代了。从我日常工作的感觉确实vb不如java,python,c++这类的语言方便,没有那么多的开源库支持,网上能找到的资料也很有限。

4、参考资料

ADO中的多层次数据集,类似于dataset_weixin_30808575的博客-CSDN博客

参数化命令的操作 | Microsoft Docs

ADO 教程 | 菜鸟教程 (runoob.com)

shape {select ...} append ({select ...} RELATE ID TO PARAMETER 0,ID TO PARAMETER 1)的更多相关文章

  1. select * from (select P.*,ROWNUM RN FROM(select * from Mp_Relatedart where pubbaseid=785 order by ID ASC )P)M WHERE M.RN>2 and M.RN <= 7

    select * from (select P.*,ROWNUM RN FROM(select * from Mp_Relatedart where pubbaseid=785 order by ID ...

  2. 数据库(update tab1 set tab1.name=tab1.name+(select t2.name from tab2 t2 where t2.id=tab1.id))

    有t1 和 t2 两个表,表中的数据和字段如下: 执行 如下SQL语句: update tab1 set tab1.name=tab1.name+(select t2.name from tab2 t ...

  3. insert into select 与select into from -- sql 批量插入

    参考资料:http://www.w3school.com.cn/sql/sql_union.asp   UNION:操作符用于合并两个或多个select语句的结果集.                 ...

  4. sql: sybase与oracle中insert into select和select into的用法

    1. sybase与oracle中insert into select和select into的用法 http://wjlvivid.iteye.com/blog/1921679 Sybase 一.首 ...

  5. select * 和 select 所有字段的区别

    阅读本文大概需要 1 分钟. 之前发过的文章中,关于 select * 和 select 所有字段的知识,有描述不恰当,这次重新纠正下,加深下理解. MySQL 5.1.37 表记录数 41,547, ...

  6. Insert Into select 与 Select Into 哪个更快?

    在平常数据库操作的时候,我们有时候会遇到表之间数据复制的情况,可能会用到INSERT INTO SELECT 或者 SELECT INTO : 那么二者语法上有什么区别?性能上又如何呢? 围绕着这两个 ...

  7. select * 比select column快很多奇怪案例分析

    遇到MYSQL傻傻的地方,下面给个案例,大家感受下: 注意以下两个sql只有select *和select g.id区别. SQL1:SELECT g.idFROM table1 gINNER JOI ...

  8. oracle 中 insert select 和 select insert 配合使用

    Insert Into select 与 Select Into 哪个更快? 在平常数据库操作的时候,我们有时候会遇到表之间数据复制的情况,可能会用到INSERT INTO SELECT 或者 SEL ...

  9. Python——IO多路复用之select模块select方法

    Python——IO多路复用之select模块select方法 使用select模块的select方法实现Python——IO多路复用 实现同时将终端输入的文本以及客户端传输的文本写入文本文件中: w ...

  10. select * 和 select 字段的速度对比

    拿WordPress的数据库做一个对比 SELECT ID,post_title, post_author FROM wp_posts ORDER BY ID LIMIT 100; OK, Time: ...

随机推荐

  1. 谣言检测(PLAN)——《Interpretable Rumor Detection in Microblogs by Attending to User Interactions》

    论文信息 论文标题:Interpretable Rumor Detection in Microblogs by Attending to User Interactions论文作者:Ling Min ...

  2. 计算机保研,maybe this is all you need(普通双非学子上岸浙大工程师数据科学项目)

    写在前面 9.28接收了拟录取通知,也终究是尘埃落定了,我人生的又一个阶段也终于结束.面对最终录取结果,或多或少会有所遗憾,但也还是基本达到了预期的目标了. 作为在今年严峻的保研形势下幸存的我,一直想 ...

  3. SpringMVC入手项目注解版

    SpringMVC入手项目注解版 1.创建Maven项目在pom.xml文件引入相关的依赖 <dependencies> <dependency> <groupId> ...

  4. java中的栈(利用数组实现栈)

    java中的栈(利用数组实现栈) 常见的数据结构:https://blog.csdn.net/weixin_43304253/article/details/119764275 栈的介绍 1.栈的英文 ...

  5. LeetCode------找到所有数组中消失的数字(6)【数组】

    来源:力扣(LeetCode) 链接:https://leetcode-cn.com/problems/find-all-numbers-disappeared-in-an-array 1.题目 找到 ...

  6. 使用NEON指令加速RGB888和RGB565的相互转换

    最近在做一个项目需要将RGB888转换为RGB565,用C语言转换的代码很简单,这是从ffmpeg中摘抄的代码 static inline void rgb24to16_c(const uint8_t ...

  7. 从0搭建vue3组件库: 如何完整搭建一个前端脚手架?

    相信大家在前端开发中都使用过很多前端脚手架,如vue-cli,create-vite,create-vue等:本篇文章将会为大家详细介绍这些前端脚手架是如何实现的,并且从零实现一个create-kit ...

  8. C#中的装箱和拆箱

    什么是装箱和拆箱 装箱(boxing)和拆箱(unboxing)是C#类型系统的核心概念.是不同于C与C++的新概念!,通过装箱和拆箱操作,能够在值类型和引用类型中架起一做桥梁. 换言之,可以轻松的实 ...

  9. Linux--多线程(一)

    线程 线程的概念 线程: 线程是OS能够进行运算调度的基本单位.线程是一个进程中的一个单一执行流,通俗地说,一个程序里的一个执行路线就叫做线程. 可以知道的是,一个进程至少有一个执行线程,这个线程就是 ...

  10. CSS基础知识筑基

    01.CSS 简介 CSS 指层叠样式表 (Cascading Style Sheets),对HTML网页内容进行统一外观样式设计和管理,给网页进行各种装饰,让她变得美观,是HTML的化妆师.(Cas ...