Access多条SQL语句可不可以同时执行?

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Access多条SQL语句可不可以同时执行?相关的知识,希望对你有一定的参考价值。

1. 我对某字段的日期更新分两步的。首先将年份全部更新到系统年份。UPDATE
Policy SET
LatestDueDate=Year(Date())&'-'&Format(PolicyDate,'mm-dd');第二步是进一步更新, UPDATE Policy SET LatestDueDate= DateAdd('yyyy',1,LatestDueDate)
WHERE (((Month(Date())-Month(LatestDueDate)) > 6) and(PaymentMode='H')) 主要是我不会把这两条语句合并,所以就一步步来了。
我想知道可不可以在SQL中同时写这两条语句,然后ACCESS按顺序分条执行?我听说Oracle里用分号间隔每条语句,是会从上到下按顺序执行一遍的。access中可以吗?如果不可以,有没有其他方法可以做到?
因为我的日期更新其实是客户的缴费提醒。日期更新又分不同的缴费方式的,每种缴费方式里至少又分3种情况,这样的话,我就会有很多很多查询列表。崩溃啊!
2. access中的查询(SQL是update语句),每次一点击,就会弹出对话框询问是否更新不小心点了"是“的话,就会又执行一遍,把原本更新好的日期又弄乱了。有方法解决这个问题吗?
感谢!!

使用ACCESS查询对象是无法一次运行多个SQL语句的,但是通过ACCESS VBA代码可以实现一次运行多个SQL语句。下面是具体实现方案;


1)新建一个ACCESS窗体,窗体添加一个命令按钮;


2)编写按钮单击事件过程

Private Sub Command1_Click()
Dim strSql as string
strSQL="Update Policy SET LatestDueDate=Year(Date()) & '-' & Format(PolicyDate,'mm-dd')" 
DoCmd.RunSql strSQL  '运行第一个更新语句
strSQL="UPDATE Policy SET LatestDueDate= DateAdd('yyyy',1,LatestDueDate) WHERE (((Month(Date())-Month(LatestDueDate)) > 6) and(PaymentMode='H'))" 
DoCmd.RunSql strSQL  '运行第二个更新语句 
End Sub

 

跟着点击该命令按钮就可以一次执行两条语句了。


*******不过这里必须指出楼主这种通过UPDATE更新来获取缴费提醒的办法绝对是一种非常糟糕的解决方案,其坏处除了你说的,我可以指出N多条!具体就不说了。******


其实要获取你要获取保单续期提醒日期,无需分两步只要一句SELECT语句就能搞定,完全没必要去更新数据表。


将下列SQL语句保存为一个名为“RenewAlertPolicies的选择查询

select PolicyNo,PolicyDate,DateAdd('yyyy',1,PolicyDueDate) as LatestDueDate 
from Policy where DateDiff('m',PolicyDate, Date()) > 6 order by PolicyDate desc;

注意:上面“保单号”字段名是我虚构的,请替换为实际的保单号字段名。如果不想看太旧的保单,筛选可以用时间段来限制,例如...where DateDiff('m',PolicyDate, Date()) between 7 and 12 ....


当你要查看需要提示续保的保单列表时,简单地双击该查询就好了,你可以随要随查,非常方便,查询结果将会展示最新的情况,完全没必要去考虑如何更新LatestDueDate的问题。

来自:求助得到的回答
参考技术A Access中,如果你是独立的多条语句,是没有办法一起执行的
如果你是一条语句里面包含多个操作,还是可以的

Access本身就是一个非常小的数据库,不能和其他中、大型数据库比的

如何使用 Java 执行多条 SQL 语句?

【中文标题】如何使用 Java 执行多条 SQL 语句?【英文标题】:How to execute multiple SQL statement using Java? 【发布时间】:2014-04-04 22:29:33 【问题描述】:

我有一个批处理程序,我使用 JDBC 来调用数据库。 我正在以 'ID' 作为主键以 100 个批次发送信息。

我想对数据库进行一次调用,然后在关闭连接之前执行多个 SQL 语句。

