【问题标题】:How do stored procedures get explicitly executed upon end user input存储过程如何在最终用户输入时显式执行
【发布时间】:2021-09-06 11:00:45
【问题描述】:

我正在编写一个 java 文件,该文件通过接受用户输入来创建用户名,然后将该用户名存储在 Microsoft SQL Server 数据库中。我的 SQL 家伙编写了许多存储过程来完成大部分繁重的工作,包括一个接受用户名并将其存储在数据库中的存储过程。我很难弄清楚我在哪里放置什么代码,特别是当我试图通过我正在做的事情逻辑思考我的方式时。我的示例代码如下:

import java.sql.*;
import javax.swing.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;

public class CreateUsername {
    public JFrame f = new JFrame("Account Login");
    public JButton Submit = new JButton("Submit");
    public JTextField user = new JTextField(30);

    public CreateUsername() {

        f.setSize(400, 400);
        f.add(Submit);
        f.add(user);
        f.setLayout(null);
        f.setVisible(true);
        Submit.setBounds(50, 100, 195, 30);
        user.setBounds(50, 130, 195, 30);
        Submit.addActionListener(new ActionListener() {
            @Override
            public void actionPerformed(ActionEvent e) {
                //closes the create username window when clicking submit

                f.dispose();

            }

            public static void main(String[] args) throws Exception {

                Class.forName(com.sqlserver.jdbc.Driver());
                Connection con = DriverManager.getConnection(""); // insert database connection info between quotes
                 
                String sql_string = "CREATE PROCEDURE [dbo].[CreateUser] (\n" +
                        "\t@UserName varchar(30),\n" +
                        "\t@UserID int OUTPUT)\n" +
                        "AS\n" +
                        "\n" +
                        "DECLARE\t  @return_value int\n" +
                        "\n" +
                        "\n" +
                        "INSERT INTO [dbo].[User]\n" +
                        "           ([UserName])\n" +
                        "     VALUES\n" +
                        "           (@UserName)\n" +
                        "\n" +
                        "SELECT\t@UserID = SCOPE_IDENTITY()\n" +
                        "go";

                CallableStatement cs = con.prepareCall(sql_string);

                cs.execute();

显然代码不完整,但是当您查看代码时,一些问题会变得清晰。我主要关心的是处理连接到数据库的代码行的格式(我已经看到了一些如何做到这一点的示例,它们都略有不同,所以我很困惑)。此外,我一生无法弄清楚如何将可调用语句(存储过程)“附加”到适当的位置(也就是在按下提交按钮后,存储过程执行)。我有一个用户界面,我有一个存储过程,我想在用户输入他们的用户名并单击提交后执行它,但我不知道该怎么做。

我觉得我已经用尽了关于这个主题的谷歌搜索(这告诉我,我对某事的理解可能存在更根本的错误)。任何帮助将非常感激。同样,这段代码不会按原样编译,我知道这一点,我只需要如何继续的帮助。

提前谢谢你!

【问题讨论】:

  • 存储过程需要在您的数据库中创建(与您的应用程序分开),然后您调用带有参数的存储过程并返回结果。 GO 无论如何都不是命令,它是 SSMS 和 sqlcmd 中使用的批处理分隔符
  • 是的,所有这些都是在数据库中创建的存储过程,通过intellij连接到所述数据库从数据库中检索。我在安排正确的语法来调用存储过程时遇到问题,我的代码是按原样排列的,因为这是我从多个示例/教程和数小时的谷歌搜索中得出的最好的结果。我知道我需要使用参数调用存储过程,但我的问题是我想了解,实际上,所有代码在做什么(我了解一些但不是全部,例如:Class.forName(com.sqlserver.jdbc.驱动程序());
  • 我也看到有人使用 DriverManager.registerDriver(com.sqlserver.jdbc.Driver());而且我真的不明白其中任何一个的作用,如果需要它们,以及在我的情况下需要哪一个。谷歌搜索似乎没有帮助,因为解释对初学者不太友好。

标签: java sql-server stored-procedures


【解决方案1】:

首先,如果您的程序的唯一目的是将用户名插入数据库,我可能会放弃整个 AWT 的东西,而只使用完全基于控制台的应用程序方法,因为其他一切都是(在我看来) 有点矫枉过正。使用 ScannerSystem.out.print / System.out.println - 它不仅更容易开发,而且比一般的 GUI 编程更直接。

main 方法是程序的入口点。使用基于 AWT 的方法时,将某些内容插入数据库的代码不属于那里。主类实际上应该创建您的 GUI 的一个实例,而其他一切都由您创建的类中的方法处理。我个人主要开发后端 Java 或 JSF 前端,因此我对 AWT 或 Java GUI 编程一般不太熟悉,但在这方面我对 C# 有丰富的经验。

一个非常简单的方法是这样的:

  1. 显示图形用户界面
  2. 单击提交按钮时(请参阅:How to Write an Action Listener),验证输入,如果有效,则创建数据库连接的新实例,放弃存储过程并使用带有PreparedStatements + 参数绑定的普通 SQL(以避免SQL injection) - 特别是对于初学者,我认为学习基本的 SQL 以及如何正确使用它很重要!

在一些极其简化且不太抽象的伪代码中:

main(args)
{
GUI gui = new GUI();
gui.show();
}

actionPerformed(Event)
{
Database db = estabilishDatabaseConnection();
Statement stmt = db.prepareStatement("INSERT INTO USERS (name) VALUES (:name)");
stmt.bindParameter("name",userInput.getValue();
stmt.execute();
}

而基于控制台的方法看起来像:

main(args)
{
print("Username: ")
username = readInput();
// from here: basically the same as the actionPerformed in the first example
}

但是,我认为最好的方法是将您的问题分成更小的子问题并单独解决:例如("how to connect to a database", "how to create a prepared statement", "how to bind a parameter to a prepared statement", "how to execute a method when button is clicked", "what is a class", "what is a constructor", "why do I have to close connections", "how to retrieve a value from a text input", "how to use try with resources", ...)

祝你旅途愉快!

【讨论】:

  • 感谢您周到详细的回复。我已经与我的 sql 专家(和应用程序开发负责人)一起检查了您的回复,他说我们需要使用 GUI,因此在这种情况下控制台方法不起作用。但是,您的其余答案对于解释我的部分代码需要去哪里非常有用。我知道 java 文件的基本结构,老实说,我现在认为我认为存储过程会进入 main 方法让我觉得很傻。我会尝试一些你建议的子问题搜索,因为其中一些看起来对我特别有用。谢谢!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2013-08-14
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-09-26
  • 1970-01-01
相关资源
最近更新 更多