我发布部分代码供参考

        //  Database credentials
        String USER = username;
        String PASS = password;

        Connection connec = null;
        Statement stmt = null;

        //STEP 2: Register JDBC driver
        Class.forName("com.mysql.jdbc.Driver");

        //STEP 3: Open a connection
        System.out.println("Connecting to a selected database...");
        connec = DriverManager.getConnection(DB_URL, USER, PASS);
        System.out.println("Connected database successfully...");

        //STEP 4: Execute a query
        System.out.println("Creating statement...");
        stmt = connec.createStatement();

        // Step 2: To update the database with the new count and the netppe values.

        // Step to know whether the ID is present or not in the database
        for(int i=0;i<identities.length;i++)
        String booleanString = "SELECT 1 FROM cgm_counters WHERE id = "+identities[i];

stmt.execute(booleanString);  
        ResultSet resultSet = stmt.getResultSet(); //result set for records  
        boolean recordFound = resultSet.next(); 
        ResultSet rs = null;
// Retrieve the 'netppe' information.
        if(recordFound)

            String sql =  "SELECT * FROM cgm_counters WHERE id="+identities[i];
            rs = stmt.executeQuery(sql);
            while(rs.next())
                 //Retrieve by column name
                 double net_ppe  = rs.getDouble("spend");
                 System.out.println("The value of the netppe :"+net_ppe);
            

// end of 'If' statement

我想为 for 循环中的每个 ID 一次性做三件事。

1 > I want to see whether the ID is present or not in the database
2 > If ID - present
 
2 a > retrieve the 'netppe' information for that particular ID
2 b > retrieve the 'count' information for that same ID
2 c> Update the database with the new 'netppe' and 'count' value for the same ID
 else 
Insert the information for the new ID

如何在不关闭每个ID的连接的情况下执行所有语句? JDBC 和 SQL 的新手。任何帮助表示赞赏。

【问题讨论】:

为什么需要关闭每个 id 的连接?你不是已经有不关闭连接的代码吗? @eis 删除了 'rs.close()' 语句,如果我不关闭连接并执行多个语句,相同的步骤是否有效? @user3188390 关闭结果集与关闭数据库连接有何关系? 【参考方案1】:

好的,你的代码有很多问题。首先,

//STEP 2: Register JDBC driver
Class.forName("com.mysql.jdbc.Driver");

您必须传递驱动程序实现,而不是接口本身;但好消息是,从 JDBC 4.0 开始,此代码是不必要的。它已经扫描了你的类路径来为你找到驱动程序。

其次,您的连接不会因每个查询而关闭。您的代码中没有任何地方可以调用connec.close()。 JDBC 也不会为你关闭连接。

第三,您不需要使用嵌套的 for 循环来执行此操作!这是一个可怕的想法。您对 SQL 查询和 JDBC 的概念需要一些改进。您可以简单地执行以下操作:

for(int i=0;i<identities.length;i++) 
    String sql =  "SELECT * FROM cgm_counters WHERE id="+identities[i];
    ResultSet rs = stmt.executeQuery(sql);
    while(rs.next())
        //Retrieve by column name
        double net_ppe  = rs.getDouble("spend");
        System.out.println("The value of the netppe :"+net_ppe);
    

最好是批量查询。

String batch = "(";
for (int i = 0; i < identities.length;i++) 
    if (i < identities.length() - 1) 
        batch += "?, ";
    else 
        batch += "?)"


String sql =  "SELECT * FROM cgm_counters WHERE id in " + batch;
ResultSet rs = stmt.executeQuery(sql);
while(rs.next()) 
    double net_ppe  = rs.getDouble("spend");
    System.out.println("The value of the netppe :"+net_ppe);

您似乎正在进行初步查询以“检查”每个 ID 是否在表中,但这不是必需的。如果 ID 不在表中,那么您将得到一个空的结果集作为回报。空结果集没有任何问题。在这种情况下,您的 while 循环将永远不会运行,因为 rs.next() 将返回 false。您也可以通过调用rs.first() 来检查它是否为空。这种方式不会移动光标。

【讨论】:

我会实施然后标记,感谢您的建议和帮助。希望如果我确实有一些问题,我会在需要时得到帮助。

以上是关于Access多条SQL语句可不可以同时执行?的主要内容,如果未能解决你的问题,请参考以下文章

如何多条SQL语句执行?

oracle执行多条语句

如何将几条sql语句一起执行

为啥在oracle数据库中多条查询语句无法同时进行

如何在Oracle中一次执行多条sql语句

mysql怎么一次执行多条SQL语句